blob: 9abc2725f40ba75a2f03a1deb8851d8cba1d566d [file] [log] [blame] [edit]
// Copyright 2020 The Chromium 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:async';
import 'dart:io' as io;
import 'package:args/command_runner.dart';
import '../model.dart';
const _toVersionArg = 'to-version';
class RollbackCommand extends Command {
RollbackCommand() : super() {
argParser.addOption(_toVersionArg, mandatory: true);
}
@override
String get name => 'rollback';
@override
String get description => 'Rolls back to a specific DevTools version.';
@override
Future run() async {
final repo = DevToolsRepo.getInstance();
print('DevTools repo at ${repo.repoPath}.');
final tempDir =
(await io.Directory.systemTemp.createTemp('devtools-rollback'))
.absolute;
print('file://${tempDir.path}');
final tarball = io.File(
'${tempDir.path}/devtools.tar.gz',
);
final extractDir =
await io.Directory('${tempDir.path}/extract/').absolute.create();
final client = io.HttpClient();
final version = argResults![_toVersionArg] as String;
print('downloading tarball to ${tarball.path}');
final tarballRequest = await client.getUrl(
Uri.http(
'storage.googleapis.com',
'pub-packages/packages/devtools-$version.tar.gz',
),
);
final tarballResponse = await tarballRequest.close();
await tarballResponse.pipe(tarball.openWrite());
print('Tarball written; unzipping.');
await io.Process.run(
'tar',
['-x', '-z', '-f', tarball.path.split('/').last, '-C', extractDir.path],
workingDirectory: tempDir.path,
);
print('file://${tempDir.path}');
final buildDir = io.Directory('${repo.repoPath}/packages/devtools/build/');
await buildDir.delete(recursive: true);
await io.Directory('${extractDir.path}build/')
.rename('${repo.repoPath}/packages/devtools/build/');
print('Build outputs from Devtools version $version checked out and moved '
'to ${buildDir.path}');
print('To complete the rollback, go to ${repo.repoPath}/packages/devtools, '
'rev pubspec.yaml, update the changelog, unhide build/ from the '
'packages/devtools/.gitignore file, then run pub publish.');
// TODO(djshuckerow): automatically rev pubspec.yaml and update the
// changelog so that the user can just run pub publish from
// packages/devtools.
}
}