mirror of
https://github.com/goreleaser/nfpm.git
synced 2026-06-19 08:05:04 +00:00
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:
committed by
GitHub
parent
53a3fc20e5
commit
c049e1c2f9
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -0,0 +1 @@
|
||||
broken
|
||||
+1
@@ -0,0 +1 @@
|
||||
bla
|
||||
+1
@@ -0,0 +1 @@
|
||||
non-existent
|
||||
+1
@@ -0,0 +1 @@
|
||||
existent
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user