Skip to content

Commit 8592d45

Browse files
authored
Added walking through dereferenced symlink dir (#42)
Signed-off-by: Jakub Wójtowicz <jakub.wojtowic@gmail.com>
1 parent 5fd3600 commit 8592d45

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

archives.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,20 @@ func FilesFromDisk(ctx context.Context, options *FromDiskOptions, filenames map[
100100
var linkTarget string
101101
if isSymlink(info) {
102102
if options != nil && options.FollowSymlinks {
103+
originalFilename := filename
103104
filename, info, err = followSymlink(filename)
104105
if err != nil {
105106
return err
106107
}
108+
if info.IsDir() {
109+
symlinkDirFiles, err := FilesFromDisk(ctx, options, map[string]string{filename: nameInArchive})
110+
if err != nil {
111+
return fmt.Errorf("getting files from symlink directory %s dereferenced to %s: %w", originalFilename, linkTarget, err)
112+
}
113+
114+
files = append(files, symlinkDirFiles...)
115+
return nil
116+
}
107117
} else {
108118
// preserve symlinks
109119
linkTarget, err = os.Readlink(filename)
@@ -128,6 +138,7 @@ func FilesFromDisk(ctx context.Context, options *FromDiskOptions, filenames map[
128138
}
129139

130140
files = append(files, file)
141+
131142
return nil
132143
})
133144
if walkErr != nil {

archives_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package archives
22

33
import (
4+
"context"
45
"fmt"
56
"os"
67
"path/filepath"
78
"reflect"
89
"runtime"
10+
"sort"
911
"strings"
1012
"testing"
1113
)
@@ -266,6 +268,13 @@ func TestNameOnDiskToNameInArchive(t *testing.T) {
266268
}
267269
}
268270

271+
func fixSeparators(path string) string {
272+
if runtime.GOOS == "windows" {
273+
return strings.ReplaceAll(path, "/", "\\")
274+
}
275+
return path
276+
}
277+
269278
func TestFollowSymlink(t *testing.T) {
270279
// Create temp directory for tests
271280
tmpDir := t.TempDir()
@@ -510,3 +519,46 @@ func TestFollowSymlink(t *testing.T) {
510519
}
511520
})
512521
}
522+
523+
func TestFilesFromDisk_SymlinkOutsideFileNamesMap(t *testing.T) {
524+
tmpDir := t.TempDir()
525+
otherTmpDir := t.TempDir()
526+
527+
testDirName := "test_dir"
528+
testDir := filepath.Join(otherTmpDir, testDirName)
529+
if err := os.Mkdir(testDir, 0755); err != nil {
530+
t.Fatal(err)
531+
}
532+
533+
testFileName := "test.txt"
534+
testFile := filepath.Join(testDir, testFileName)
535+
if err := os.WriteFile(testFile, []byte("test content"), 0644); err != nil {
536+
t.Fatal(err)
537+
}
538+
539+
symlinkDirName := "symlink_dir"
540+
symlinkDir := filepath.Join(tmpDir, symlinkDirName)
541+
if err := os.Symlink(testDir, symlinkDir); err != nil {
542+
t.Fatal(err)
543+
}
544+
545+
files, err := FilesFromDisk(context.Background(), &FromDiskOptions{
546+
FollowSymlinks: true,
547+
}, map[string]string{symlinkDir: ""})
548+
if err != nil {
549+
t.Fatal(err)
550+
}
551+
552+
sort.Slice(files, func(i, j int) bool {
553+
return files[i].NameInArchive < files[j].NameInArchive
554+
})
555+
556+
if files[0].NameInArchive != symlinkDirName {
557+
t.Fatalf("expected file name '%s', got '%s'", symlinkDirName, files[0].NameInArchive)
558+
}
559+
560+
testFilePath := fmt.Sprintf("%s/%s", symlinkDirName, testFileName)
561+
if files[1].NameInArchive != testFilePath {
562+
t.Fatalf("expected file name '%s', got '%s'", testFilePath, files[1].NameInArchive)
563+
}
564+
}

0 commit comments

Comments
 (0)