mirror of
https://github.com/goreleaser/nfpm
synced 2024-03-28 10:19:56 +01:00
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>
This commit is contained in:
parent
ebe9ddfb6f
commit
d16adac8c3
|
@ -414,6 +414,10 @@ func createFilesInsideTarGz(info *nfpm.Info, tw *tar.Writer, created map[string]
|
|||
continue
|
||||
}
|
||||
|
||||
if err := createTree(tw, file.Destination, created); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
normalizedName := normalizePath(strings.Trim(file.Destination, "/")) + "/"
|
||||
|
||||
if created[normalizedName] {
|
||||
|
|
|
@ -100,7 +100,7 @@ func TestCreateBuilderData(t *testing.T) {
|
|||
|
||||
require.NoError(t, builderData(tw))
|
||||
|
||||
require.Equal(t, 12288, buf.Len())
|
||||
require.Equal(t, 11784, buf.Len())
|
||||
}
|
||||
|
||||
func TestCombineToApk(t *testing.T) {
|
||||
|
@ -509,6 +509,10 @@ func TestDirectories(t *testing.T) {
|
|||
Destination: "/etc/baz",
|
||||
Type: "dir",
|
||||
},
|
||||
{
|
||||
Destination: "/usr/lib/something/somethingelse",
|
||||
Type: "dir",
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, info.Validate())
|
||||
|
@ -518,20 +522,29 @@ func TestDirectories(t *testing.T) {
|
|||
err := createFilesInsideTarGz(info, tar.NewWriter(&buf), make(map[string]bool), &size)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, []string{
|
||||
"etc/",
|
||||
"etc/bar/",
|
||||
"etc/baz/",
|
||||
"usr/",
|
||||
"usr/lib/",
|
||||
"usr/lib/something/",
|
||||
"usr/lib/something/somethingelse/",
|
||||
"etc/bar/file",
|
||||
"etc/foo/",
|
||||
"etc/foo/file",
|
||||
}, getTree(t, buf.Bytes()))
|
||||
|
||||
// for apks all implicit or explicit directories are created in the tarball
|
||||
h := extractFileHeaderFromTar(t, buf.Bytes(), "/etc")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
h = extractFileHeaderFromTar(t, buf.Bytes(), "/etc/foo")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
h = extractFileHeaderFromTar(t, buf.Bytes(), "/etc/bar")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
require.Equal(t, h.Mode, int64(0o700))
|
||||
require.Equal(t, h.Uname, "test")
|
||||
h = extractFileHeaderFromTar(t, buf.Bytes(), "/etc/baz")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
}
|
||||
|
||||
|
@ -669,6 +682,24 @@ func extractFileHeaderFromTar(tb testing.TB, tarFile []byte, filename string) *t
|
|||
return nil
|
||||
}
|
||||
|
||||
func getTree(tb testing.TB, tarFile []byte) []string {
|
||||
tb.Helper()
|
||||
|
||||
var result []string
|
||||
tr := tar.NewReader(bytes.NewReader(tarFile))
|
||||
for {
|
||||
hdr, err := tr.Next()
|
||||
if errors.Is(err, io.EOF) {
|
||||
break // End of archive
|
||||
}
|
||||
require.NoError(tb, err)
|
||||
|
||||
result = append(result, hdr.Name)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func TestArches(t *testing.T) {
|
||||
for k := range archToAlpine {
|
||||
t.Run(k, func(t *testing.T) {
|
||||
|
|
|
@ -280,6 +280,10 @@ func createFilesInsideDataTar(info *nfpm.Info, tw *tar.Writer,
|
|||
continue
|
||||
}
|
||||
|
||||
if err := createTree(tw, file.Destination, created); err != nil {
|
||||
return md5buf, 0, err
|
||||
}
|
||||
|
||||
normalizedName := normalizePath(strings.Trim(file.Destination, "/")) + "/"
|
||||
|
||||
if created[normalizedName] {
|
||||
|
@ -316,7 +320,7 @@ func createFilesInsideDataTar(info *nfpm.Info, tw *tar.Writer,
|
|||
var size int64 // declare early to avoid shadowing err
|
||||
switch file.Type {
|
||||
case "ghost":
|
||||
// skip ghost files in apk
|
||||
// skip ghost files in deb
|
||||
continue
|
||||
case "dir":
|
||||
// already handled above
|
||||
|
|
|
@ -806,6 +806,10 @@ func TestDirectories(t *testing.T) {
|
|||
Destination: "/etc/baz",
|
||||
Type: "dir",
|
||||
},
|
||||
{
|
||||
Destination: "/usr/lib/something/somethingelse",
|
||||
Type: "dir",
|
||||
},
|
||||
}
|
||||
|
||||
require.NoError(t, info.Validate())
|
||||
|
@ -814,20 +818,38 @@ func TestDirectories(t *testing.T) {
|
|||
require.NoError(t, err)
|
||||
dataTarball := inflate(t, dataTarballName, deflatedDataTarball)
|
||||
|
||||
require.Equal(t, []string{
|
||||
"./etc/",
|
||||
"./etc/bar/",
|
||||
"./etc/baz/",
|
||||
"./usr/",
|
||||
"./usr/lib/",
|
||||
"./usr/lib/something/",
|
||||
"./usr/lib/something/somethingelse/",
|
||||
"./etc/bar/file",
|
||||
"./etc/foo/",
|
||||
"./etc/foo/file",
|
||||
}, getTree(t, dataTarball))
|
||||
|
||||
// for debs all implicit or explicit directories are created in the tarball
|
||||
h := extractFileHeaderFromTar(t, dataTarball, "/etc")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
h = extractFileHeaderFromTar(t, dataTarball, "/etc/foo")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
h = extractFileHeaderFromTar(t, dataTarball, "/etc/bar")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
require.Equal(t, h.Mode, int64(0o700))
|
||||
require.Equal(t, h.Uname, "test")
|
||||
h = extractFileHeaderFromTar(t, dataTarball, "/etc/baz")
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
|
||||
h = extractFileHeaderFromTar(t, dataTarball, "/usr")
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
h = extractFileHeaderFromTar(t, dataTarball, "/usr/lib")
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
h = extractFileHeaderFromTar(t, dataTarball, "/usr/lib/something")
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
h = extractFileHeaderFromTar(t, dataTarball, "/usr/lib/something/somethingelse")
|
||||
require.Equal(t, h.Typeflag, byte(tar.TypeDir))
|
||||
}
|
||||
|
||||
|
@ -1103,6 +1125,24 @@ func tarContents(tb testing.TB, tarFile []byte) []string {
|
|||
return contents
|
||||
}
|
||||
|
||||
func getTree(tb testing.TB, tarFile []byte) []string {
|
||||
tb.Helper()
|
||||
|
||||
var result []string
|
||||
tr := tar.NewReader(bytes.NewReader(tarFile))
|
||||
for {
|
||||
hdr, err := tr.Next()
|
||||
if errors.Is(err, io.EOF) {
|
||||
break // End of archive
|
||||
}
|
||||
require.NoError(tb, err)
|
||||
|
||||
result = append(result, hdr.Name)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func extractFileHeaderFromTar(tb testing.TB, tarFile []byte, filename string) *tar.Header {
|
||||
tb.Helper()
|
||||
|
||||
|
|
|
@ -806,12 +806,24 @@ func TestDirectories(t *testing.T) {
|
|||
Mode: 0o700,
|
||||
},
|
||||
},
|
||||
{
|
||||
Destination: "/usr/lib/something/somethingelse",
|
||||
Type: "dir",
|
||||
},
|
||||
}
|
||||
|
||||
var rpmFileBuffer bytes.Buffer
|
||||
err := Default.Package(info, &rpmFileBuffer)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, []string{
|
||||
"/etc/bar",
|
||||
"/etc/bar/file",
|
||||
"/etc/baz",
|
||||
"/etc/foo/file",
|
||||
"/usr/lib/something/somethingelse",
|
||||
}, getTree(t, rpmFileBuffer.Bytes()))
|
||||
|
||||
// the directory /etc/foo should not be implicitly created as that
|
||||
// implies ownership of /etc/foo which should always be implicit
|
||||
_, err = extractFileHeaderFromRpm(rpmFileBuffer.Bytes(), "/etc/foo")
|
||||
|
@ -871,6 +883,27 @@ func extraFileInfoSliceFromRpm(rpm []byte) ([]rpmutils.FileInfo, error) {
|
|||
return rpmFile.Header.GetFiles()
|
||||
}
|
||||
|
||||
func getTree(tb testing.TB, rpm []byte) []string {
|
||||
tb.Helper()
|
||||
|
||||
rpmFile, err := rpmutils.ReadRpm(bytes.NewReader(rpm))
|
||||
require.NoError(tb, err)
|
||||
pr, err := rpmFile.PayloadReader()
|
||||
require.NoError(tb, err)
|
||||
|
||||
var tree []string
|
||||
for {
|
||||
hdr, err := pr.Next()
|
||||
if errors.Is(err, io.EOF) {
|
||||
break // End of archive
|
||||
}
|
||||
require.NoError(tb, err)
|
||||
tree = append(tree, hdr.Filename())
|
||||
}
|
||||
|
||||
return tree
|
||||
}
|
||||
|
||||
func extractFileHeaderFromRpm(rpm []byte, filename string) (*cpio.Cpio_newc_header, error) {
|
||||
rpmFile, err := rpmutils.ReadRpm(bytes.NewReader(rpm))
|
||||
if err != nil {
|
||||
|
|
|
@ -47,6 +47,7 @@ RUN test -f /usr/share/whatever/folder/folder2/file1
|
|||
RUN test -f /usr/share/whatever/folder/folder2/file2
|
||||
RUN test -d /var/log/whatever
|
||||
RUN test -d /usr/share/foo
|
||||
RUN test -d /usr/foo/bar/something
|
||||
RUN test $(stat -c %a /usr/sbin/fake) -eq 4755
|
||||
RUN test -f /tmp/preinstall-proof
|
||||
RUN test -f /tmp/postinstall-proof
|
||||
|
@ -61,6 +62,7 @@ RUN test -f /tmp/preremove-proof
|
|||
RUN test -f /tmp/postremove-proof
|
||||
RUN test ! -d /var/log/whatever
|
||||
RUN test ! -d /usr/share/foo
|
||||
RUN test ! -d /usr/foo/bar/something
|
||||
|
||||
|
||||
# ---- signed test ----
|
||||
|
|
|
@ -31,6 +31,8 @@ contents:
|
|||
dst: /usr/sbin/fake
|
||||
file_info:
|
||||
mode: 04755
|
||||
- dst: /usr/foo/bar/something
|
||||
type: dir
|
||||
empty_folders:
|
||||
- /var/log/whatever
|
||||
- /usr/share/foo
|
||||
|
@ -46,4 +48,4 @@ rpm:
|
|||
apk:
|
||||
scripts:
|
||||
preupgrade: ./testdata/acceptance/scripts/preupgrade.sh
|
||||
postupgrade: ./testdata/acceptance/scripts/postupgrade.sh
|
||||
postupgrade: ./testdata/acceptance/scripts/postupgrade.sh
|
||||
|
|
|
@ -50,6 +50,7 @@ RUN test -f /usr/share/whatever/folder/folder2/file1
|
|||
RUN test -f /usr/share/whatever/folder/folder2/file2
|
||||
RUN test -d /var/log/whatever
|
||||
RUN test -d /usr/share/foo
|
||||
RUN test -d /usr/foo/bar/something
|
||||
RUN test $(stat -c %a /usr/sbin/fake) -eq 4755
|
||||
RUN test -f /tmp/preinstall-proof
|
||||
RUN test -f /tmp/postinstall-proof
|
||||
|
@ -64,6 +65,7 @@ RUN test -f /tmp/preremove-proof
|
|||
RUN test -f /tmp/postremove-proof
|
||||
RUN test ! -d /var/log/whatever
|
||||
RUN test ! -d /usr/share/foo
|
||||
RUN test ! -d /usr/foo/bar/something
|
||||
|
||||
# ---- signed test ----
|
||||
FROM test_base AS signed
|
||||
|
|
|
@ -49,6 +49,7 @@ RUN test -f /usr/share/whatever/folder/folder2/file1
|
|||
RUN test -f /usr/share/whatever/folder/folder2/file2
|
||||
RUN test -d /var/log/whatever
|
||||
RUN test -d /usr/share/foo
|
||||
RUN test -d /usr/foo/bar/something
|
||||
RUN test $(stat -c %a /usr/sbin/fake) -eq 4755
|
||||
RUN test -f /tmp/preinstall-proof
|
||||
RUN test -f /tmp/postinstall-proof
|
||||
|
@ -65,6 +66,7 @@ RUN test -f /tmp/preremove-proof
|
|||
RUN test -f /tmp/postremove-proof
|
||||
RUN test ! -d /var/log/whatever
|
||||
RUN test ! -d /usr/share/foo
|
||||
RUN test ! -d /usr/foo/bar/something
|
||||
|
||||
|
||||
# ---- signed test ----
|
||||
|
|
Loading…
Reference in New Issue