Skip to content

Commit d16adac

Browse files
authored
fix: create tree of dir content types (#431)
* fix(apk): create tree of dir types Signed-off-by: Carlos A Becker <caarlos0@gmail.com> * fix: create tree of dir contents Signed-off-by: Carlos A Becker <caarlos0@gmail.com> * test: fixes Signed-off-by: Carlos A Becker <caarlos0@gmail.com>
1 parent ebe9ddf commit d16adac

File tree

9 files changed

+131
-11
lines changed

9 files changed

+131
-11
lines changed

apk/apk.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,10 @@ func createFilesInsideTarGz(info *nfpm.Info, tw *tar.Writer, created map[string]
414414
continue
415415
}
416416

417+
if err := createTree(tw, file.Destination, created); err != nil {
418+
return err
419+
}
420+
417421
normalizedName := normalizePath(strings.Trim(file.Destination, "/")) + "/"
418422

419423
if created[normalizedName] {

apk/apk_test.go

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func TestCreateBuilderData(t *testing.T) {
100100

101101
require.NoError(t, builderData(tw))
102102

103-
require.Equal(t, 12288, buf.Len())
103+
require.Equal(t, 11784, buf.Len())
104104
}
105105

106106
func TestCombineToApk(t *testing.T) {
@@ -509,6 +509,10 @@ func TestDirectories(t *testing.T) {
509509
Destination: "/etc/baz",
510510
Type: "dir",
511511
},
512+
{
513+
Destination: "/usr/lib/something/somethingelse",
514+
Type: "dir",
515+
},
512516
}
513517

514518
require.NoError(t, info.Validate())
@@ -518,20 +522,29 @@ func TestDirectories(t *testing.T) {
518522
err := createFilesInsideTarGz(info, tar.NewWriter(&buf), make(map[string]bool), &size)
519523
require.NoError(t, err)
520524

525+
require.Equal(t, []string{
526+
"etc/",
527+
"etc/bar/",
528+
"etc/baz/",
529+
"usr/",
530+
"usr/lib/",
531+
"usr/lib/something/",
532+
"usr/lib/something/somethingelse/",
533+
"etc/bar/file",
534+
"etc/foo/",
535+
"etc/foo/file",
536+
}, getTree(t, buf.Bytes()))
537+
521538
// for apks all implicit or explicit directories are created in the tarball
522539
h := extractFileHeaderFromTar(t, buf.Bytes(), "/etc")
523-
require.NoError(t, err)
524540
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
525541
h = extractFileHeaderFromTar(t, buf.Bytes(), "/etc/foo")
526-
require.NoError(t, err)
527542
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
528543
h = extractFileHeaderFromTar(t, buf.Bytes(), "/etc/bar")
529-
require.NoError(t, err)
530544
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
531545
require.Equal(t, h.Mode, int64(0o700))
532546
require.Equal(t, h.Uname, "test")
533547
h = extractFileHeaderFromTar(t, buf.Bytes(), "/etc/baz")
534-
require.NoError(t, err)
535548
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
536549
}
537550

@@ -669,6 +682,24 @@ func extractFileHeaderFromTar(tb testing.TB, tarFile []byte, filename string) *t
669682
return nil
670683
}
671684

685+
func getTree(tb testing.TB, tarFile []byte) []string {
686+
tb.Helper()
687+
688+
var result []string
689+
tr := tar.NewReader(bytes.NewReader(tarFile))
690+
for {
691+
hdr, err := tr.Next()
692+
if errors.Is(err, io.EOF) {
693+
break // End of archive
694+
}
695+
require.NoError(tb, err)
696+
697+
result = append(result, hdr.Name)
698+
}
699+
700+
return result
701+
}
702+
672703
func TestArches(t *testing.T) {
673704
for k := range archToAlpine {
674705
t.Run(k, func(t *testing.T) {

deb/deb.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ func createFilesInsideDataTar(info *nfpm.Info, tw *tar.Writer,
280280
continue
281281
}
282282

283+
if err := createTree(tw, file.Destination, created); err != nil {
284+
return md5buf, 0, err
285+
}
286+
283287
normalizedName := normalizePath(strings.Trim(file.Destination, "/")) + "/"
284288

285289
if created[normalizedName] {
@@ -316,7 +320,7 @@ func createFilesInsideDataTar(info *nfpm.Info, tw *tar.Writer,
316320
var size int64 // declare early to avoid shadowing err
317321
switch file.Type {
318322
case "ghost":
319-
// skip ghost files in apk
323+
// skip ghost files in deb
320324
continue
321325
case "dir":
322326
// already handled above

deb/deb_test.go

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,10 @@ func TestDirectories(t *testing.T) {
806806
Destination: "/etc/baz",
807807
Type: "dir",
808808
},
809+
{
810+
Destination: "/usr/lib/something/somethingelse",
811+
Type: "dir",
812+
},
809813
}
810814

811815
require.NoError(t, info.Validate())
@@ -814,20 +818,38 @@ func TestDirectories(t *testing.T) {
814818
require.NoError(t, err)
815819
dataTarball := inflate(t, dataTarballName, deflatedDataTarball)
816820

821+
require.Equal(t, []string{
822+
"./etc/",
823+
"./etc/bar/",
824+
"./etc/baz/",
825+
"./usr/",
826+
"./usr/lib/",
827+
"./usr/lib/something/",
828+
"./usr/lib/something/somethingelse/",
829+
"./etc/bar/file",
830+
"./etc/foo/",
831+
"./etc/foo/file",
832+
}, getTree(t, dataTarball))
833+
817834
// for debs all implicit or explicit directories are created in the tarball
818835
h := extractFileHeaderFromTar(t, dataTarball, "/etc")
819-
require.NoError(t, err)
820836
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
821837
h = extractFileHeaderFromTar(t, dataTarball, "/etc/foo")
822-
require.NoError(t, err)
823838
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
824839
h = extractFileHeaderFromTar(t, dataTarball, "/etc/bar")
825-
require.NoError(t, err)
826840
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
827841
require.Equal(t, h.Mode, int64(0o700))
828842
require.Equal(t, h.Uname, "test")
829843
h = extractFileHeaderFromTar(t, dataTarball, "/etc/baz")
830-
require.NoError(t, err)
844+
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
845+
846+
h = extractFileHeaderFromTar(t, dataTarball, "/usr")
847+
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
848+
h = extractFileHeaderFromTar(t, dataTarball, "/usr/lib")
849+
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
850+
h = extractFileHeaderFromTar(t, dataTarball, "/usr/lib/something")
851+
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
852+
h = extractFileHeaderFromTar(t, dataTarball, "/usr/lib/something/somethingelse")
831853
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
832854
}
833855

@@ -1103,6 +1125,24 @@ func tarContents(tb testing.TB, tarFile []byte) []string {
11031125
return contents
11041126
}
11051127

1128+
func getTree(tb testing.TB, tarFile []byte) []string {
1129+
tb.Helper()
1130+
1131+
var result []string
1132+
tr := tar.NewReader(bytes.NewReader(tarFile))
1133+
for {
1134+
hdr, err := tr.Next()
1135+
if errors.Is(err, io.EOF) {
1136+
break // End of archive
1137+
}
1138+
require.NoError(tb, err)
1139+
1140+
result = append(result, hdr.Name)
1141+
}
1142+
1143+
return result
1144+
}
1145+
11061146
func extractFileHeaderFromTar(tb testing.TB, tarFile []byte, filename string) *tar.Header {
11071147
tb.Helper()
11081148

rpm/rpm_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,12 +806,24 @@ func TestDirectories(t *testing.T) {
806806
Mode: 0o700,
807807
},
808808
},
809+
{
810+
Destination: "/usr/lib/something/somethingelse",
811+
Type: "dir",
812+
},
809813
}
810814

811815
var rpmFileBuffer bytes.Buffer
812816
err := Default.Package(info, &rpmFileBuffer)
813817
require.NoError(t, err)
814818

819+
require.Equal(t, []string{
820+
"/etc/bar",
821+
"/etc/bar/file",
822+
"/etc/baz",
823+
"/etc/foo/file",
824+
"/usr/lib/something/somethingelse",
825+
}, getTree(t, rpmFileBuffer.Bytes()))
826+
815827
// the directory /etc/foo should not be implicitly created as that
816828
// implies ownership of /etc/foo which should always be implicit
817829
_, err = extractFileHeaderFromRpm(rpmFileBuffer.Bytes(), "/etc/foo")
@@ -871,6 +883,27 @@ func extraFileInfoSliceFromRpm(rpm []byte) ([]rpmutils.FileInfo, error) {
871883
return rpmFile.Header.GetFiles()
872884
}
873885

886+
func getTree(tb testing.TB, rpm []byte) []string {
887+
tb.Helper()
888+
889+
rpmFile, err := rpmutils.ReadRpm(bytes.NewReader(rpm))
890+
require.NoError(tb, err)
891+
pr, err := rpmFile.PayloadReader()
892+
require.NoError(tb, err)
893+
894+
var tree []string
895+
for {
896+
hdr, err := pr.Next()
897+
if errors.Is(err, io.EOF) {
898+
break // End of archive
899+
}
900+
require.NoError(tb, err)
901+
tree = append(tree, hdr.Filename())
902+
}
903+
904+
return tree
905+
}
906+
874907
func extractFileHeaderFromRpm(rpm []byte, filename string) (*cpio.Cpio_newc_header, error) {
875908
rpmFile, err := rpmutils.ReadRpm(bytes.NewReader(rpm))
876909
if err != nil {

testdata/acceptance/apk.dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ RUN test -f /usr/share/whatever/folder/folder2/file1
4747
RUN test -f /usr/share/whatever/folder/folder2/file2
4848
RUN test -d /var/log/whatever
4949
RUN test -d /usr/share/foo
50+
RUN test -d /usr/foo/bar/something
5051
RUN test $(stat -c %a /usr/sbin/fake) -eq 4755
5152
RUN test -f /tmp/preinstall-proof
5253
RUN test -f /tmp/postinstall-proof
@@ -61,6 +62,7 @@ RUN test -f /tmp/preremove-proof
6162
RUN test -f /tmp/postremove-proof
6263
RUN test ! -d /var/log/whatever
6364
RUN test ! -d /usr/share/foo
65+
RUN test ! -d /usr/foo/bar/something
6466

6567

6668
# ---- signed test ----

testdata/acceptance/core.complex.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ contents:
3131
dst: /usr/sbin/fake
3232
file_info:
3333
mode: 04755
34+
- dst: /usr/foo/bar/something
35+
type: dir
3436
empty_folders:
3537
- /var/log/whatever
3638
- /usr/share/foo
@@ -46,4 +48,4 @@ rpm:
4648
apk:
4749
scripts:
4850
preupgrade: ./testdata/acceptance/scripts/preupgrade.sh
49-
postupgrade: ./testdata/acceptance/scripts/postupgrade.sh
51+
postupgrade: ./testdata/acceptance/scripts/postupgrade.sh

testdata/acceptance/deb.dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ RUN test -f /usr/share/whatever/folder/folder2/file1
5050
RUN test -f /usr/share/whatever/folder/folder2/file2
5151
RUN test -d /var/log/whatever
5252
RUN test -d /usr/share/foo
53+
RUN test -d /usr/foo/bar/something
5354
RUN test $(stat -c %a /usr/sbin/fake) -eq 4755
5455
RUN test -f /tmp/preinstall-proof
5556
RUN test -f /tmp/postinstall-proof
@@ -64,6 +65,7 @@ RUN test -f /tmp/preremove-proof
6465
RUN test -f /tmp/postremove-proof
6566
RUN test ! -d /var/log/whatever
6667
RUN test ! -d /usr/share/foo
68+
RUN test ! -d /usr/foo/bar/something
6769

6870
# ---- signed test ----
6971
FROM test_base AS signed

testdata/acceptance/rpm.dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ RUN test -f /usr/share/whatever/folder/folder2/file1
4949
RUN test -f /usr/share/whatever/folder/folder2/file2
5050
RUN test -d /var/log/whatever
5151
RUN test -d /usr/share/foo
52+
RUN test -d /usr/foo/bar/something
5253
RUN test $(stat -c %a /usr/sbin/fake) -eq 4755
5354
RUN test -f /tmp/preinstall-proof
5455
RUN test -f /tmp/postinstall-proof
@@ -65,6 +66,7 @@ RUN test -f /tmp/preremove-proof
6566
RUN test -f /tmp/postremove-proof
6667
RUN test ! -d /var/log/whatever
6768
RUN test ! -d /usr/share/foo
69+
RUN test ! -d /usr/foo/bar/something
6870

6971

7072
# ---- signed test ----

0 commit comments

Comments
 (0)