| // Copyright 2014 The Flutter Authors. 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:completion/completion.dart'; | |
| import '../base/common.dart'; | |
| import '../base/file_system.dart'; | |
| import '../base/io.dart'; | |
| import '../context/tool_context.dart'; | |
| import '../runner/flutter_command.dart'; | |
| class ShellCompletionCommand extends FlutterCommand { | |
| ShellCompletionCommand({required super.toolContext}) { | |
| argParser.addFlag( | |
| 'overwrite', | |
| help: | |
| 'Causes the given shell completion setup script to be overwritten if it already exists.', | |
| ); | |
| } | |
| @override | |
| ToolContext get toolContext => super.toolContext!; | |
| @override | |
| final name = 'bash-completion'; | |
| @override | |
| final description = | |
| 'Output command line shell completion setup scripts.\n\n' | |
| 'This command prints the flutter command line completion setup script for Bash and Zsh. To ' | |
| 'use it, specify an output file and follow the instructions in the generated output file to ' | |
| 'install it in your shell environment. Once it is sourced, your shell will be able to ' | |
| 'complete flutter commands and options.'; | |
| @override | |
| final String category = FlutterCommandCategory.sdk; | |
| @override | |
| final aliases = <String>['zsh-completion']; | |
| @override | |
| bool get shouldUpdateCache => false; | |
| /// Return null to disable analytics recording of the `bash-completion` command. | |
| @override | |
| Future<String?> get usagePath async => null; | |
| @override | |
| Future<FlutterCommandResult> runCommand() async { | |
| final FileSystem fs = toolContext.fs; | |
| final Stdio stdio = toolContext.stdio; | |
| final List<String> rest = argResults?.rest ?? <String>[]; | |
| if (rest.length > 1) { | |
| throwToolExit('Too many arguments given to bash-completion command.', exitCode: 1); | |
| } | |
| if (rest.isEmpty || rest.first == '-') { | |
| final String script = generateCompletionScript(<String>['flutter']); | |
| stdio.stdoutWrite(script); | |
| return FlutterCommandResult.warning(); | |
| } | |
| final File outputFile = fs.file(rest.first); | |
| if (outputFile.existsSync() && !boolArg('overwrite')) { | |
| throwToolExit( | |
| 'Output file ${outputFile.path} already exists, will not overwrite. ' | |
| 'Use --overwrite to force overwriting existing output file.', | |
| exitCode: 1, | |
| ); | |
| } | |
| try { | |
| outputFile.writeAsStringSync(generateCompletionScript(<String>['flutter'])); | |
| } on FileSystemException catch (error) { | |
| throwToolExit('Unable to write shell completion setup script.\n$error', exitCode: 1); | |
| } | |
| return FlutterCommandResult.success(); | |
| } | |
| } |