// 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. // See: https://github.com/flutter/flutter/wiki/Release-process import 'dart:io' as io; import 'package:args/command_runner.dart'; import 'package:conductor_core/conductor_core.dart'; import 'package:file/file.dart'; import 'package:file/local.dart'; import 'package:platform/platform.dart'; import 'package:process/process.dart'; const String readmeUrl = 'https://github.com/flutter/flutter/tree/master/dev/conductor/README.md'; Future<void> main(List<String> args) async { const FileSystem fileSystem = LocalFileSystem(); const ProcessManager processManager = LocalProcessManager(); const Platform platform = LocalPlatform(); final Stdio stdio = VerboseStdio( stdout: io.stdout, stderr: io.stderr, stdin: io.stdin, ); final Checkouts checkouts = Checkouts( fileSystem: fileSystem, parentDirectory: _localFlutterRoot.parent, platform: platform, processManager: processManager, stdio: stdio, ); final CommandRunner<void> runner = CommandRunner<void>( 'conductor', 'A tool for coordinating Flutter releases. For more documentation on ' 'usage, please see $readmeUrl.', usageLineLength: 80, ); final String conductorVersion = (await const Git(processManager).getOutput( <String>['rev-parse'], 'Get the revision of the current Flutter SDK', workingDirectory: _localFlutterRoot.path, )).trim(); <Command<void>>[ CodesignCommand( checkouts: checkouts, flutterRoot: _localFlutterRoot, ), StatusCommand( checkouts: checkouts, ), StartCommand( checkouts: checkouts, conductorVersion: conductorVersion, ), CleanCommand( checkouts: checkouts, ), CandidatesCommand( checkouts: checkouts, flutterRoot: _localFlutterRoot, ), NextCommand( checkouts: checkouts, ), ].forEach(runner.addCommand); if (!assertsEnabled()) { stdio.printError('The conductor tool must be run with --enable-asserts.'); io.exit(1); } try { await runner.run(args); } on Exception catch (e, stacktrace) { stdio.printError('$e\n\n$stacktrace'); io.exit(1); } } Directory get _localFlutterRoot { String filePath; const FileSystem fileSystem = LocalFileSystem(); const Platform platform = LocalPlatform(); filePath = platform.script.toFilePath(); final String checkoutsDirname = fileSystem.path.normalize( fileSystem.path.join( fileSystem.path.dirname(filePath), // flutter/dev/conductor/core/bin '..', // flutter/dev/conductor/core '..', // flutter/dev/conductor '..', // flutter/dev '..', // flutter ), ); return fileSystem.directory(checkoutsDirname); }