in lib/src/list_tree.dart [316:374]
Stream<FileSystemEntity> list(String dir, FileSystem fileSystem,
{bool followLinks = true}) {
if (isRecursive) {
return fileSystem
.directory(dir)
.list(recursive: true, followLinks: followLinks)
.where((entity) => _matches(p.relative(entity.path, from: dir)));
}
// Don't spawn extra [Directory.list] calls when we already know exactly
// which subdirectories we're interested in.
if (_isIntermediate && _caseSensitive) {
var resultGroup = StreamGroup<FileSystemEntity>();
children!.forEach((sequence, child) {
resultGroup.add(child.list(
p.join(dir, (sequence.nodes.single as LiteralNode).text),
fileSystem,
followLinks: followLinks));
});
resultGroup.close();
return resultGroup.stream;
}
return StreamCompleter.fromFuture(() async {
var entities = await fileSystem
.directory(dir)
.list(followLinks: followLinks)
.toList();
await _validateIntermediateChildrenAsync(dir, entities, fileSystem);
var resultGroup = StreamGroup<FileSystemEntity>();
var resultController = StreamController<FileSystemEntity>(sync: true);
unawaited(resultGroup.add(resultController.stream));
for (var entity in entities) {
var basename = p.relative(entity.path, from: dir);
if (_matches(basename)) resultController.add(entity);
children!.forEach((sequence, child) {
if (entity is! Directory) return;
if (!sequence.matches(basename)) return;
var stream = child
.list(p.join(dir, basename), fileSystem, followLinks: followLinks)
.handleError((_) {}, test: (error) {
// Ignore errors from directories not existing. We do this here so
// that we only ignore warnings below wild cards. For example, the
// glob "foo/bar/*/baz" should fail if "foo/bar" doesn't exist but
// succeed if "foo/bar/qux/baz" doesn't exist.
return error is FileSystemException &&
(error.osError!.errorCode == _enoent ||
error.osError!.errorCode == _enoentWin);
});
resultGroup.add(stream);
});
}
unawaited(resultController.close());
unawaited(resultGroup.close());
return resultGroup.stream;
}());
}