fix: processing symlinks in directories (#453)

* fix: proceed symlinks in contents as is

* Remove dead code

* fix: make OS independent test
This commit is contained in:
Mikhail f. Shiryaev
2022-02-12 02:47:18 +01:00
committed by GitHub
parent 53a3fc20e5
commit c049e1c2f9
9 changed files with 72 additions and 97 deletions
-48
View File
@@ -11,7 +11,6 @@ import (
"fmt"
"io"
"io/ioutil"
"os"
"path"
"path/filepath"
"strconv"
@@ -647,41 +646,6 @@ func TestDebNoTriggersInControlIfNoneProvided(t *testing.T) {
require.False(t, tarContains(t, inflate(t, "gz", controlTarGz), "triggers"))
}
func TestSymlinkInFiles(t *testing.T) {
var (
symlinkTarget = "../testdata/whatever.conf"
packagedTarget = "/etc/fake/whatever.conf"
)
info := &nfpm.Info{
Name: "symlink-in-files",
Arch: "amd64",
Description: "This package's config references a file via symlink.",
Version: "1.0.0",
Overridables: nfpm.Overridables{
Contents: []*files.Content{
{
Source: symlinkTo(t, symlinkTarget),
Destination: packagedTarget,
},
},
},
}
err := info.Validate()
require.NoError(t, err)
realSymlinkTarget, err := ioutil.ReadFile(symlinkTarget)
require.NoError(t, err)
dataTarball, _, _, dataTarballName, err := createDataTarball(info)
require.NoError(t, err)
packagedSymlinkTarget := extractFileFromTar(t,
inflate(t, dataTarballName, dataTarball), packagedTarget)
require.Equal(t, string(realSymlinkTarget), string(packagedSymlinkTarget))
}
func TestSymlink(t *testing.T) {
var (
configFilePath = "/usr/share/doc/fake/fake.txt"
@@ -1224,18 +1188,6 @@ func readAndFormatAsDebChangelog(tb testing.TB, changelogFileName, packageName s
return strings.TrimSpace(debChangelog) + "\n"
}
func symlinkTo(tb testing.TB, fileName string) string {
tb.Helper()
target, err := filepath.Abs(fileName)
require.NoError(tb, err)
symlinkName := filepath.Join(tb.TempDir(), "symlink")
err = os.Symlink(target, symlinkName)
require.NoError(tb, err)
return files.ToNixPath(symlinkName)
}
func findDataTarball(tb testing.TB, arFile []byte) string {
tb.Helper()
+6 -2
View File
@@ -177,15 +177,19 @@ func ExpandContentGlobs(contents Contents, disableGlobbing bool) (files Contents
func appendGlobbedFiles(all Contents, globbed map[string]string, origFile *Content) (Contents, error) {
for src, dst := range globbed {
newFile := &Content{
newFile := (&Content{
Destination: ToNixPath(dst),
Source: ToNixPath(src),
Type: origFile.Type,
FileInfo: origFile.FileInfo,
Packager: origFile.Packager,
}).WithFileInfoDefaults()
if dst, err := os.Readlink(src); err == nil {
newFile.Source = dst
newFile.Type = "symlink"
}
all = append(all, newFile.WithFileInfoDefaults())
all = append(all, newFile)
}
return all, nil
+62
View File
@@ -146,6 +146,68 @@ contents:
require.Equal(t, f.FileInfo.MTime, ct)
}
func TestSymlinksInDirectory(t *testing.T) {
var config testStruct
dec := yaml.NewDecoder(strings.NewReader(`---
contents:
- src: testdata/symlinks/subdir
dst: /bla
- src: testdata/symlinks/link-1
dst: /
- src: testdata/symlinks/link-2
dst: /
- src: existent
dst: /bla/link-3
type: symlink
`))
dec.KnownFields(true)
err := dec.Decode(&config)
require.NoError(t, err)
config.Contents, err = files.ExpandContentGlobs(config.Contents, true)
require.NoError(t, err)
require.Len(t, config.Contents, 6)
// Nulling FileInfo to check equality between expected and result
for _, c := range config.Contents {
c.FileInfo = nil
}
expected := files.Contents{
{
Source: "testdata/symlinks/subdir/existent",
Destination: "/bla/existent",
Type: "",
},
{
Source: "non-existent",
Destination: "/bla/link-1",
Type: "symlink",
},
{
Source: "existent",
Destination: "/bla/link-2",
Type: "symlink",
},
{
Source: "existent",
Destination: "/bla/link-3",
Type: "symlink",
},
{
Source: "broken",
Destination: "/link-1",
Type: "symlink",
},
{
Source: "bla",
Destination: "/link-2",
Type: "symlink",
},
}
require.Equal(t, expected, config.Contents)
}
func TestRace(t *testing.T) {
var config testStruct
dec := yaml.NewDecoder(strings.NewReader(`---
+1
View File
@@ -0,0 +1 @@
broken
+1
View File
@@ -0,0 +1 @@
bla
View File
+1
View File
@@ -0,0 +1 @@
non-existent
+1
View File
@@ -0,0 +1 @@
existent
-47
View File
@@ -7,7 +7,6 @@ import (
"io"
"io/ioutil"
"os"
"path"
"path/filepath"
"strings"
"testing"
@@ -604,40 +603,6 @@ func TestRPMNoChangelogTagsWithoutChangelogConfigured(t *testing.T) {
require.Error(t, err)
}
func TestSymlinkInFiles(t *testing.T) {
var (
symlinkTarget = "../testdata/whatever.conf"
packagedTarget = "/etc/fake/whatever.conf"
)
info := &nfpm.Info{
Name: "symlink-in-files",
Arch: "amd64",
Description: "This package's config references a file via symlink.",
Version: "1.0.0",
Overridables: nfpm.Overridables{
Contents: []*files.Content{
{
Source: symlinkTo(t, symlinkTarget),
Destination: packagedTarget,
},
},
},
}
realSymlinkTarget, err := ioutil.ReadFile(symlinkTarget)
require.NoError(t, err)
var rpmFileBuffer bytes.Buffer
err = Default.Package(info, &rpmFileBuffer)
require.NoError(t, err)
packagedSymlinkTarget, err := extractFileFromRpm(rpmFileBuffer.Bytes(), packagedTarget)
require.NoError(t, err)
require.Equal(t, string(realSymlinkTarget), string(packagedSymlinkTarget))
}
func TestSymlink(t *testing.T) {
var (
configFilePath = "/usr/share/doc/fake/fake.txt"
@@ -933,15 +898,3 @@ func extractFileHeaderFromRpm(rpm []byte, filename string) (*cpio.Cpio_newc_head
return nil, os.ErrNotExist
}
func symlinkTo(tb testing.TB, fileName string) string {
tb.Helper()
target, err := filepath.Abs(fileName)
require.NoError(tb, err)
symlinkName := path.Join(tb.TempDir(), "symlink")
err = os.Symlink(target, symlinkName)
require.NoError(tb, err)
return files.ToNixPath(symlinkName)
}