list method
The entries of the directory directory — one level, unsorted.
Implementation
@override
Future<List<TomFileEntry>> list(Uri directory) async {
final local = localPathOf(directory);
final relative = _relative(local);
final realHere = relative.isEmpty
? _realRoot
: p.join(_realRoot, p.joinAll(relative.split('/')));
final entries = <TomFileEntry>[];
await for (final entity in Directory(local).list(followLinks: false)) {
final stat = await entity.stat();
if (entity is Link) {
String? target;
try {
target = await entity.resolveSymbolicLinks();
} on FileSystemException {
target = null;
}
final targetType = target == null
? null
: FileSystemEntity.typeSync(target);
// Compared as real paths: the root itself may sit behind a link
// (macOS's /var is /private/var), and a resolved target never names
// the unresolved form.
final here = p.join(realHere, p.basename(entity.path));
final inside =
target != null &&
(p.isWithin(_realRoot, target) || p.equals(_realRoot, target));
final ancestor =
target != null &&
(p.isWithin(target, here) || p.equals(target, _realRoot));
entries.add(
_entryOf(
entity.path,
kind: TomFileEntryKind.link,
stat: stat,
linksToDirectory: targetType == FileSystemEntityType.directory,
linkLeavesRoot: !inside || ancestor,
readable: target != null,
),
);
continue;
}
entries.add(
_entryOf(
entity.path,
kind: entity is Directory
? TomFileEntryKind.directory
: TomFileEntryKind.file,
stat: stat,
),
);
}
return entries;
}