@@ -20,9 +20,10 @@ type serialFile struct {
20
20
stat os.FileInfo
21
21
current * File
22
22
handleHiddenFiles bool
23
+ resolveLinks bool
23
24
}
24
25
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 ) {
26
27
switch mode := stat .Mode (); {
27
28
case mode .IsRegular ():
28
29
file , err := os .Open (path )
@@ -37,12 +38,27 @@ func NewSerialFile(name, path string, hidden bool, stat os.FileInfo) (File, erro
37
38
if err != nil {
38
39
return nil , err
39
40
}
40
- return & serialFile {name , path , contents , stat , nil , hidden }, nil
41
+ return & serialFile {name , path , contents , stat , nil , hidden , resolveLinks }, nil
41
42
case mode & os .ModeSymlink != 0 :
42
43
target , err := os .Readlink (path )
43
44
if err != nil {
44
45
return nil , err
45
46
}
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
+
46
62
return NewLinkFile (name , path , target , stat ), nil
47
63
default :
48
64
return nil , fmt .Errorf ("Unrecognized file type for %s: %s" , name , mode .String ())
@@ -93,7 +109,7 @@ func (f *serialFile) NextFile() (File, error) {
93
109
// recursively call the constructor on the next file
94
110
// if it's a regular file, we will open it as a ReaderFile
95
111
// 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 )
97
113
if err != nil {
98
114
return nil , err
99
115
}
@@ -139,13 +155,24 @@ func (f *serialFile) Size() (int64, error) {
139
155
140
156
var du int64
141
157
err := filepath .Walk (f .FullPath (), func (p string , fi os.FileInfo , err error ) error {
142
- if err != nil {
158
+ if err != nil || fi == nil {
143
159
return err
144
160
}
145
161
146
- if fi != nil && fi .Mode ().IsRegular () {
162
+ if fi .Mode ().IsRegular () {
147
163
du += fi .Size ()
148
164
}
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
+
149
176
return nil
150
177
})
151
178
0 commit comments