Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit de9c191

Browse files
committedJun 10, 2025··
Added walking through dereferenced symlink dir
Signed-off-by: Jakub Wójtowicz <[email protected]>
1 parent d0903a1 commit de9c191

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-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: 45 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
)
@@ -510,3 +512,46 @@ func TestFollowSymlink(t *testing.T) {
510512
}
511513
})
512514
}
515+
516+
func TestFilesFromDisk_SymlinkOutsideFileNamesMap(t *testing.T) {
517+
tmpDir := t.TempDir()
518+
otherTmpDir := t.TempDir()
519+
520+
testDirName := "test_dir"
521+
testDir := filepath.Join(otherTmpDir, testDirName)
522+
if err := os.Mkdir(testDir, 0755); err != nil {
523+
t.Fatal(err)
524+
}
525+
526+
testFileName := "test.txt"
527+
testFile := filepath.Join(testDir, testFileName)
528+
if err := os.WriteFile(testFile, []byte("test content"), 0644); err != nil {
529+
t.Fatal(err)
530+
}
531+
532+
symlinkDirName := "symlink_dir"
533+
symlinkDir := filepath.Join(tmpDir, symlinkDirName)
534+
if err := os.Symlink(testDir, symlinkDir); err != nil {
535+
t.Fatal(err)
536+
}
537+
538+
files, err := FilesFromDisk(context.Background(), &FromDiskOptions{
539+
FollowSymlinks: true,
540+
}, map[string]string{symlinkDir: ""})
541+
if err != nil {
542+
t.Fatal(err)
543+
}
544+
545+
sort.Slice(files, func(i, j int) bool {
546+
return files[i].NameInArchive < files[j].NameInArchive
547+
})
548+
549+
if files[0].NameInArchive != symlinkDirName {
550+
t.Fatalf("expected file name '%s', got '%s'", symlinkDirName, files[0].NameInArchive)
551+
}
552+
553+
testFilePath := filepath.Join(symlinkDirName, testFileName)
554+
if files[1].NameInArchive != testFilePath {
555+
t.Fatalf("expected file name '%s', got '%s'", testFilePath, files[1].NameInArchive)
556+
}
557+
}

0 commit comments

Comments
 (0)
Please sign in to comment.