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