helpers: Fix SymbolicWalk for the root folder
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 25 Mar 2016 11:47:57 +0000 (12:47 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Fri, 25 Mar 2016 11:49:23 +0000 (12:49 +0100)
handle the root folders themselves.

This commit fixes that.

Fixes #2018

helpers/path.go

index 34b7675fc4f7e4682a54ca9297ebdfdd8ff997e2..5f1e83398bc782024f00279dbb1e9565b03b8022 100644 (file)
@@ -449,6 +449,22 @@ func FindCWD() (string, error) {
 // symbolic link. It will still not follow symbolic links deeper down in
 // the file structure
 func SymbolicWalk(fs afero.Fs, root string, walker filepath.WalkFunc) error {
+
+       // Handle the root first
+       fileInfo, err := lstatIfOs(fs, root)
+
+       if err != nil || !fileInfo.IsDir() {
+               return nil
+       }
+
+       if err != nil {
+               return walker(root, nil, err)
+       }
+
+       if err := walker(root, fileInfo, err); err != nil && err != filepath.SkipDir {
+               return err
+       }
+
        rootContent, err := afero.ReadDir(fs, root)
 
        if err != nil {
@@ -463,6 +479,18 @@ func SymbolicWalk(fs afero.Fs, root string, walker filepath.WalkFunc) error {
 
 }
 
+// Code copied from Afero's path.go
+// if the filesystem is OsFs use Lstat, else use fs.Stat
+func lstatIfOs(fs afero.Fs, path string) (info os.FileInfo, err error) {
+       _, ok := fs.(*afero.OsFs)
+       if ok {
+               info, err = os.Lstat(path)
+       } else {
+               info, err = fs.Stat(path)
+       }
+       return
+}
+
 // SafeWriteToDisk is the same as WriteToDisk
 // but it also checks to see if file/directory already exists.
 func SafeWriteToDisk(inpath string, r io.Reader, fs afero.Fs) (err error) {