blob: 49bb085be7f12d3610c2c0daa9e6cd89d63ae084 [file] [log] [blame]
// Copyright 2023 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.
import 'dart:io';
import 'package:args/command_runner.dart';
import 'package:io/io.dart';
import 'package:path/path.dart' as path;
import '../utils.dart';
const _argCommit = 'commit';
/// This command updates the "devtools_rev" hash in the Dart SDK DEPS file with
/// the provided commit hash, and creates a Gerrit CL for review.
///
/// This hash is the ID for a DevTools build stored in CIPD, which is
/// automatically built and uploaded to CIPD on each DevTools commit.
///
/// To run this script:
/// `dt update-sdk-deps -c <commit-hash>`
class UpdateDartSdkDepsCommand extends Command {
UpdateDartSdkDepsCommand() {
argParser.addOption(
_argCommit,
abbr: 'c',
help: 'The DevTools commit hash to release into the Dart SDK.',
mandatory: true,
);
}
@override
String get name => 'update-sdk-deps';
@override
String get description =>
'Updates the "devtools_rev" hash in the Dart SDK DEPS file with the '
'provided commit hash, and creates a Gerrit CL for review';
@override
Future run() async {
final commit = argResults![_argCommit] as String;
final dartSdkLocation = localDartSdkLocation();
final processManager = ProcessManager();
print('Preparing a local Dart SDK branch...');
await DartSdkHelper.fetchAndCheckoutMaster(processManager);
await processManager.runAll(
workingDirectory: dartSdkLocation,
additionalErrorMessage: DartSdkHelper.commandDebugMessage,
commands: [
CliCommand.git([
'branch',
'-D',
'devtools-$commit',
], throwOnException: false),
CliCommand.git(['new-branch', 'devtools-$commit']),
],
);
print('Updating the DEPS file with the new DevTools hash...');
_writeToDepsFile(commit, dartSdkLocation);
print('Committing the changes and creating a Gerrit CL...');
await processManager.runAll(
workingDirectory: dartSdkLocation,
additionalErrorMessage: DartSdkHelper.commandDebugMessage,
commands: [
CliCommand.git(['add', 'DEPS']),
CliCommand.git(['commit', '-m', 'Update DevTools rev to $commit']),
CliCommand.git(['cl', 'upload', '-s', '-f']),
],
);
}
void _writeToDepsFile(String commit, String localDartSdkLocation) {
final depsFilePath = path.join(localDartSdkLocation, 'DEPS');
final depsFile = File(depsFilePath);
if (!depsFile.existsSync()) {
throw Exception('Count not find SDK DEPS file at: $depsFilePath');
}
final devToolsRevMarker = ' "devtools_rev":';
final newFileContent = StringBuffer();
final lines = depsFile.readAsLinesSync();
for (final line in lines) {
if (line.startsWith(devToolsRevMarker)) {
newFileContent.writeln('$devToolsRevMarker "$commit",');
} else {
newFileContent.writeln(line);
}
}
depsFile.writeAsStringSync(newFileContent.toString());
}
}