Forward missing pub commands (#30115)
diff --git a/packages/flutter_tools/lib/src/commands/packages.dart b/packages/flutter_tools/lib/src/commands/packages.dart index e31b3ad..2740a29 100644 --- a/packages/flutter_tools/lib/src/commands/packages.dart +++ b/packages/flutter_tools/lib/src/commands/packages.dart
@@ -15,6 +15,14 @@ addSubcommand(PackagesGetCommand('get', false)); addSubcommand(PackagesGetCommand('upgrade', true)); addSubcommand(PackagesTestCommand()); + addSubcommand(PackagesForwardCommand('downgrade', 'Downgrade packages in a Flutter project', requiresPubspec: true)); + addSubcommand(PackagesForwardCommand('publish', 'Publish the current package to pub.dartlang.org', requiresPubspec: true)); + addSubcommand(PackagesForwardCommand('deps', 'Print package dependencies', requiresPubspec: true)); + addSubcommand(PackagesForwardCommand('run', 'Run an executable from a package', requiresPubspec: true)); + addSubcommand(PackagesForwardCommand('cache', 'Work with the Pub system cache')); + addSubcommand(PackagesForwardCommand('version', 'Print Pub version')); + addSubcommand(PackagesForwardCommand('uploader', 'Manage uploaders for a package on pub.dartlang.org')); + addSubcommand(PackagesForwardCommand('global', 'Work with Pub global packages')); addSubcommand(PackagesPassthroughCommand()); } @@ -129,6 +137,37 @@ } } +class PackagesForwardCommand extends FlutterCommand { + PackagesForwardCommand(this._commandName, this._description, {bool requiresPubspec = false}) { + if (requiresPubspec) { + requiresPubspecYaml(); + } + } + final String _commandName; + final String _description; + + @override + String get name => _commandName; + + @override + String get description { + return '$_description.\n' + 'This runs the "pub" tool in a Flutter context.'; + } + + @override + String get invocation { + return '${runner.executableName} packages $_commandName [<arguments...>]'; + } + + @override + Future<FlutterCommandResult> runCommand() async { + await pub(<String>[_commandName]..addAll(argResults.rest), context: PubContext.pubForward, retry: false); + return null; + } + +} + class PackagesPassthroughCommand extends FlutterCommand { PackagesPassthroughCommand() { requiresPubspecYaml();
diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart index d347d0a..5c53c2c 100644 --- a/packages/flutter_tools/lib/src/dart/pub.dart +++ b/packages/flutter_tools/lib/src/dart/pub.dart
@@ -41,6 +41,7 @@ static final PubContext interactive = PubContext._(<String>['interactive']); static final PubContext pubGet = PubContext._(<String>['get']); static final PubContext pubUpgrade = PubContext._(<String>['upgrade']); + static final PubContext pubForward = PubContext._(<String>['forward']); static final PubContext runTest = PubContext._(<String>['run_test']); static final PubContext flutterTests = PubContext._(<String>['flutter_tests']);
diff --git a/packages/flutter_tools/test/commands/packages_test.dart b/packages/flutter_tools/test/commands/packages_test.dart index 2d37e95..94dfbae 100644 --- a/packages/flutter_tools/test/commands/packages_test.dart +++ b/packages/flutter_tools/test/commands/packages_test.dart
@@ -308,7 +308,7 @@ Stdio: () => mockStdio, }); - testUsingContext('publish', () async { + testUsingContext('pub publish', () async { final PromptingProcess process = PromptingProcess(); mockProcessManager.processFactory = (List<String> commands) => process; final Future<void> runPackages = createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'pub', 'publish']); @@ -331,5 +331,84 @@ ProcessManager: () => mockProcessManager, Stdio: () => mockStdio, }); + + testUsingContext('publish', () async { + await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'publish']); + final List<String> commands = mockProcessManager.commands; + expect(commands, hasLength(3)); + expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub')); + expect(commands[1], '--trace'); + expect(commands[2], 'publish'); + }, overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + Stdio: () => mockStdio, + BotDetector: () => const AlwaysTrueBotDetector(), + }); + + testUsingContext('deps', () async { + await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'deps']); + final List<String> commands = mockProcessManager.commands; + expect(commands, hasLength(3)); + expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub')); + expect(commands[1], '--trace'); + expect(commands[2], 'deps'); + }, overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + Stdio: () => mockStdio, + BotDetector: () => const AlwaysTrueBotDetector(), + }); + + testUsingContext('cache', () async { + await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'cache']); + final List<String> commands = mockProcessManager.commands; + expect(commands, hasLength(3)); + expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub')); + expect(commands[1], '--trace'); + expect(commands[2], 'cache'); + }, overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + Stdio: () => mockStdio, + BotDetector: () => const AlwaysTrueBotDetector(), + }); + + testUsingContext('version', () async { + await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'version']); + final List<String> commands = mockProcessManager.commands; + expect(commands, hasLength(3)); + expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub')); + expect(commands[1], '--trace'); + expect(commands[2], 'version'); + }, overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + Stdio: () => mockStdio, + BotDetector: () => const AlwaysTrueBotDetector(), + }); + + testUsingContext('uploader', () async { + await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'uploader']); + final List<String> commands = mockProcessManager.commands; + expect(commands, hasLength(3)); + expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub')); + expect(commands[1], '--trace'); + expect(commands[2], 'uploader'); + }, overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + Stdio: () => mockStdio, + BotDetector: () => const AlwaysTrueBotDetector(), + }); + + testUsingContext('global', () async { + await createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'global', 'list']); + final List<String> commands = mockProcessManager.commands; + expect(commands, hasLength(4)); + expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub')); + expect(commands[1], '--trace'); + expect(commands[2], 'global'); + expect(commands[3], 'list'); + }, overrides: <Type, Generator>{ + ProcessManager: () => mockProcessManager, + Stdio: () => mockStdio, + BotDetector: () => const AlwaysTrueBotDetector(), + }); }); }