| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:collection'; | 6 import 'dart:collection'; |
| 7 import 'dart:math' as math; | 7 import 'dart:math' as math; |
| 8 | 8 |
| 9 import 'src/arg_parser.dart'; | 9 import 'src/arg_parser.dart'; |
| 10 import 'src/arg_results.dart'; | 10 import 'src/arg_results.dart'; |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 /// A command is known as a "leaf command" if it has no subcommands and is meant | 183 /// A command is known as a "leaf command" if it has no subcommands and is meant |
| 184 /// to be run. Leaf commands must override [run]. | 184 /// to be run. Leaf commands must override [run]. |
| 185 /// | 185 /// |
| 186 /// A command with subcommands is known as a "branch command" and cannot be run | 186 /// A command with subcommands is known as a "branch command" and cannot be run |
| 187 /// itself. It should call [addSubcommand] (often from the constructor) to | 187 /// itself. It should call [addSubcommand] (often from the constructor) to |
| 188 /// register subcommands. | 188 /// register subcommands. |
| 189 abstract class Command { | 189 abstract class Command { |
| 190 /// The name of this command. | 190 /// The name of this command. |
| 191 String get name; | 191 String get name; |
| 192 | 192 |
| 193 /// A short description of this command. | 193 /// A description of this command, included in [usage]. |
| 194 String get description; | 194 String get description; |
| 195 | 195 |
| 196 /// A short description of this command, included in [parent]'s |
| 197 /// [CommandRunner.usage]. |
| 198 /// |
| 199 /// This defaults to the first line of [description]. |
| 200 String get summary => description.split("\n").first; |
| 201 |
| 196 /// A single-line template for how to invoke this command (e.g. `"pub get | 202 /// A single-line template for how to invoke this command (e.g. `"pub get |
| 197 /// [package]"`). | 203 /// [package]"`). |
| 198 String get invocation { | 204 String get invocation { |
| 199 var parents = [name]; | 205 var parents = [name]; |
| 200 for (var command = parent; command != null; command = command.parent) { | 206 for (var command = parent; command != null; command = command.parent) { |
| 201 parents.add(command.name); | 207 parents.add(command.name); |
| 202 } | 208 } |
| 203 parents.add(runner.executableName); | 209 parents.add(runner.executableName); |
| 204 | 210 |
| 205 var invocation = parents.reversed.join(" "); | 211 var invocation = parents.reversed.join(" "); |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 var visible = names.where((name) => !commands[name].hidden); | 370 var visible = names.where((name) => !commands[name].hidden); |
| 365 if (visible.isNotEmpty) names = visible; | 371 if (visible.isNotEmpty) names = visible; |
| 366 | 372 |
| 367 // Show the commands alphabetically. | 373 // Show the commands alphabetically. |
| 368 names = names.toList()..sort(); | 374 names = names.toList()..sort(); |
| 369 var length = names.map((name) => name.length).reduce(math.max); | 375 var length = names.map((name) => name.length).reduce(math.max); |
| 370 | 376 |
| 371 var buffer = | 377 var buffer = |
| 372 new StringBuffer('Available ${isSubcommand ? "sub" : ""}commands:'); | 378 new StringBuffer('Available ${isSubcommand ? "sub" : ""}commands:'); |
| 373 for (var name in names) { | 379 for (var name in names) { |
| 374 var lines = commands[name].description.split("\n"); | 380 var lines = commands[name].summary.split("\n"); |
| 375 buffer.writeln(); | 381 buffer.writeln(); |
| 376 buffer.write(' ${padRight(name, length)} ${lines.first}'); | 382 buffer.write(' ${padRight(name, length)} ${lines.first}'); |
| 377 | 383 |
| 378 for (var line in lines.skip(1)) { | 384 for (var line in lines.skip(1)) { |
| 379 buffer.writeln(); | 385 buffer.writeln(); |
| 380 buffer.write(' ' * (length + 5)); | 386 buffer.write(' ' * (length + 5)); |
| 381 buffer.write(line); | 387 buffer.write(line); |
| 382 } | 388 } |
| 383 } | 389 } |
| 384 | 390 |
| 385 return buffer.toString(); | 391 return buffer.toString(); |
| 386 } | 392 } |
| OLD | NEW |