| Index: utils/pub/directory_tree.dart
|
| diff --git a/utils/pub/directory_tree.dart b/utils/pub/directory_tree.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f5baa62376a5257a4ace59792da55917ebc616bd
|
| --- /dev/null
|
| +++ b/utils/pub/directory_tree.dart
|
| @@ -0,0 +1,133 @@
|
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +/// A simple library for rendering a list of files as a directory tree.
|
| +library directory_tree;
|
| +
|
| +import 'log.dart' as log;
|
| +import 'path.dart' as path;
|
| +
|
| +/// Draws a directory tree for the given list of files. Given a list of files
|
| +/// like:
|
| +///
|
| +/// TODO
|
| +/// example/console_example.dart
|
| +/// example/main.dart
|
| +/// example/web copy/web_example.dart
|
| +/// test/absolute_test.dart
|
| +/// test/basename_test.dart
|
| +/// test/dirname_test.dart
|
| +/// test/extension_test.dart
|
| +/// test/is_absolute_test.dart
|
| +/// test/is_relative_test.dart
|
| +/// test/join_test.dart
|
| +/// test/normalize_test.dart
|
| +/// test/relative_test.dart
|
| +/// test/split_test.dart
|
| +/// .gitignore
|
| +/// README.md
|
| +/// lib/path.dart
|
| +/// pubspec.yaml
|
| +/// test/all_test.dart
|
| +/// test/path_posix_test.dart
|
| +/// test/path_windows_test.dart
|
| +///
|
| +/// this will render:
|
| +///
|
| +/// |-- .gitignore
|
| +/// |-- README.md
|
| +/// |-- TODO
|
| +/// |-- example
|
| +/// | |-- console_example.dart
|
| +/// | |-- main.dart
|
| +/// | '-- web copy
|
| +/// | '-- web_example.dart
|
| +/// |-- lib
|
| +/// | '-- path.dart
|
| +/// |-- pubspec.yaml
|
| +/// '-- test
|
| +/// |-- absolute_test.dart
|
| +/// |-- all_test.dart
|
| +/// |-- basename_test.dart
|
| +/// | (7 more...)
|
| +/// |-- path_windows_test.dart
|
| +/// |-- relative_test.dart
|
| +/// '-- split_test.dart
|
| +///
|
| +String generateTree(List<String> files) {
|
| + // Parse out the files into a tree of nested maps.
|
| + var root = {};
|
| + for (var file in files) {
|
| + var parts = path.split(file);
|
| + var directory = root;
|
| + for (var part in path.split(file)) {
|
| + directory = directory.putIfAbsent(part, () => {});
|
| + }
|
| + }
|
| +
|
| + // Walk the map recursively and render to a string.
|
| + var buffer = new StringBuffer();
|
| + _draw(buffer, '', false, null, root);
|
| + return buffer.toString();
|
| +}
|
| +
|
| +void _drawLine(StringBuffer buffer, String prefix, bool isLastChild,
|
| + String name) {
|
| + // Print lines.
|
| + buffer.add(prefix);
|
| + if (name != null) {
|
| + if (isLastChild) {
|
| + buffer.add("'-- ");
|
| + } else {
|
| + buffer.add("|-- ");
|
| + }
|
| + }
|
| +
|
| + // Print name.
|
| + buffer.add(name);
|
| + buffer.add('\n');
|
| +}
|
| +
|
| +String _getPrefix(bool isRoot, bool isLast) {
|
| + if (isRoot) return "";
|
| + if (isLast) return " ";
|
| + return "| ";
|
| +}
|
| +
|
| +void _draw(StringBuffer buffer, String prefix, bool isLast,
|
| + String name, Map children) {
|
| + // Don't draw a line for the root node.
|
| + if (name != null) _drawLine(buffer, prefix, isLast, name);
|
| +
|
| + // Recurse to the children.
|
| + var childNames = new List.from(children.keys);
|
| + childNames.sort();
|
| +
|
| + _drawChild(bool isLastChild, String child) {
|
| + var childPrefix = _getPrefix(name == null, isLast);
|
| + _draw(buffer, '$prefix$childPrefix', isLastChild, child, children[child]);
|
| + }
|
| +
|
| + if (childNames.length <= 10) {
|
| + // Not too many, so show all the children.
|
| + for (var i = 0; i < childNames.length; i++) {
|
| + _drawChild(i == childNames.length - 1, childNames[i]);
|
| + }
|
| + } else {
|
| + // Show the first few.
|
| + _drawChild(false, childNames[0]);
|
| + _drawChild(false, childNames[1]);
|
| + _drawChild(false, childNames[2]);
|
| +
|
| + // Elide the middle ones.
|
| + buffer.add(prefix);
|
| + buffer.add(_getPrefix(name == null, isLast));
|
| + buffer.add('| (${childNames.length - 6} more...)\n');
|
| +
|
| + // Show the last few.
|
| + _drawChild(false, childNames[childNames.length - 3]);
|
| + _drawChild(false, childNames[childNames.length - 2]);
|
| + _drawChild(true, childNames[childNames.length - 1]);
|
| + }
|
| +}
|
|
|