Chromium Code Reviews| Index: sdk/lib/_internal/pub/lib/src/io.dart |
| diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart |
| index 1620837c2b2f3362997abbf78ac581a52b543dab..0c45b33ad02cf552107e13dd3750647950d621a9 100644 |
| --- a/sdk/lib/_internal/pub/lib/src/io.dart |
| +++ b/sdk/lib/_internal/pub/lib/src/io.dart |
| @@ -133,16 +133,9 @@ String createTempDir([dir = '']) { |
| /// The returned paths are guaranteed to begin with [dir]. |
| List<String> listDir(String dir, {bool recursive: false, |
| bool includeHidden: false}) { |
| - List<String> doList(String dir, Set<String> listedDirectories) { |
| + Set<String> visited = new Set<String>(); |
| + List<String> doList(String dir) { |
| var contents = <String>[]; |
| - |
| - // Avoid recursive symlinks. |
| - var resolvedPath = new File(dir).fullPathSync(); |
| - if (listedDirectories.contains(resolvedPath)) return []; |
| - |
| - listedDirectories = new Set<String>.from(listedDirectories); |
| - listedDirectories.add(resolvedPath); |
| - |
| log.io("Listing directory $dir."); |
| var children = <String>[]; |
|
Andrei Mouravski
2013/05/02 00:16:13
Why not reuse contents instead of making children?
Bob Nystrom
2013/05/02 00:18:59
I'm not exactly sure, but I believe the existed co
|
| @@ -151,14 +144,23 @@ List<String> listDir(String dir, {bool recursive: false, |
| continue; |
| } |
| + // Filter out duplicate entries caused by recursive symlinks. We check |
| + // for duplicate entities instead of looking for the symlink cycle itself |
| + // because [identicalSync] does not consider a link identical to its |
| + // target. That means a directory and the recursive symlink to it will |
| + // show up as different entities. |
| + if (visited.any((previous) => |
| + FileSystemEntity.identicalSync(previous, entity.path))) { |
| + continue; |
| + } |
| + visited.add(entity.path); |
| + |
| contents.add(entity.path); |
| if (entity is Directory) { |
| // TODO(nweiz): don't manually recurse once issue 4794 is fixed. |
| // Note that once we remove the manual recursion, we'll need to |
| // explicitly filter out files in hidden directories. |
| - if (recursive) { |
| - children.addAll(doList(entity.path, listedDirectories)); |
| - } |
| + if (recursive) children.addAll(doList(entity.path)); |
| } |
| } |
| @@ -167,7 +169,7 @@ List<String> listDir(String dir, {bool recursive: false, |
| return contents; |
| } |
| - return doList(dir, new Set<String>()); |
| + return doList(dir); |
| } |
| /// Returns whether [dir] exists on the file system. This will return `true` for |