| 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..dfdf41fff81c18931e754654978db7f5dea23f6c 100644
|
| --- a/tools/apps/update_homebrew/bin/update_homebrew.dart
|
| +++ b/tools/apps/update_homebrew/bin/update_homebrew.dart
|
| @@ -4,59 +4,74 @@
|
|
|
| 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 GITHUB_REPO = 'dart-lang/homebrew-dart';
|
|
|
| -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);
|
| +const CHANNELS = const ['dev', 'stable'];
|
| +
|
| +const SDK_FILES = const [
|
| + 'sdk/dartsdk-macos-x64-release.zip',
|
| + 'sdk/dartsdk-macos-ia32-release.zip'
|
| +];
|
| +
|
| +const 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 +87,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 +173,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 +230,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 ${GITHUB_REPO} 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:${GITHUB_REPO}.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);
|
| + });
|
| }
|
|
|