blob: 5fe8de30133d8b206ab652b49b97664c98c25ae2 [file] [log] [blame]
// 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 '../globals.dart' as globals;
import '../runner/flutter_command.dart';
class ShellCompletionCommand extends FlutterCommand {
ShellCompletionCommand() {
argParser.addFlag(
'overwrite',
help: 'Causes the given shell completion setup script to be overwritten if it already exists.',
);
}
@override
final String name = 'bash-completion';
@override
final String 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 List<String> 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 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']);
globals.stdio.stdoutWrite(script);
return FlutterCommandResult.warning();
}
final File outputFile = globals.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();
}
}