Skip to content

Commit 135ce90

Browse files
authoredSep 2, 2021
Add support for updating arm64 versions of homebrew (#97)
* Add basic update formula test. * Add missing copyright notices.
1 parent dbd58a4 commit 135ce90

File tree

5 files changed

+130
-34
lines changed

5 files changed

+130
-34
lines changed
 

‎lib/src/formula.dart

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
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.
4+
5+
String updateFormula(String channel, String contents, String version,
6+
Map<String, String> hashes) {
7+
// Replace the version identifier. Formulas with stable and pre-release
8+
// versions have multiple identifiers and only the right one should be
9+
// updated.
10+
var versionId = channel == 'stable'
11+
? RegExp(r'version \"\d+\.\d+.\d+\"')
12+
: RegExp(r'version \"\d+\.\d+.\d+\-.+\"');
13+
contents = contents.replaceAll(versionId, 'version "$version"');
14+
15+
// Extract files and hashes that are stored in the formula in this format:
16+
// url "<url base>/<channel>/release/<version>/sdk/<artifact>.zip"
17+
// sha256 "<hash>"
18+
var filesAndHashes = RegExp(
19+
'channels/$channel/release'
20+
r'/(\d[\w\d\-\.]*)/sdk/([\w\d\-\.]+)\"\n(\s+)sha256 \"[\da-f]+\"',
21+
multiLine: true);
22+
return contents.replaceAllMapped(filesAndHashes, (m) {
23+
var currentVersion = m.group(1);
24+
if (currentVersion == version) {
25+
throw ArgumentError(
26+
'Channel $channel is already at version $version in homebrew.');
27+
}
28+
var artifact = m.group(2);
29+
var indent = m.group(3);
30+
return 'channels/$channel/release/$version/sdk/$artifact"\n'
31+
'${indent}sha256 "${hashes[artifact]}"';
32+
});
33+
}

‎lib/src/impl.dart

+5-33
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
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.
4+
15
part of '../update_homebrew.dart';
26

37
const _files = [
8+
'dartsdk-macos-arm64-release.zip',
49
'dartsdk-macos-x64-release.zip',
510
'dartsdk-linux-x64-release.zip',
611
'dartsdk-linux-arm64-release.zip',
@@ -23,39 +28,6 @@ Future<String> _getHash256(
2328
}
2429
}
2530

26-
Future<void> _updateFormula(String channel, File file, String version,
27-
Map<String, String> hashes) async {
28-
var contents = await file.readAsString();
29-
30-
// Replace the version identifier. Formulas with stable and pre-release
31-
// versions have multiple identifiers and only the right one should be
32-
// updated.
33-
var versionId = channel == 'stable'
34-
? RegExp(r'version \"\d+\.\d+.\d+\"')
35-
: RegExp(r'version \"\d+\.\d+.\d+\-.+\"');
36-
contents = contents.replaceAll(versionId, 'version "$version"');
37-
38-
// Extract files and hashes that are stored in the formula in this format:
39-
// url "<url base>/<channel>/release/<version>/sdk/<artifact>.zip"
40-
// sha256 "<hash>"
41-
var filesAndHashes = RegExp(
42-
'channels/$channel/release'
43-
r'/(\d[\w\d\-\.]*)/sdk/([\w\d\-\.]+)\"\n(\s+)sha256 \"[\da-f]+\"',
44-
multiLine: true);
45-
contents = contents.replaceAllMapped(filesAndHashes, (m) {
46-
var currentVersion = m.group(1);
47-
if (currentVersion == version) {
48-
throw ArgumentError(
49-
'Channel $channel is already at version $version in homebrew.');
50-
}
51-
var artifact = m.group(2);
52-
var indent = m.group(3);
53-
return 'channels/$channel/release/$version/sdk/$artifact"\n'
54-
'${indent}sha256 "${hashes[artifact]}"';
55-
});
56-
await file.writeAsString(contents, flush: true);
57-
}
58-
5931
Future<Map<String, String>> _getHashes(String channel, String version) async {
6032
return <String, String>{
6133
for (var file in _files) file: await _getHash256(channel, version, file)

‎lib/update_homebrew.dart

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
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.
4+
15
import 'dart:async';
26
import 'dart:convert';
37
import 'dart:io';
@@ -7,6 +11,8 @@ import 'package:googleapis/storage/v1.dart' as storage;
711
import 'package:http/http.dart' as http;
812
import 'package:path/path.dart' as p;
913

14+
import 'src/formula.dart';
15+
1016
part 'src/impl.dart';
1117

1218
const githubRepo = 'dart-lang/homebrew-dart';
@@ -22,8 +28,10 @@ Iterable<String> get supportedChannels => formulaByChannel.keys;
2228
Future<void> writeHomebrewInfo(
2329
String channel, String version, String repository) async {
2430
var formula = File(p.join(repository, formulaByChannel[channel]));
31+
var contents = await formula.readAsString();
2532
var hashes = await _getHashes(channel, version);
26-
await _updateFormula(channel, formula, version, hashes);
33+
var updated = updateFormula(channel, contents, version, hashes);
34+
await formula.writeAsString(updated, flush: true);
2735
}
2836

2937
Future<void> runGit(List<String> args, String repository,

‎test/formula_test.dart

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
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.
4+
5+
import 'package:test/test.dart';
6+
import 'package:update_homebrew/src/formula.dart';
7+
8+
const _devFormula = '''
9+
head do
10+
version "2.15.0-65.0.dev"
11+
if OS.mac? && Hardware::CPU.intel?
12+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.15.0-65.0.dev/sdk/dartsdk-macos-x64-release.zip"
13+
sha256 "9c71429a806dd2ac7968542771764dd5d1b7c71fd03851c6870eb5c3f687fb1b"
14+
elsif OS.mac? && Hardware::CPU.arm?
15+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.15.0-65.0.dev/sdk/dartsdk-macos-arm64-release.zip"
16+
sha256 "754521d866bf2e878d2b4a33be96ece27a6381aa4b73a397d0b349bdd87b4eaa"
17+
elsif OS.linux? && Hardware::CPU.intel?
18+
if Hardware::CPU.is_64_bit?
19+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.15.0-65.0.dev/sdk/dartsdk-linux-x64-release.zip"
20+
sha256 "af6537fe9b248f704420e05a88eedb0b2b0db9c8f3e996da90aabd2037543286"
21+
else
22+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.15.0-65.0.dev/sdk/dartsdk-linux-ia32-release.zip"
23+
sha256 "a19f58988af2098a8f7ae4996fa25f95a86d43188fd0a796cc3740a5eeb2a855"
24+
end
25+
elsif OS.linux? && Hardware::CPU.arm?
26+
if Hardware::CPU.is_64_bit?
27+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.15.0-65.0.dev/sdk/dartsdk-linux-arm64-release.zip"
28+
sha256 "e9f3bc610cea89c972a85767d86ab424cce6cab46e3da4065cfdd1aadfc43bef"
29+
else
30+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.15.0-65.0.dev/sdk/dartsdk-linux-arm-release.zip"
31+
sha256 "71da750dd2e78970b69c3b2cb388527d7a1ccd70ea8e8cacb5bba191841effa0"
32+
end
33+
end
34+
end
35+
''';
36+
37+
const _devFormulaExpected = '''
38+
head do
39+
version "2.16.0-76.0.dev"
40+
if OS.mac? && Hardware::CPU.intel?
41+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.16.0-76.0.dev/sdk/dartsdk-macos-x64-release.zip"
42+
sha256 "bbb"
43+
elsif OS.mac? && Hardware::CPU.arm?
44+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.16.0-76.0.dev/sdk/dartsdk-macos-arm64-release.zip"
45+
sha256 "aaa"
46+
elsif OS.linux? && Hardware::CPU.intel?
47+
if Hardware::CPU.is_64_bit?
48+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.16.0-76.0.dev/sdk/dartsdk-linux-x64-release.zip"
49+
sha256 "ccc"
50+
else
51+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.16.0-76.0.dev/sdk/dartsdk-linux-ia32-release.zip"
52+
sha256 "eee"
53+
end
54+
elsif OS.linux? && Hardware::CPU.arm?
55+
if Hardware::CPU.is_64_bit?
56+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.16.0-76.0.dev/sdk/dartsdk-linux-arm64-release.zip"
57+
sha256 "ddd"
58+
else
59+
url "https://storage.googleapis.com/dart-archive/channels/dev/release/2.16.0-76.0.dev/sdk/dartsdk-linux-arm-release.zip"
60+
sha256 "fff"
61+
end
62+
end
63+
end
64+
''';
65+
66+
main() {
67+
test('update dev formula', () {
68+
var hashes = {
69+
'dartsdk-macos-arm64-release.zip': 'aaa',
70+
'dartsdk-macos-x64-release.zip': 'bbb',
71+
'dartsdk-linux-x64-release.zip': 'ccc',
72+
'dartsdk-linux-arm64-release.zip': 'ddd',
73+
'dartsdk-linux-ia32-release.zip': 'eee',
74+
'dartsdk-linux-arm-release.zip': 'fff',
75+
};
76+
var updated = updateFormula('dev', _devFormula, '2.16.0-76.0.dev', hashes);
77+
expect(updated, _devFormulaExpected);
78+
});
79+
}

‎test/update_homebrew_test.dart

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
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.
4+
15
import 'package:test/test.dart';
26

37
main() {

0 commit comments

Comments
 (0)
Please sign in to comment.