| // Copyright (c) 2013, 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. |
| |
| import 'package:args/args.dart'; |
| import 'package:args/command_runner.dart'; |
| |
| import 'entrypoint.dart'; |
| import 'global_packages.dart'; |
| import 'log.dart' as log; |
| import 'system_cache.dart'; |
| |
| /// The base class for commands for the pub executable. |
| /// |
| /// A command may either be a "leaf" command or it may be a parent for a set |
| /// of subcommands. Only leaf commands are ever actually invoked. If a command |
| /// has subcommands, then one of those must always be chosen. |
| abstract class PubCommand extends Command { |
| SystemCache get cache { |
| if (_cache == null) _cache = new SystemCache(isOffline: isOffline); |
| return _cache; |
| } |
| |
| SystemCache _cache; |
| |
| GlobalPackages get globals { |
| if (_globals == null) { |
| _globals = new GlobalPackages(cache); |
| } |
| return _globals; |
| } |
| |
| GlobalPackages _globals; |
| |
| /// Gets the [Entrypoint] package for the current working directory. |
| /// |
| /// This will load the pubspec and fail with an error if the current directory |
| /// is not a package. |
| Entrypoint get entrypoint { |
| // Lazy load it. |
| if (_entrypoint == null) { |
| _entrypoint = new Entrypoint.current(cache); |
| } |
| return _entrypoint; |
| } |
| |
| Entrypoint _entrypoint; |
| |
| /// The URL for web documentation for this command. |
| String get docUrl => null; |
| |
| /// Override this and return `false` to disallow trailing options from being |
| /// parsed after a non-option argument is parsed. |
| bool get allowTrailingOptions => true; |
| |
| ArgParser get argParser { |
| // Lazily initialize the parser because the superclass constructor requires |
| // it but we want to initialize it based on [allowTrailingOptions]. |
| if (_argParser == null) { |
| _argParser = new ArgParser(allowTrailingOptions: allowTrailingOptions); |
| } |
| return _argParser; |
| } |
| |
| ArgParser _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. This only needs to be set in leaf commands. |
| bool get isOffline => false; |
| |
| String get usageFooter { |
| if (docUrl == null) return null; |
| return "See $docUrl for detailed documentation."; |
| } |
| |
| void printUsage() { |
| log.message(usage); |
| } |
| |
| /// Parses a user-supplied integer [intString] named [name]. |
| /// |
| /// If the parsing fails, prints a usage message and exits. |
| int parseInt(String intString, String name) { |
| try { |
| return int.parse(intString); |
| } on FormatException catch (_) { |
| usageException('Could not parse $name "$intString".'); |
| return null; |
| } |
| } |
| } |