| // Copyright 2020 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: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; | |
| try { | |
| 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. | |
| } finally { | |
| if (await tempDir.exists()) { | |
| await tempDir.delete(recursive: true); | |
| } | |
| } | |
| } | |
| } |