list method

  1. @override
Future<List<TomFileEntry>> list(
  1. Uri directory
)
override

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;
}