writeFileTree static method

void writeFileTree({
  1. required Set<String> filePaths,
  2. required Set<String> ignoredPaths,
  3. required void write(
    1. String, {
    2. AnsiStyle? style,
    }),
})

Implementation

static void writeFileTree({
  required final Set<String> filePaths,
  required final Set<String> ignoredPaths,
  required final void Function(String, {AnsiStyle? style}) write,
}) {
  final List<_TreeNode> allFiles = [
    ...filePaths.map((final path) => _TreeNode(path, false)),
    ...ignoredPaths.map((final path) => _TreeNode(path, true)),
  ];

  // Sort files by directory structure
  // Files comes after directories, and directories are sorted alphabetically
  //
  // Example of sorted output:
  // a/b/z.dart
  // a/z/a.dart
  // z/a.dart
  // a.dart
  allFiles.sort((final a, final b) {
    final aDirs = p.split(a.part);
    final bDirs = p.split(b.part);

    final minParts = min(aDirs.length, bDirs.length);

    for (var i = 0; i < minParts; i++) {
      final isLast = i == minParts - 1;
      if (isLast && aDirs.length != bDirs.length) {
        // If paths are different lengths, directories (longer paths) come first
        return bDirs.length.compareTo(aDirs.length);
      }

      // If parts are different at this level, sort alphabetically
      if (aDirs[i] != bDirs[i]) {
        return aDirs[i].compareTo(bDirs[i]);
      }
    }

    return 0;
  });

  final tree = _buildTree(allFiles);

  _writeTree(tree, write, isParentIgnored: filePaths.isEmpty);
}