OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library update_homebrew; | 5 library update_homebrew; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:convert'; | 8 import 'dart:convert'; |
9 import 'dart:io'; | 9 import 'dart:io'; |
10 | 10 |
11 import 'package:args/args.dart'; | 11 import 'package:args/args.dart'; |
12 import 'package:googleapis/common/common.dart' show DownloadOptions, Media; | 12 import 'package:googleapis/common/common.dart' show DownloadOptions, Media; |
13 import 'package:googleapis/storage/v1.dart' as storage; | 13 import 'package:googleapis/storage/v1.dart' as storage; |
14 import 'package:http/http.dart' as http; | 14 import 'package:http/http.dart' as http; |
15 import 'package:stack_trace/stack_trace.dart'; | 15 import 'package:stack_trace/stack_trace.dart'; |
16 | 16 |
17 String repository; // The path to the temporary git checkout of dart-homebrew. | 17 String repository; // The path to the temporary git checkout of dart-homebrew. |
18 Map gitEnvironment; // Pass a wrapper script for SSH to git in the environment. | 18 Map gitEnvironment; // Pass a wrapper script for SSH to git in the environment. |
19 | 19 |
20 const GITHUB_REPO = 'dart-lang/homebrew-dart'; | 20 const GITHUB_REPO = 'dart-lang/homebrew-dart'; |
21 | 21 |
22 const CHANNELS = const ['dev', 'stable']; | 22 const CHANNELS = const ['dev', 'stable']; |
23 | 23 |
24 const SDK_FILES = const [ | 24 const FILES = const [x64File, ia32File, dartiumFile, contentShellFile]; |
25 'sdk/dartsdk-macos-x64-release.zip', | |
26 'sdk/dartsdk-macos-ia32-release.zip' | |
27 ]; | |
28 | 25 |
29 const DARTIUM_FILES = const [ | 26 const urlBase = 'https://storage.googleapis.com/dart-archive/channels'; |
30 'dartium/dartium-macos-ia32-release.zip', | 27 const x64File = 'sdk/dartsdk-macos-x64-release.zip'; |
31 'dartium/content_shell-macos-ia32-release.zip' | 28 const ia32File = 'sdk/dartsdk-macos-ia32-release.zip'; |
32 ]; | 29 const dartiumFile = 'dartium/dartium-macos-ia32-release.zip'; |
33 | 30 const contentShellFile = 'dartium/content_shell-macos-ia32-release.zip'; |
34 final FILES = []..addAll(SDK_FILES)..addAll(DARTIUM_FILES); | |
35 | 31 |
36 Future<String> getHash256( | 32 Future<String> getHash256( |
37 String channel, String revision, String download) async { | 33 String channel, String revision, String download) async { |
38 var client = new http.Client(); | 34 var client = new http.Client(); |
39 try { | 35 try { |
40 var api = new storage.StorageApi(client); | 36 var api = new storage.StorageApi(client); |
41 var media = await api.objects.get('dart-archive', | 37 var media = await api.objects.get('dart-archive', |
42 'channels/$channel/release/$revision/$download.sha256sum', | 38 'channels/$channel/release/$revision/$download.sha256sum', |
43 downloadOptions: DownloadOptions.FullMedia); | 39 downloadOptions: DownloadOptions.FullMedia); |
44 | 40 |
(...skipping 13 matching lines...) Expand all Loading... |
58 'dart-archive', 'channels/$channel/release/$revision/VERSION', | 54 'dart-archive', 'channels/$channel/release/$revision/VERSION', |
59 downloadOptions: DownloadOptions.FullMedia); | 55 downloadOptions: DownloadOptions.FullMedia); |
60 | 56 |
61 var versionObject = await JSON.fuse(ASCII).decoder.bind(media.stream).first; | 57 var versionObject = await JSON.fuse(ASCII).decoder.bind(media.stream).first; |
62 return versionObject['version']; | 58 return versionObject['version']; |
63 } finally { | 59 } finally { |
64 client.close(); | 60 client.close(); |
65 } | 61 } |
66 } | 62 } |
67 | 63 |
68 Future setCurrentRevisions(Map revisions) async { | 64 Future<Map> getCurrentRevisions() async { |
| 65 var revisions = <String, String>{}; |
69 var lines = await (new File('$repository/dart.rb')).readAsLines(); | 66 var lines = await (new File('$repository/dart.rb')).readAsLines(); |
70 | 67 |
71 for (var channel in CHANNELS) { | 68 for (var channel in CHANNELS) { |
72 /// This RegExp between release/ and /sdk matches | 69 /// This RegExp between release/ and /sdk matches |
73 /// * 1 digit followed by | 70 /// * 1 digit followed by |
74 /// * Any number of letters, numbers, dashes and dots | 71 /// * Any number of letters, numbers, dashes and dots |
75 /// This covers both numeric- and version-formatted revisions | 72 /// This covers both numeric- and version-formatted revisions |
76 /// | 73 /// |
77 /// Note: all of the regexp escape slashes `\` are double-escaped within the | 74 /// Note: all of the regexp escape slashes `\` are double-escaped within the |
78 /// Dart string | 75 /// Dart string |
79 final regExp = | 76 final regExp = |
80 new RegExp('channels/$channel/release/(\\d[\\w\\d\\-\\.]*)/sdk'); | 77 new RegExp('channels/$channel/release/(\\d[\\w\\d\\-\\.]*)/sdk'); |
81 | 78 |
82 revisions[channel] = | 79 revisions[channel] = |
83 regExp.firstMatch(lines.firstWhere(regExp.hasMatch)).group(1); | 80 regExp.firstMatch(lines.firstWhere(regExp.hasMatch)).group(1); |
84 } | 81 } |
| 82 return revisions; |
85 } | 83 } |
86 | 84 |
87 Future setHashes(Map revisions, Map hashes) { | 85 Future<Map> getHashes(Map revisions) async { |
88 List waitOn = []; | 86 var hashes = <String, Map>{}; |
89 for (var channel in CHANNELS) { | 87 for (var channel in CHANNELS) { |
90 hashes[channel] = {}; | 88 hashes[channel] = {}; |
91 for (var file in FILES) { | 89 for (var file in FILES) { |
92 waitOn.add(getHash256(channel, revisions[channel], file).then((hash) { | 90 var hash = await getHash256(channel, revisions[channel], file); |
93 hashes[channel][file] = hash; | 91 hashes[channel][file] = hash; |
94 })); | |
95 } | 92 } |
96 } | 93 } |
97 return Future.wait(waitOn); | 94 return hashes; |
98 } | 95 } |
99 | 96 |
100 Future writeHomebrewInfo(String channel, String revision) async { | 97 Future writeHomebrewInfo(String channel, String revision) async { |
101 var revisions = {}; | 98 var revisions = await getCurrentRevisions(); |
102 var hashes = {}; | |
103 | |
104 await setCurrentRevisions(revisions); | |
105 | 99 |
106 if (revisions[channel] == revision) { | 100 if (revisions[channel] == revision) { |
107 print("Channel $channel is already at revision $revision in homebrew."); | 101 print("Channel $channel is already at revision $revision in homebrew."); |
108 exit(0); | 102 exit(0); |
109 } | 103 } |
110 revisions[channel] = revision; | 104 revisions[channel] = revision; |
111 await setHashes(revisions, hashes); | 105 var hashes = await getHashes(revisions); |
112 var devVersion = await getVersion('dev', revisions['dev']); | 106 var devVersion = await getVersion('dev', revisions['dev']); |
113 | 107 |
114 var stableVersion = await getVersion('stable', revisions['stable']); | 108 var stableVersion = await getVersion('stable', revisions['stable']); |
115 | 109 |
116 await (new File('$repository/dartium.rb').openWrite() | 110 await new File('$repository/dartium.rb').writeAsString( |
117 ..write(DartiumFile(revisions, hashes, devVersion, stableVersion))).close(); | 111 createDartiumFormula(revisions, hashes, devVersion, stableVersion), |
118 await (new File('$repository/dart.rb').openWrite() | 112 flush: true); |
119 ..write(DartFile(revisions, hashes, devVersion, stableVersion))).close(); | 113 await new File('$repository/dart.rb').writeAsString( |
| 114 createDartFormula(revisions, hashes, devVersion, stableVersion), |
| 115 flush: true); |
120 } | 116 } |
121 | 117 |
122 String DartiumFile( | 118 String createDartiumFormula( |
123 Map revisions, Map hashes, String devVersion, String stableVersion) { | 119 Map revisions, Map hashes, String devVersion, String stableVersion) => ''' |
124 final urlBase = 'https://storage.googleapis.com/dart-archive/channels'; | |
125 final dartiumFile = 'dartium/dartium-macos-ia32-release.zip'; | |
126 final contentShellFile = 'dartium/content_shell-macos-ia32-release.zip'; | |
127 | |
128 return ''' | |
129 require 'formula' | 120 require 'formula' |
130 | 121 |
131 class Dartium < Formula | 122 class Dartium < Formula |
132 homepage "https://www.dartlang.org" | 123 homepage "https://www.dartlang.org" |
133 | 124 |
134 version '$stableVersion' | 125 version '$stableVersion' |
135 url '$urlBase/stable/release/${revisions['stable']}/$dartiumFile' | 126 url '$urlBase/stable/release/${revisions['stable']}/$dartiumFile' |
136 sha256 '${hashes['stable'][dartiumFile]}' | 127 sha256 '${hashes['stable'][dartiumFile]}' |
137 | 128 |
138 devel do | 129 devel do |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 To use with IntelliJ, set the Dartium execute home to: | 165 To use with IntelliJ, set the Dartium execute home to: |
175 #{prefix}/Chromium.app | 166 #{prefix}/Chromium.app |
176 EOS | 167 EOS |
177 end | 168 end |
178 | 169 |
179 test do | 170 test do |
180 system "#{bin}/dartium" | 171 system "#{bin}/dartium" |
181 end | 172 end |
182 end | 173 end |
183 '''; | 174 '''; |
184 } | |
185 | 175 |
186 String DartFile( | 176 String createDartFormula( |
187 Map revisions, Map hashes, String devVersion, String stableVersion) { | 177 Map revisions, Map hashes, String devVersion, String stableVersion) => ''' |
188 final urlBase = 'https://storage.googleapis.com/dart-archive/channels'; | |
189 final x64File = 'sdk/dartsdk-macos-x64-release.zip'; | |
190 final ia32File = 'sdk/dartsdk-macos-ia32-release.zip'; | |
191 | |
192 return ''' | |
193 require 'formula' | 178 require 'formula' |
194 | 179 |
195 class Dart < Formula | 180 class Dart < Formula |
196 homepage 'https://www.dartlang.org/' | 181 homepage 'https://www.dartlang.org/' |
197 | 182 |
198 version '$stableVersion' | 183 version '$stableVersion' |
199 if MacOS.prefer_64_bit? | 184 if MacOS.prefer_64_bit? |
200 url '$urlBase/stable/release/${revisions['stable']}/$x64File' | 185 url '$urlBase/stable/release/${revisions['stable']}/$x64File' |
201 sha256 '${hashes['stable'][x64File]}' | 186 sha256 '${hashes['stable'][x64File]}' |
202 else | 187 else |
(...skipping 28 matching lines...) Expand all Loading... |
231 (testpath/'sample.dart').write <<-EOS.undent | 216 (testpath/'sample.dart').write <<-EOS.undent |
232 void main() { | 217 void main() { |
233 print(r"test message"); | 218 print(r"test message"); |
234 } | 219 } |
235 EOS | 220 EOS |
236 | 221 |
237 assert_equal "test message\\n", shell_output("#{bin}/dart sample.dart") | 222 assert_equal "test message\\n", shell_output("#{bin}/dart sample.dart") |
238 end | 223 end |
239 end | 224 end |
240 '''; | 225 '''; |
241 } | |
242 | 226 |
243 Future runGit(List<String> args) async { | 227 Future runGit(List<String> args) async { |
244 print("git ${args.join(' ')}"); | 228 print("git ${args.join(' ')}"); |
245 | 229 |
246 var result = await Process.run('git', args, | 230 var result = await Process.run('git', args, |
247 workingDirectory: repository, environment: gitEnvironment); | 231 workingDirectory: repository, environment: gitEnvironment); |
248 | 232 |
249 print(result.stdout); | 233 print(result.stdout); |
250 print(result.stderr); | 234 print(result.stderr); |
251 } | 235 } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 | 268 |
285 await runGit(['push']); | 269 await runGit(['push']); |
286 } finally { | 270 } finally { |
287 await tempDir.delete(recursive: true); | 271 await tempDir.delete(recursive: true); |
288 } | 272 } |
289 }, onError: (error, chain) { | 273 }, onError: (error, chain) { |
290 print(error); | 274 print(error); |
291 print(chain.terse); | 275 print(chain.terse); |
292 }); | 276 }); |
293 } | 277 } |
OLD | NEW |