| Index: sdk/lib/_internal/pub/lib/src/command.dart
 | 
| diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
 | 
| index 68bbf320f0bcf9cb11ae7081bde9b9ab646f27ee..d1f8516dfe375629ab134ecf8dfb3c412b90173f 100644
 | 
| --- a/sdk/lib/_internal/pub/lib/src/command.dart
 | 
| +++ b/sdk/lib/_internal/pub/lib/src/command.dart
 | 
| @@ -27,27 +27,11 @@ import 'utils.dart';
 | 
|  /// The base class for commands for the pub executable.
 | 
|  abstract class PubCommand {
 | 
|    /// The commands that Pub understands.
 | 
| -  static Map<String, PubCommand> get commands {
 | 
| -    var commands = {
 | 
| -      'cache': new CacheCommand(),
 | 
| -      'deploy': new DeployCommand(),
 | 
| -      'help': new HelpCommand(),
 | 
| -      'install': new InstallCommand(),
 | 
| -      'publish': new LishCommand(),
 | 
| -      'update': new UpdateCommand(),
 | 
| -      'uploader': new UploaderCommand(),
 | 
| -      'version': new VersionCommand()
 | 
| -     };
 | 
| -    for (var command in commands.values.toList()) {
 | 
| -      for (var alias in command.aliases) {
 | 
| -        commands[alias] = command;
 | 
| -      }
 | 
| -    }
 | 
| -    return commands;
 | 
| -  }
 | 
| +  static final Map<String, PubCommand> commands = _initCommands();
 | 
|  
 | 
|    SystemCache cache;
 | 
| -  ArgResults globalOptions;
 | 
| +
 | 
| +  /// The parsed options for this command.
 | 
|    ArgResults commandOptions;
 | 
|  
 | 
|    Entrypoint entrypoint;
 | 
| @@ -67,25 +51,26 @@ abstract class PubCommand {
 | 
|    /// documentation, but they will work when invoked on the command line.
 | 
|    final aliases = const <String>[];
 | 
|  
 | 
| -  /// Override this to define command-specific options. The results will be made
 | 
| -  /// available in [commandOptions].
 | 
| -  ArgParser get commandParser => new ArgParser();
 | 
| +  /// The [ArgParser] for this command.
 | 
| +  final commandParser = new ArgParser();
 | 
|  
 | 
|    /// Override this to use offline-only sources instead of hitting the network.
 | 
|    /// This will only be called before the [SystemCache] is created. After that,
 | 
|    /// it has no effect.
 | 
|    bool get isOffline => false;
 | 
|  
 | 
| -  void run(String cacheDir, ArgResults globalOptions_,
 | 
| -      List<String> commandArgs) {
 | 
| -    globalOptions = globalOptions_;
 | 
| +  PubCommand() {
 | 
| +    // Allow "--help" after a command to get command help.
 | 
| +    commandParser.addFlag('help', abbr: 'h', negatable: false,
 | 
| +        help: 'Print usage information for this command.');
 | 
| +  }
 | 
| +
 | 
| +  void run(String cacheDir, ArgResults options) {
 | 
| +    commandOptions = options.command;
 | 
|  
 | 
| -    try {
 | 
| -      commandOptions = commandParser.parse(commandArgs);
 | 
| -    } on FormatException catch (e) {
 | 
| -      log.error(e.message);
 | 
| -      log.error('Use "pub help" for more information.');
 | 
| -      exit(exit_codes.USAGE);
 | 
| +    if (commandOptions['help']) {
 | 
| +      this.printUsage();
 | 
| +      return;
 | 
|      }
 | 
|  
 | 
|      cache = new SystemCache.withSources(cacheDir, isOffline: isOffline);
 | 
| @@ -113,14 +98,14 @@ abstract class PubCommand {
 | 
|        log.error(message);
 | 
|  
 | 
|        if (trace != null) {
 | 
| -        if (globalOptions['trace'] || !isUserFacingException(error)) {
 | 
| +        if (options['trace'] || !isUserFacingException(error)) {
 | 
|            log.error(trace);
 | 
|          } else {
 | 
|            log.fine(trace);
 | 
|          }
 | 
|        }
 | 
|  
 | 
| -      if (globalOptions['trace']) {
 | 
| +      if (options['trace']) {
 | 
|          log.dumpTranscript();
 | 
|        } else if (!isUserFacingException(error)) {
 | 
|          log.error("""
 | 
| @@ -198,3 +183,24 @@ and include the results in a bug report on http://dartbug.com/new.
 | 
|      }
 | 
|    }
 | 
|  }
 | 
| +
 | 
| +_initCommands() {
 | 
| +  var commands = {
 | 
| +    'cache': new CacheCommand(),
 | 
| +    'deploy': new DeployCommand(),
 | 
| +    'help': new HelpCommand(),
 | 
| +    'install': new InstallCommand(),
 | 
| +    'publish': new LishCommand(),
 | 
| +    'update': new UpdateCommand(),
 | 
| +    'uploader': new UploaderCommand(),
 | 
| +    'version': new VersionCommand()
 | 
| +  };
 | 
| +
 | 
| +  for (var command in commands.values.toList()) {
 | 
| +    for (var alias in command.aliases) {
 | 
| +      commands[alias] = command;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  return commands;
 | 
| +}
 | 
| 
 |