Chromium Code Reviews| Index: tools/apps/update_homebrew/bin/update_homebrew.dart |
| diff --git a/tools/apps/update_homebrew/bin/update_homebrew.dart b/tools/apps/update_homebrew/bin/update_homebrew.dart |
| index 5e72f9ca04d3179aeb3f8a9cd6e82b6e3268eedd..170062cd6cc2e88f09ffba280e2909deb131ee56 100644 |
| --- a/tools/apps/update_homebrew/bin/update_homebrew.dart |
| +++ b/tools/apps/update_homebrew/bin/update_homebrew.dart |
| @@ -4,59 +4,72 @@ |
| library update_homebrew; |
| -import 'dart:io'; |
| -import 'dart:convert'; |
| import 'dart:async'; |
| -import 'package:http/http.dart' as http; |
| +import 'dart:convert'; |
| +import 'dart:io'; |
| + |
| import 'package:args/args.dart'; |
| -import 'package:googleapis/storage/v1.dart' as storage; |
| import 'package:googleapis/common/common.dart' show DownloadOptions, Media; |
| +import 'package:googleapis/storage/v1.dart' as storage; |
| +import 'package:http/http.dart' as http; |
| +import 'package:stack_trace/stack_trace.dart'; |
| -String repository; // The path to the temporary git checkout of dart-homebrew. |
| -Map gitEnvironment; // Pass a wrapper script for SSH to git in the environment. |
| +String repository; // The path to the temporary git checkout of dart-homebrew. |
| +Map gitEnvironment; // Pass a wrapper script for SSH to git in the environment. |
| -final CHANNELS = ['dev', 'stable']; |
| +const _githubRepo = 'dart-lang/homebrew-dart'; |
|
Bill Hesse
2015/06/01 07:38:48
No other const or identifier in the script is priv
kevmoo
2015/06/01 16:51:29
Done.
|
| -final SDK_FILES = ['sdk/dartsdk-macos-x64-release.zip', |
| - 'sdk/dartsdk-macos-ia32-release.zip' ]; |
| -final DARTIUM_FILES = ['dartium/dartium-macos-ia32-release.zip', |
| - 'dartium/content_shell-macos-ia32-release.zip']; |
| -final FILES = []..addAll(SDK_FILES)..addAll(DARTIUM_FILES); |
| +final CHANNELS = const ['dev', 'stable']; |
| +final SDK_FILES = const [ |
| + 'sdk/dartsdk-macos-x64-release.zip', |
| + 'sdk/dartsdk-macos-ia32-release.zip' |
| +]; |
| +final DARTIUM_FILES = const [ |
| + 'dartium/dartium-macos-ia32-release.zip', |
| + 'dartium/content_shell-macos-ia32-release.zip' |
| +]; |
| +final FILES = []..addAll(SDK_FILES)..addAll(DARTIUM_FILES); |
| -Future<String> getHash256(String channel, int revision, String download) { |
| +Future<String> getHash256(String channel, int revision, String download) async { |
| var client = new http.Client(); |
| - var api = new storage.StorageApi(client); |
| - return |
| - api.objects.get('dart-archive', |
| - 'channels/$channel/release/$revision/$download.sha256sum', |
| - downloadOptions: DownloadOptions.FullMedia) |
| - .then((Media media) => ASCII.decodeStream(media.stream)) |
| - .then((hashLine) => new RegExp('[0-9a-fA-F]*').stringMatch(hashLine)) |
| - .whenComplete(client.close); |
| + try { |
| + var api = new storage.StorageApi(client); |
| + var media = await api.objects.get('dart-archive', |
| + 'channels/$channel/release/$revision/$download.sha256sum', |
| + downloadOptions: DownloadOptions.FullMedia); |
| + |
| + var hashLine = await ASCII.decodeStream(media.stream); |
| + return new RegExp('[0-9a-fA-F]*').stringMatch(hashLine); |
| + } finally { |
| + client.close(); |
| + } |
| } |
| -Future<String> getVersion(String channel, int revision) { |
| +Future<String> getVersion(String channel, int revision) async { |
| var client = new http.Client(); |
| - var api = new storage.StorageApi(client); |
| - return api.objects.get('dart-archive', |
| - 'channels/$channel/release/$revision/VERSION', |
| - downloadOptions: DownloadOptions.FullMedia) |
| - .then((Media media) => JSON.fuse(ASCII).decoder.bind(media.stream).first) |
| - .then((versionObject) => versionObject['version']) |
| - .whenComplete(client.close); |
| + try { |
| + var api = new storage.StorageApi(client); |
| + |
| + var media = await api.objects.get( |
| + 'dart-archive', 'channels/$channel/release/$revision/VERSION', |
| + downloadOptions: DownloadOptions.FullMedia); |
| + |
| + var versionObject = await JSON.fuse(ASCII).decoder.bind(media.stream).first; |
| + return versionObject['version']; |
| + } finally { |
| + client.close(); |
| + } |
| } |
| -Future setCurrentRevisions(Map revisions) { |
| - return new File('$repository/dart.rb') |
| - .readAsLines() |
| - .then((lines) { |
| - for (var channel in CHANNELS) { |
| - final regExp = new RegExp('channels/$channel/release/(\\d*)/sdk'); |
| - revisions[channel] = |
| - regExp.firstMatch(lines.firstWhere(regExp.hasMatch)).group(1); |
| - } |
| - }); |
| +Future setCurrentRevisions(Map revisions) async { |
| + var lines = await (new File('$repository/dart.rb')).readAsLines(); |
| + |
| + for (var channel in CHANNELS) { |
| + final regExp = new RegExp('channels/$channel/release/(\\d*)/sdk'); |
| + revisions[channel] = |
| + regExp.firstMatch(lines.firstWhere(regExp.hasMatch)).group(1); |
| + } |
| } |
| Future setHashes(Map revisions, Map hashes) { |
| @@ -72,39 +85,30 @@ Future setHashes(Map revisions, Map hashes) { |
| return Future.wait(waitOn); |
| } |
| -Future writeHomebrewInfo(String channel, int revision) { |
| +Future writeHomebrewInfo(String channel, int revision) async { |
| var revisions = {}; |
| var hashes = {}; |
| - var devVersion; |
| - var stableVersion; |
| - return setCurrentRevisions(revisions).then((_) { |
| - if (revisions[channel] == revision) { |
| - print("Channel $channel is already at revision $revision in homebrew."); |
| - exit(0); |
| - } |
| - revisions[channel] = revision; |
| - return setHashes(revisions, hashes); |
| - }).then((_) { |
| - return getVersion('dev', revisions['dev']); |
| - }).then((version) { |
| - devVersion = version; |
| - return getVersion('stable', revisions['stable']); |
| - }).then((version) { |
| - stableVersion = version; |
| - return (new File('$repository/dartium.rb').openWrite() |
| - ..write(DartiumFile(revisions, hashes, devVersion, stableVersion))) |
| - .close(); |
| - }).then((_) { |
| - return (new File('$repository/dart.rb').openWrite() |
| - ..write(DartFile(revisions, hashes, devVersion, stableVersion))) |
| - .close(); |
| - }); |
| + |
| + await setCurrentRevisions(revisions); |
| + |
| + if (revisions[channel] == revision) { |
| + print("Channel $channel is already at revision $revision in homebrew."); |
| + exit(0); |
| + } |
| + revisions[channel] = revision; |
| + await setHashes(revisions, hashes); |
| + var devVersion = await getVersion('dev', revisions['dev']); |
| + |
| + var stableVersion = await getVersion('stable', revisions['stable']); |
| + |
| + await (new File('$repository/dartium.rb').openWrite() |
| + ..write(DartiumFile(revisions, hashes, devVersion, stableVersion))).close(); |
| + await (new File('$repository/dart.rb').openWrite() |
| + ..write(DartFile(revisions, hashes, devVersion, stableVersion))).close(); |
| } |
| -String DartiumFile(Map revisions, |
| - Map hashes, |
| - String devVersion, |
| - String stableVersion) { |
| +String DartiumFile( |
| + Map revisions, Map hashes, String devVersion, String stableVersion) { |
| final urlBase = 'https://storage.googleapis.com/dart-archive/channels'; |
| final dartiumFile = 'dartium/dartium-macos-ia32-release.zip'; |
| final contentShellFile = 'dartium/content_shell-macos-ia32-release.zip'; |
| @@ -167,10 +171,8 @@ end |
| '''; |
| } |
| -String DartFile(Map revisions, |
| - Map hashes, |
| - String devVersion, |
| - String stableVersion) { |
| +String DartFile( |
| + Map revisions, Map hashes, String devVersion, String stableVersion) { |
| final urlBase = 'https://storage.googleapis.com/dart-archive/channels'; |
| final x64File = 'sdk/dartsdk-macos-x64-release.zip'; |
| final ia32File = 'sdk/dartsdk-macos-ia32-release.zip'; |
| @@ -226,42 +228,54 @@ end |
| '''; |
| } |
| -Future runGit(List<String> args) { |
| +Future runGit(List<String> args) async { |
| print("git ${args.join(' ')}"); |
| - return Process.run('git', args, workingDirectory: repository, |
| - environment: gitEnvironment) |
| - .then((result) { |
| - print(result.stdout); |
| - print(result.stderr); |
| - }); |
| + |
| + var result = await Process.run('git', args, |
| + workingDirectory: repository, environment: gitEnvironment); |
| + |
| + print(result.stdout); |
| + print(result.stderr); |
| } |
| -main(args) { |
| +main(args) async { |
| final parser = new ArgParser() |
| - ..addOption('revision', abbr: 'r') |
| - ..addOption('channel', abbr: 'c', allowed: ['dev', 'stable']) |
| - ..addOption('key', abbr: 'k'); |
| + ..addOption('revision', abbr: 'r') |
| + ..addOption('channel', abbr: 'c', allowed: ['dev', 'stable']) |
| + ..addOption('key', abbr: 'k'); |
| final options = parser.parse(args); |
| final revision = options['revision']; |
| final channel = options['channel']; |
| - if ([revision, channel, options['key']].contains(null)) { |
| + final key = options['key']; |
| + if ([revision, channel, key].contains(null)) { |
| print("Usage: update_homebrew.dart -r revision -c channel -k ssh_key\n" |
| - " ssh_key should allow pushes to dart-lang/homebrew-dart on github"); |
| + " ssh_key should allow pushes to ${_githubRepo} on github"); |
| return; |
| } |
| final sshWrapper = Platform.script.resolve('ssh_with_key').toFilePath(); |
| - gitEnvironment = {'GIT_SSH': sshWrapper, |
| - 'SSH_KEY_PATH': options['key']}; |
| - |
| - Directory.systemTemp.createTemp('update_homebrew') |
| - .then((tempDir) { |
| - repository = tempDir.path; |
| - }) |
| - .then((_) => runGit( |
| - ['clone', 'git@github.com:dart-lang/homebrew-dart.git', '.'])) |
| - .then((_) => writeHomebrewInfo(channel, revision)) |
| - .then((_) => runGit(['commit', '-a', '-m', |
| - 'Updated $channel branch to revision $revision'])) |
| - .then((_) => runGit(['push'])) |
| - .whenComplete(() => new Directory(repository).delete(recursive: true)); |
| + gitEnvironment = {'GIT_SSH': sshWrapper, 'SSH_KEY_PATH': key}; |
| + |
| + Chain.capture(() async { |
| + var tempDir = await Directory.systemTemp.createTemp('update_homebrew'); |
| + |
| + try { |
| + repository = tempDir.path; |
| + |
| + await runGit(['clone', 'git@github.com:${_githubRepo}.git', '.']); |
| + await writeHomebrewInfo(channel, revision); |
| + await runGit([ |
| + 'commit', |
| + '-a', |
| + '-m', |
| + 'Updated $channel branch to revision $revision' |
| + ]); |
| + |
| + await runGit(['push']); |
| + } finally { |
| + await tempDir.delete(recursive: true); |
| + } |
| + }, onError: (error, chain) { |
| + print(error); |
| + print(chain.terse); |
| + }); |
| } |