blob: 0a44e2ab33a0a4c6ffd085e7ade90ed7cbbb5462 [file] [log] [blame] [edit]
// Copyright 2013 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 'dart:io' as io;
import 'package:args/args.dart';
import 'package:args/command_runner.dart';
import 'src/post_checkout_command.dart';
import 'src/post_merge_command.dart';
import 'src/pre_push_command.dart';
import 'src/pre_rebase_command.dart';
/// Runs the githooks
Future<int> run(List<String> args) async {
final CommandRunner<bool> runner = CommandRunner<bool> (
'githooks',
'Githooks implementation for the flutter/engine repo.',
)
..addCommand(PostCheckoutCommand())
..addCommand(PostMergeCommand())
..addCommand(PrePushCommand())
..addCommand(PreRebaseCommand());
// Add top-level arguments.
runner.argParser
..addFlag(
'enable-clang-tidy',
help: 'Enable running clang-tidy on changed files.',
)
..addOption(
'flutter',
abbr: 'f',
help: 'The absolute path to the root of the flutter/engine checkout.',
)
..addFlag(
'verbose',
abbr: 'v',
help: 'Runs with verbose logging',
);
if (args.isEmpty) {
// The tool was invoked with no arguments. Print usage.
runner.printUsage();
return 1;
}
final ArgResults argResults = runner.parse(args);
final String? argMessage = _checkArgs(argResults);
if (argMessage != null) {
io.stderr.writeln(argMessage);
runner.printUsage();
return 1;
}
final bool commandResult = await runner.runCommand(argResults) ?? false;
return commandResult ? 0 : 1;
}
String? _checkArgs(ArgResults argResults) {
if (argResults.command?.name == 'help') {
return null;
}
if (argResults['help'] as bool) {
return null;
}
if (argResults['flutter'] == null) {
return 'The --flutter option is required';
}
final io.Directory dir = io.Directory(argResults['flutter'] as String);
if (!dir.isAbsolute) {
return 'The --flutter option must be an absolute path';
}
if (!dir.existsSync()) {
return 'The directory specified by the --flutter option must exist';
}
return null;
}