Skip to content
This repository was archived by the owner on Apr 24, 2021. It is now read-only.

Commit 4e29732

Browse files
committed
add support for link size and resolution
1 parent b8ab489 commit 4e29732

File tree

2 files changed

+36
-5
lines changed

2 files changed

+36
-5
lines changed

files/linkfile.go

+4
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,7 @@ func (f *Symlink) FullPath() string {
4848
func (f *Symlink) Read(b []byte) (int, error) {
4949
return f.reader.Read(b)
5050
}
51+
52+
func (f *Symlink) Size() (int64, error) {
53+
return int64(len(f.Target)), nil
54+
}

files/serialfile.go

+32-5
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ type serialFile struct {
2020
stat os.FileInfo
2121
current *File
2222
handleHiddenFiles bool
23+
resolveLinks bool
2324
}
2425

25-
func NewSerialFile(name, path string, hidden bool, stat os.FileInfo) (File, error) {
26+
func NewSerialFile(name, path string, hidden bool, stat os.FileInfo, resolveLinks bool) (File, error) {
2627
switch mode := stat.Mode(); {
2728
case mode.IsRegular():
2829
file, err := os.Open(path)
@@ -37,12 +38,27 @@ func NewSerialFile(name, path string, hidden bool, stat os.FileInfo) (File, erro
3738
if err != nil {
3839
return nil, err
3940
}
40-
return &serialFile{name, path, contents, stat, nil, hidden}, nil
41+
return &serialFile{name, path, contents, stat, nil, hidden, resolveLinks}, nil
4142
case mode&os.ModeSymlink != 0:
4243
target, err := os.Readlink(path)
4344
if err != nil {
4445
return nil, err
4546
}
47+
if resolveLinks {
48+
target, err := filepath.EvalSymlinks(path)
49+
if err != nil {
50+
return nil, err
51+
}
52+
target = filepath.ToSlash(target)
53+
54+
fi, err := os.Lstat(target)
55+
if err != nil {
56+
return nil, err
57+
}
58+
59+
return NewSerialFile(name, target, hidden, fi, resolveLinks)
60+
}
61+
4662
return NewLinkFile(name, path, target, stat), nil
4763
default:
4864
return nil, fmt.Errorf("Unrecognized file type for %s: %s", name, mode.String())
@@ -93,7 +109,7 @@ func (f *serialFile) NextFile() (File, error) {
93109
// recursively call the constructor on the next file
94110
// if it's a regular file, we will open it as a ReaderFile
95111
// if it's a directory, files in it will be opened serially
96-
sf, err := NewSerialFile(fileName, filePath, f.handleHiddenFiles, stat)
112+
sf, err := NewSerialFile(fileName, filePath, f.handleHiddenFiles, stat, f.resolveLinks)
97113
if err != nil {
98114
return nil, err
99115
}
@@ -139,13 +155,24 @@ func (f *serialFile) Size() (int64, error) {
139155

140156
var du int64
141157
err := filepath.Walk(f.FullPath(), func(p string, fi os.FileInfo, err error) error {
142-
if err != nil {
158+
if err != nil || fi == nil {
143159
return err
144160
}
145161

146-
if fi != nil && fi.Mode().IsRegular() {
162+
if fi.Mode().IsRegular() {
147163
du += fi.Size()
148164
}
165+
166+
if fi.Mode()&os.ModeSymlink != 0 {
167+
if f.resolveLinks {
168+
targetFi, err := os.Stat(p)
169+
if err != nil {
170+
return err
171+
}
172+
du += targetFi.Size()
173+
}
174+
}
175+
149176
return nil
150177
})
151178

0 commit comments

Comments
 (0)