summaryrefslogtreecommitdiff
path: root/finder
diff options
context:
space:
mode:
author Colin Cross <ccross@android.com> 2020-06-29 23:11:55 -0700
committer Colin Cross <ccross@android.com> 2020-06-29 23:30:38 -0700
commit25fd77310cc6383ddb9d5c778eb8349a36bfdf4f (patch)
tree179a8cfaea73bbdc454c232433f335909a1bd359 /finder
parent7cdad45cf217097e262ca370aa2cc36a6545a49e (diff)
Fix finder on symlinks pointing to directories
When finder encountered a symlink pointing to a directory it attempted to ignore it, but becuase Lstat returns the a *os.FileInfo for the symlink the child.IsDir() check always returned false. Call Stat on the symlink to get the *os.FileInfo for the target of the symlink. Bug: 157656545 Test: finder_test.go Change-Id: Ie33d2e05d5c435b48e83eaeadf7b3c9816398404
Diffstat (limited to 'finder')
-rw-r--r--finder/finder.go20
-rw-r--r--finder/finder_test.go1
2 files changed, 15 insertions, 6 deletions
diff --git a/finder/finder.go b/finder/finder.go
index 89be0f5f4..f20bed29e 100644
--- a/finder/finder.go
+++ b/finder/finder.go
@@ -1393,17 +1393,25 @@ func (f *Finder) listDirSync(dir *pathMap) {
for _, child := range children {
linkBits := child.Mode() & os.ModeSymlink
isLink := linkBits != 0
- if child.IsDir() {
- if !isLink {
+ if isLink {
+ childPath := filepath.Join(path, child.Name())
+ childStat, err := f.filesystem.Stat(childPath)
+ if err != nil {
+ // If stat fails this is probably a broken or dangling symlink, treat it as a file.
+ subfiles = append(subfiles, child.Name())
+ } else if childStat.IsDir() {
// Skip symlink dirs.
// We don't have to support symlink dirs because
// that would cause duplicates.
- subdirs = append(subdirs, child.Name())
+ } else {
+ // We do have to support symlink files because the link name might be
+ // different than the target name
+ // (for example, Android.bp -> build/soong/root.bp)
+ subfiles = append(subfiles, child.Name())
}
+ } else if child.IsDir() {
+ subdirs = append(subdirs, child.Name())
} else {
- // We do have to support symlink files because the link name might be
- // different than the target name
- // (for example, Android.bp -> build/soong/root.bp)
subfiles = append(subfiles, child.Name())
}
diff --git a/finder/finder_test.go b/finder/finder_test.go
index 0210d2ac8..88b0c058b 100644
--- a/finder/finder_test.go
+++ b/finder/finder_test.go
@@ -1308,6 +1308,7 @@ func TestSymlinkPointingToDirectory(t *testing.T) {
fs.Link(t, "/tmp/links/dir", "../dir", filesystem)
fs.Link(t, "/tmp/links/link", "../dir", filesystem)
+ fs.Link(t, "/tmp/links/hi.txt", "../dir", filesystem)
fs.Link(t, "/tmp/links/broken", "nothingHere", filesystem)
fs.Link(t, "/tmp/links/recursive", "recursive", filesystem)