diff --git a/lib/src/ascii_tree.dart b/lib/src/ascii_tree.dart
index 302607f..1ab8a23 100644
--- a/lib/src/ascii_tree.dart
+++ b/lib/src/ascii_tree.dart
@@ -3,12 +3,19 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// A simple library for rendering tree-like structures in ASCII.
+import 'dart:io';
+
 import 'package:path/path.dart' as path;
 
 import 'log.dart' as log;
 import 'utils.dart';
 
-/// Draws a tree for the given list of files. Given files like:
+/// Draws a tree for the given list of files
+///
+/// Shows each file with the file size if [showFileSize] is `true`.
+/// This will stats each file in the list for finding the size.
+///
+/// Given files like:
 ///
 ///     TODO
 ///     example/console_example.dart
@@ -16,11 +23,6 @@
 ///     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
@@ -34,48 +36,52 @@
 ///
 /// this renders:
 ///
-///     |-- .gitignore
-///     |-- README.md
-///     |-- TODO
+///     |-- .gitignore (1 KB)
+///     |-- README.md (23 KB)
+///     |-- TODO (1 MB)
 ///     |-- example
-///     |   |-- console_example.dart
-///     |   |-- main.dart
+///     |   |-- console_example.dart (20 B)
+///     |   |-- main.dart (200 B)
 ///     |   '-- web copy
-///     |       '-- web_example.dart
+///     |       '-- web_example.dart (3 KB)
 ///     |-- lib
-///     |   '-- path.dart
-///     |-- pubspec.yaml
+///     |   '-- path.dart (4 KB)
+///     |-- pubspec.yaml (10 KB)
 ///     '-- test
-///         |-- absolute_test.dart
-///         |-- all_test.dart
-///         |-- basename_test.dart
-///         | (7 more...)
-///         |-- path_windows_test.dart
-///         |-- relative_test.dart
-///         '-- split_test.dart
+///         |-- absolute_test.dart (102 KB)
+///         |-- all_test.dart (100 KB)
+///         |-- basename_test.dart (4 KB)
+///         |-- path_windows_test.dart (2 KB)
+///         |-- relative_test.dart (10 KB)
+///         '-- split_test.dart (50 KB)
 ///
 /// If [baseDir] is passed, it will be used as the root of the tree.
-///
-/// If [showAllChildren] is `false`, then directories with more than ten items
-/// will have their contents truncated. Defaults to `false`.
+
 String fromFiles(
   List<String> files, {
   String? baseDir,
-  bool showAllChildren = false,
+  required bool showFileSizes,
 }) {
   // Parse out the files into a tree of nested maps.
   var root = <String, Map>{};
   for (var file in files) {
-    if (baseDir != null) file = path.relative(file, from: baseDir);
+    final relativeFile =
+        baseDir == null ? file : path.relative(file, from: baseDir);
+    final parts = path.split(relativeFile);
+    if (showFileSizes) {
+      final size = File(path.normalize(file)).statSync().size;
+      final sizeString = _readableFileSize(size);
+      parts.last = '${parts.last} $sizeString';
+    }
     var directory = root;
-    for (var part in path.split(file)) {
+    for (var part in parts) {
       directory = directory.putIfAbsent(part, () => <String, Map>{})
           as Map<String, Map>;
     }
   }
 
   // Walk the map recursively and render to a string.
-  return fromMap(root, showAllChildren: showAllChildren);
+  return fromMap(root);
 }
 
 /// Draws a tree from a nested map. Given a map like:
@@ -99,12 +105,9 @@
 ///     barback
 ///
 /// Items with no children should have an empty map as the value.
-///
-/// If [showAllChildren] is `false`, then directories with more than ten items
-/// will have their contents truncated. Defaults to `false`.
-String fromMap(Map<String, Map> map, {bool showAllChildren = false}) {
+String fromMap(Map<String, Map> map) {
   var buffer = StringBuffer();
-  _draw(buffer, '', null, map, showAllChildren: showAllChildren);
+  _draw(buffer, '', null, map);
   return buffer.toString();
 }
 
@@ -155,25 +158,19 @@
         showAllChildren: showAllChildren, isLast: isLastChild);
   }
 
-  if (name == null || showAllChildren || 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]);
-    }
+  for (var i = 0; i < childNames.length; i++) {
+    drawChild(i == childNames.length - 1, childNames[i]);
+  }
+}
+
+String _readableFileSize(int size) {
+  if (size >= 1 << 30) {
+    return log.red('(${size ~/ (1 << 30)} GB)');
+  } else if (size >= 1 << 20) {
+    return log.yellow('(${size ~/ (1 << 20)} MB)');
+  } else if (size >= 1 << 10) {
+    return log.gray('(${size ~/ (1 << 10)} KB)');
   } else {
-    // Show the first few.
-    drawChild(false, childNames[0]);
-    drawChild(false, childNames[1]);
-    drawChild(false, childNames[2]);
-
-    // Elide the middle ones.
-    buffer.write(prefix);
-    buffer.write(_getPrefix(false, isLast));
-    buffer.writeln(log.gray('| (${childNames.length - 6} more...)'));
-
-    // Show the last few.
-    drawChild(false, childNames[childNames.length - 3]);
-    drawChild(false, childNames[childNames.length - 2]);
-    drawChild(true, childNames[childNames.length - 1]);
+    return log.gray('(<1 KB)');
   }
 }
diff --git a/lib/src/command/deps.dart b/lib/src/command/deps.dart
index c860f02..a4203ab 100644
--- a/lib/src/command/deps.dart
+++ b/lib/src/command/deps.dart
@@ -287,7 +287,7 @@
       }
     }
 
-    _buffer.write(tree.fromMap(packageTree, showAllChildren: true));
+    _buffer.write(tree.fromMap(packageTree));
   }
 
   String _labelPackage(Package package) =>
diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index 69c1c7e..2185110 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -226,7 +226,7 @@
     var package = entrypoint.root;
     log.message(
       'Publishing ${package.name} ${package.version} to $host:\n'
-      '${tree.fromFiles(files, baseDir: entrypoint.root.dir, showAllChildren: true)}',
+      '${tree.fromFiles(files, baseDir: entrypoint.root.dir, showFileSizes: true)}',
     );
 
     var packageBytesFuture =
diff --git a/test/ascii_tree_test.dart b/test/ascii_tree_test.dart
index 5d82d49..a4b0163 100644
--- a/test/ascii_tree_test.dart
+++ b/test/ascii_tree_test.dart
@@ -3,240 +3,102 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:pub/src/ascii_tree.dart' as tree;
+import 'package:pub/src/package.dart';
+import 'package:pub/src/utils.dart';
 import 'package:test/test.dart';
 
+import 'descriptor.dart';
+import 'golden_file.dart';
+import 'test_pub.dart';
+
 /// Removes ansi color codes from [s].
 String stripColors(String s) {
   return s.replaceAll(RegExp('\u001b\\[.*?m'), '');
 }
 
 void main() {
-  group('tree.fromFiles', () {
-    test('no files', () {
-      expect(stripColors(tree.fromFiles([])), equals(''));
-    });
-
-    test('up to ten files in one directory are shown', () {
-      var files = [
-        'dir/a.dart',
-        'dir/b.dart',
-        'dir/c.dart',
-        'dir/d.dart',
-        'dir/e.dart',
-        'dir/f.dart',
-        'dir/g.dart',
-        'dir/h.dart',
-        'dir/i.dart',
-        'dir/j.dart'
-      ];
-      expect(stripColors(tree.fromFiles(files)), equals("""
-'-- dir
-    |-- a.dart
-    |-- b.dart
-    |-- c.dart
-    |-- d.dart
-    |-- e.dart
-    |-- f.dart
-    |-- g.dart
-    |-- h.dart
-    |-- i.dart
-    '-- j.dart
-"""));
-    });
-
-    test('files are elided if there are more than ten', () {
-      var files = [
-        'dir/a.dart',
-        'dir/b.dart',
-        'dir/c.dart',
-        'dir/d.dart',
-        'dir/e.dart',
-        'dir/f.dart',
-        'dir/g.dart',
-        'dir/h.dart',
-        'dir/i.dart',
-        'dir/j.dart',
-        'dir/k.dart'
-      ];
-      expect(stripColors(tree.fromFiles(files)), equals("""
-'-- dir
-    |-- a.dart
-    |-- b.dart
-    |-- c.dart
-    | (5 more...)
-    |-- i.dart
-    |-- j.dart
-    '-- k.dart
-"""));
-    });
-
-    test('files are not elided at the top level', () {
-      var files = [
-        'a.dart',
-        'b.dart',
-        'c.dart',
-        'd.dart',
-        'e.dart',
-        'f.dart',
-        'g.dart',
-        'h.dart',
-        'i.dart',
-        'j.dart',
-        'k.dart'
-      ];
-      expect(stripColors(tree.fromFiles(files)), equals("""
-|-- a.dart
-|-- b.dart
-|-- c.dart
-|-- d.dart
-|-- e.dart
-|-- f.dart
-|-- g.dart
-|-- h.dart
-|-- i.dart
-|-- j.dart
-'-- k.dart
-"""));
-    });
-
-    test('a complex example', () {
-      var files = [
-        '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'
-      ];
-
-      expect(stripColors(tree.fromFiles(files)), equals("""
-|-- .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
-"""));
-    });
+  setUp(() {
+    forceColors = ForceColorOption.always;
   });
 
-  group('treeFromMap', () {
-    test('empty map', () {
-      expect(stripColors(tree.fromMap({})), equals(''));
-    });
-
-    test('a complex example', () {
-      var map = {
-        '.gitignore': <String, Map>{},
-        'README.md': <String, Map>{},
-        'TODO': <String, Map>{},
-        'example': {
-          'console_example.dart': <String, Map>{},
-          'main.dart': <String, Map>{},
-          'web copy': {'web_example.dart': <String, Map>{}},
-        },
-        'lib': {'path.dart': <String, Map>{}},
-        'pubspec.yaml': <String, Map>{},
-        'test': {
-          'absolute_test.dart': <String, Map>{},
-          'basename_test.dart': <String, Map>{},
-          'dirname_test.dart': <String, Map>{},
-          'extension_test.dart': <String, Map>{},
-          'is_absolute_test.dart': <String, Map>{},
-          'is_relative_test.dart': <String, Map>{},
-          'join_test.dart': <String, Map>{},
-          'normalize_test.dart': <String, Map>{},
-          'relative_test.dart': <String, Map>{},
-          'split_test.dart': <String, Map>{}
-        }
-      };
-
-      expect(stripColors(tree.fromMap(map)), equals("""
-|-- .gitignore
-|-- README.md
-|-- TODO
-|-- example
-|   |-- console_example.dart
-|   |-- main.dart
-|   '-- web copy
-|       '-- web_example.dart
-|-- lib
-|   '-- path.dart
-|-- pubspec.yaml
-'-- test
-    |-- absolute_test.dart
-    |-- basename_test.dart
-    |-- dirname_test.dart
-    |-- extension_test.dart
-    |-- is_absolute_test.dart
-    |-- is_relative_test.dart
-    |-- join_test.dart
-    |-- normalize_test.dart
-    |-- relative_test.dart
-    '-- split_test.dart
-"""));
-    });
+  tearDown(() {
+    forceColors = ForceColorOption.auto;
+  });
+  test('tree.fromFiles no files', () {
+    expect(tree.fromFiles([], showFileSizes: true), equals(''));
   });
 
-  test('does not elide children if showAllChildren is true', () {
+  List<int> bytes(int size) => List.filled(size, 0);
+  testWithGolden('tree.fromFiles a complex example', colors: true, (ctx) async {
+    await dir(appPath, [
+      libPubspec('app', '1.0.0'),
+      file('TODO', bytes(10)),
+      dir('example', [
+        file('console_example.dart', bytes(1000)),
+        file('main.dart', bytes(1024)),
+        dir('web copy', [
+          file('web_example.dart', bytes(1025)),
+        ]),
+      ]),
+      dir('test', [
+        file('absolute_test.dart', bytes(0)),
+        file('basename_test.dart', bytes(1 << 20)),
+        file('dirname_test.dart', bytes((1 << 20) + 1)),
+        file('extension_test.dart', bytes(2300)),
+        file('is_absolute_test.dart', bytes(2400)),
+        file('is_relative_test.dart', bytes((1 << 20) * 25)),
+        file('join_test.dart', bytes(1023)),
+        file('normalize_test.dart', bytes((1 << 20) - 1)),
+        file('relative_test.dart', bytes(100)),
+        file('split_test.dart', bytes(1)),
+        file('all_test.dart', bytes(100)),
+        file('path_posix_test.dart', bytes(100)),
+        file('path_windows_test.dart', bytes(100)),
+      ]),
+      file('.gitignore', bytes(100)),
+      file('README.md', bytes(100)),
+      dir('lib', [
+        file('path.dart', bytes(100)),
+      ]),
+    ]).create();
+    var files = Package.load(
+      null,
+      path(appPath),
+      (name) => throw UnimplementedError(),
+    ).listFiles();
+    ctx.expectNextSection(
+        tree.fromFiles(files, baseDir: path(appPath), showFileSizes: true));
+  });
+  test('tree.fromMap empty map', () {
+    expect(tree.fromMap({}), equals(''));
+  });
+
+  testWithGolden('tree.fromMap a complex example', colors: true, (ctx) {
     var map = {
-      'dir': {
-        'a.dart': <String, Map>{},
-        'b.dart': <String, Map>{},
-        'c.dart': <String, Map>{},
-        'd.dart': <String, Map>{},
-        'e.dart': <String, Map>{},
-        'f.dart': <String, Map>{},
-        'g.dart': <String, Map>{},
-        'h.dart': <String, Map>{},
-        'i.dart': <String, Map>{},
-        'j.dart': <String, Map>{},
-        'k.dart': <String, Map>{},
-        'l.dart': <String, Map>{},
+      '.gitignore': <String, Map>{},
+      'README.md': <String, Map>{},
+      'TODO': <String, Map>{},
+      'example': {
+        'console_example.dart': <String, Map>{},
+        'main.dart': <String, Map>{},
+        'web copy': {'web_example.dart': <String, Map>{}},
+      },
+      'lib': {'path.dart': <String, Map>{}},
+      'pubspec.yaml': <String, Map>{},
+      'test': {
+        'absolute_test.dart': <String, Map>{},
+        'basename_test.dart': <String, Map>{},
+        'dirname_test.dart': <String, Map>{},
+        'extension_test.dart': <String, Map>{},
+        'is_absolute_test.dart': <String, Map>{},
+        'is_relative_test.dart': <String, Map>{},
+        'join_test.dart': <String, Map>{},
+        'normalize_test.dart': <String, Map>{},
+        'relative_test.dart': <String, Map>{},
+        'split_test.dart': <String, Map>{}
       }
     };
-    expect(stripColors(tree.fromMap(map, showAllChildren: true)), equals("""
-'-- dir
-    |-- a.dart
-    |-- b.dart
-    |-- c.dart
-    |-- d.dart
-    |-- e.dart
-    |-- f.dart
-    |-- g.dart
-    |-- h.dart
-    |-- i.dart
-    |-- j.dart
-    |-- k.dart
-    '-- l.dart
-"""));
+
+    ctx.expectNextSection(tree.fromMap(map));
   });
 }
diff --git a/test/golden_file.dart b/test/golden_file.dart
index 9db8ad0..3dcbfb6 100644
--- a/test/golden_file.dart
+++ b/test/golden_file.dart
@@ -46,10 +46,15 @@
   late String _header;
   final _results = <String>[];
   late bool _shouldRegenerateGolden;
+  final bool colors;
   bool _generatedNewData = false; // track if new data is generated
   int _nextSectionIndex = 0;
 
-  GoldenTestContext._(this._currentTestFile, this._testName) {
+  GoldenTestContext._(
+    this._currentTestFile,
+    this._testName, {
+    required this.colors,
+  }) {
     final rel = p.relative(
       _currentTestFile.replaceAll(RegExp(r'\.dart$'), ''),
       from: p.join(p.current, 'test'),
@@ -59,8 +64,8 @@
       'testdata',
       'goldens',
       rel,
-      // Sanitize the name, and add .txt
-      '${_testName.replaceAll(RegExp(r'[<>:"/\|?*%#]'), '~')}.txt',
+      // Sanitize the name, and add .ans or .txt.
+      '${_testName.replaceAll(RegExp(r'[<>:"/\|?*%#]'), '~')}.${colors ? 'ans' : 'txt'}',
     );
     _goldenFile = File(_goldenFilePath);
     _header = '# GENERATED BY: ${p.relative(_currentTestFile)}\n\n';
@@ -184,10 +189,12 @@
       s.writeln('\$ cd $directory');
     }
     s.writeln('\$ tree');
-    s.writeln(stripColors(ascii_tree.fromFiles(
+    final tree = ascii_tree.fromFiles(
       listDir(target, recursive: true),
       baseDir: target,
-    )));
+      showFileSizes: false,
+    );
+    s.writeln(colors ? tree : stripColors(tree));
 
     _expectSection(sectionIndex, s.toString());
   }
@@ -203,11 +210,20 @@
 ///   `test/testdata/goldens/path/to/myfile_test/<name>.txt`
 /// , when `path/to/myfile_test.dart` is the `_test.dart` file from which this
 /// function is called.
+///
+/// If [colors] is `true` the file will be created with an `.ans` extension that
+/// indicates ANSI colors will be used.
+///
+/// Such a file can eg. be viewed in vscode with this plugin:
+/// https://marketplace.visualstudio.com/items?itemName=iliazeus.vscode-ansi
 void testWithGolden(
-  String name,
-  FutureOr<void> Function(GoldenTestContext ctx) fn,
-) {
-  final ctx = GoldenTestContext._(_findCurrentTestFilename(), name);
+    String name, FutureOr<void> Function(GoldenTestContext ctx) fn,
+    {bool colors = false}) {
+  final ctx = GoldenTestContext._(
+    _findCurrentTestFilename(),
+    name,
+    colors: colors,
+  );
   test(name, () async {
     ctx._readGoldenFile();
     await fn(ctx);
diff --git a/test/testdata/goldens/ascii_tree_test/tree.fromFiles a complex example.ans b/test/testdata/goldens/ascii_tree_test/tree.fromFiles a complex example.ans
new file mode 100644
index 0000000..4ae381f
--- /dev/null
+++ b/test/testdata/goldens/ascii_tree_test/tree.fromFiles a complex example.ans
@@ -0,0 +1,26 @@
+# GENERATED BY: test/ascii_tree_test.dart
+
+[38;5;245m|-- [0mREADME.md [38;5;245m(<1 KB)[0m
+[38;5;245m|-- [0mTODO [38;5;245m(<1 KB)[0m
+[38;5;245m|-- [0mexample
+[38;5;245m|   [0m[38;5;245m|-- [0mconsole_example.dart [38;5;245m(<1 KB)[0m
+[38;5;245m|   [0m[38;5;245m|-- [0mmain.dart [38;5;245m(1 KB)[0m
+[38;5;245m|   [0m[38;5;245m'-- [0mweb copy
+[38;5;245m|   [0m    [38;5;245m'-- [0mweb_example.dart [38;5;245m(1 KB)[0m
+[38;5;245m|-- [0mlib
+[38;5;245m|   [0m[38;5;245m'-- [0mpath.dart [38;5;245m(<1 KB)[0m
+[38;5;245m|-- [0mpubspec.yaml [38;5;245m(<1 KB)[0m
+[38;5;245m'-- [0mtest
+    [38;5;245m|-- [0mabsolute_test.dart [38;5;245m(<1 KB)[0m
+    [38;5;245m|-- [0mall_test.dart [38;5;245m(<1 KB)[0m
+    [38;5;245m|-- [0mbasename_test.dart [33m(1 MB)[39m
+    [38;5;245m|-- [0mdirname_test.dart [33m(1 MB)[39m
+    [38;5;245m|-- [0mextension_test.dart [38;5;245m(2 KB)[0m
+    [38;5;245m|-- [0mis_absolute_test.dart [38;5;245m(2 KB)[0m
+    [38;5;245m|-- [0mis_relative_test.dart [33m(25 MB)[39m
+    [38;5;245m|-- [0mjoin_test.dart [38;5;245m(<1 KB)[0m
+    [38;5;245m|-- [0mnormalize_test.dart [38;5;245m(1023 KB)[0m
+    [38;5;245m|-- [0mpath_posix_test.dart [38;5;245m(<1 KB)[0m
+    [38;5;245m|-- [0mpath_windows_test.dart [38;5;245m(<1 KB)[0m
+    [38;5;245m|-- [0mrelative_test.dart [38;5;245m(<1 KB)[0m
+    [38;5;245m'-- [0msplit_test.dart [38;5;245m(<1 KB)[0m
diff --git a/test/testdata/goldens/ascii_tree_test/tree.fromMap a complex example.ans b/test/testdata/goldens/ascii_tree_test/tree.fromMap a complex example.ans
new file mode 100644
index 0000000..75932d7
--- /dev/null
+++ b/test/testdata/goldens/ascii_tree_test/tree.fromMap a complex example.ans
@@ -0,0 +1,24 @@
+# GENERATED BY: test/ascii_tree_test.dart
+
+[38;5;245m|-- [0m.gitignore
+[38;5;245m|-- [0mREADME.md
+[38;5;245m|-- [0mTODO
+[38;5;245m|-- [0mexample
+[38;5;245m|   [0m[38;5;245m|-- [0mconsole_example.dart
+[38;5;245m|   [0m[38;5;245m|-- [0mmain.dart
+[38;5;245m|   [0m[38;5;245m'-- [0mweb copy
+[38;5;245m|   [0m    [38;5;245m'-- [0mweb_example.dart
+[38;5;245m|-- [0mlib
+[38;5;245m|   [0m[38;5;245m'-- [0mpath.dart
+[38;5;245m|-- [0mpubspec.yaml
+[38;5;245m'-- [0mtest
+    [38;5;245m|-- [0mabsolute_test.dart
+    [38;5;245m|-- [0mbasename_test.dart
+    [38;5;245m|-- [0mdirname_test.dart
+    [38;5;245m|-- [0mextension_test.dart
+    [38;5;245m|-- [0mis_absolute_test.dart
+    [38;5;245m|-- [0mis_relative_test.dart
+    [38;5;245m|-- [0mjoin_test.dart
+    [38;5;245m|-- [0mnormalize_test.dart
+    [38;5;245m|-- [0mrelative_test.dart
+    [38;5;245m'-- [0msplit_test.dart
diff --git a/test/testdata/goldens/directory_option_test/commands taking a --directory~-C parameter work.txt b/test/testdata/goldens/directory_option_test/commands taking a --directory~-C parameter work.txt
index 9585341..30ff534 100644
--- a/test/testdata/goldens/directory_option_test/commands taking a --directory~-C parameter work.txt
+++ b/test/testdata/goldens/directory_option_test/commands taking a --directory~-C parameter work.txt
@@ -94,18 +94,18 @@
 ## Section 11
 $ pub publish -C myapp --dry-run
 Publishing test_pkg 1.0.0 to http://localhost:$PORT:
-|-- CHANGELOG.md
-|-- LICENSE
-|-- README.md
+|-- CHANGELOG.md (<1 KB)
+|-- LICENSE (<1 KB)
+|-- README.md (<1 KB)
 |-- bin
-|   '-- app.dart
+|   '-- app.dart (<1 KB)
 |-- example
-|   '-- pubspec.yaml
+|   '-- pubspec.yaml (<1 KB)
 |-- example2
-|   '-- pubspec.yaml
+|   '-- pubspec.yaml (<1 KB)
 |-- lib
-|   '-- test_pkg.dart
-'-- pubspec.yaml
+|   '-- test_pkg.dart (<1 KB)
+'-- pubspec.yaml (<1 KB)
 The server may enforce additional checks.
 [STDERR] 
 [STDERR] Package has 0 warnings.
diff --git a/test/testdata/goldens/lish/many_files_test/displays all files.txt b/test/testdata/goldens/lish/many_files_test/displays all files.txt
index 09a01da..81897c2 100644
--- a/test/testdata/goldens/lish/many_files_test/displays all files.txt
+++ b/test/testdata/goldens/lish/many_files_test/displays all files.txt
@@ -1,32 +1,32 @@
 # GENERATED BY: test/lish/many_files_test.dart
 
 Publishing test_pkg 1.0.0 to http://localhost:$PORT:
-|-- CHANGELOG.md
-|-- LICENSE
-|-- README.md
+|-- CHANGELOG.md (<1 KB)
+|-- LICENSE (<1 KB)
+|-- README.md (<1 KB)
 |-- lib
-|   |-- file_0.dart
-|   |-- file_1.dart
-|   |-- file_10.dart
-|   |-- file_11.dart
-|   |-- file_12.dart
-|   |-- file_13.dart
-|   |-- file_14.dart
-|   |-- file_15.dart
-|   |-- file_16.dart
-|   |-- file_17.dart
-|   |-- file_18.dart
-|   |-- file_19.dart
-|   |-- file_2.dart
-|   |-- file_3.dart
-|   |-- file_4.dart
-|   |-- file_5.dart
-|   |-- file_6.dart
-|   |-- file_7.dart
-|   |-- file_8.dart
-|   |-- file_9.dart
-|   '-- test_pkg.dart
-'-- pubspec.yaml
+|   |-- file_0.dart (<1 KB)
+|   |-- file_1.dart (<1 KB)
+|   |-- file_10.dart (<1 KB)
+|   |-- file_11.dart (<1 KB)
+|   |-- file_12.dart (<1 KB)
+|   |-- file_13.dart (<1 KB)
+|   |-- file_14.dart (<1 KB)
+|   |-- file_15.dart (<1 KB)
+|   |-- file_16.dart (<1 KB)
+|   |-- file_17.dart (<1 KB)
+|   |-- file_18.dart (<1 KB)
+|   |-- file_19.dart (<1 KB)
+|   |-- file_2.dart (<1 KB)
+|   |-- file_3.dart (<1 KB)
+|   |-- file_4.dart (<1 KB)
+|   |-- file_5.dart (<1 KB)
+|   |-- file_6.dart (<1 KB)
+|   |-- file_7.dart (<1 KB)
+|   |-- file_8.dart (<1 KB)
+|   |-- file_9.dart (<1 KB)
+|   '-- test_pkg.dart (<1 KB)
+'-- pubspec.yaml (<1 KB)
 
 Publishing is forever; packages cannot be unpublished.
 Policy details are available at https://pub.dev/policy
