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)