Skip to content

Commit 455a7db

Browse files
committed
Add hashes for datagen
1 parent bf4cf65 commit 455a7db

File tree

5 files changed

+81
-32
lines changed

5 files changed

+81
-32
lines changed

pkgs/intl4x/hook/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@
1010
1. Create PR.
1111
2. Run `bash tools/regenerate_bindings.sh`, and fix resulting errors.
1212
3. Update `const version` in `version.dart` to tag.
13-
4. Regenerate hashes using `cd pkgs/intl4x/; dart --enable-experiment=native-assets run tool/regenerate_hashes.dart`.
13+
4. Regenerate hashes using `cd pkgs/intl4x/; dart --enable-experiment=native-assets tool/regenerate_hashes.dart`.
1414
5. Land PR.

pkgs/intl4x/hook/build.dart

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,35 +107,47 @@ final class FetchMode extends BuildMode {
107107
config.outputDirectory.resolve(config.filename('icu4x')),
108108
);
109109

110+
final bytes = await library.readAsBytes();
111+
final fileHash = sha256.convert(bytes).toString();
112+
final expectedFileHash =
113+
fileHashes[(config.targetOS, config.targetArchitecture, libraryType)];
114+
if (fileHash != expectedFileHash) {
115+
throw Exception(
116+
'The pre-built binary for the target $target at $dylibRemoteUri has a'
117+
' hash of $fileHash, which does not match $expectedFileHash fixed in'
118+
' the build hook of package:intl4x.');
119+
}
120+
110121
final datagenName = config.targetOS.executableFileName('$target-datagen');
122+
final datagenUri = Uri.parse(
123+
'https://github.com/dart-lang/i18n/releases/download/$version/$datagenName');
111124
final datagen = await fetchToFile(
112-
Uri.parse(
113-
'https://github.com/dart-lang/i18n/releases/download/$version/$datagenName'),
125+
datagenUri,
114126
config.outputDirectory.resolve('datagen'),
115127
);
116128

129+
final datagenBytes = await datagen.readAsBytes();
130+
final datagenHash = sha256.convert(datagenBytes).toString();
131+
final expectedDatagenHash =
132+
datagenHashes[(config.targetOS, config.targetArchitecture)];
133+
if (datagenHash != expectedDatagenHash) {
134+
throw Exception(
135+
'The pre-built binary for the target $target at $datagenUri has a'
136+
' hash of $datagenHash, which does not match $expectedDatagenHash '
137+
'fixed in the build hook of package:intl4x.');
138+
}
139+
117140
final postcard = await fetchToFile(
118141
Uri.parse(
119142
'https://github.com/dart-lang/i18n/releases/download/$version/full.postcard'),
120143
config.outputDirectory.resolve('full.postcard'),
121144
);
122145

123-
final bytes = await library.readAsBytes();
124-
final fileHash = sha256.convert(bytes).toString();
125-
final expectedFileHash =
126-
fileHashes[(config.targetOS, config.targetArchitecture, libraryType)];
127-
if (fileHash == expectedFileHash) {
128-
return BuildResult(
129-
library: library.uri,
130-
datagen: datagen.uri,
131-
postcard: postcard.uri,
132-
);
133-
} else {
134-
throw Exception(
135-
'The pre-built binary for the target $target at $dylibRemoteUri has a'
136-
' hash of $fileHash, which does not match $expectedFileHash fixed in'
137-
' the build hook of package:intl4x.');
138-
}
146+
return BuildResult(
147+
library: library.uri,
148+
datagen: datagen.uri,
149+
postcard: postcard.uri,
150+
);
139151
}
140152

141153
Future<File> fetchToFile(Uri uri, Uri fileUri) async {

pkgs/intl4x/hook/link.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ void main(List<String> arguments) {
6666
final dylib = output.assets.first;
6767

6868
final datagen = datagenTool.file!.toFilePath();
69+
6970
if (OS.current == OS.linux) {
7071
await runProcess('chmod', ['+x', datagen]);
7172
}

pkgs/intl4x/lib/src/hook_helpers/hashes.dart

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
// THIS FILE IS AUTOGENERATED BY `tool/regenerate_hashes.dart`. TO UPDATE, RUN
66
//
7-
// dart --enable-experiment=native-assets run tool/regenerate_hashes.dart
7+
// dart --enable-experiment=native-assets tool/regenerate_hashes.dart
88
//
99

1010
import 'package:native_assets_cli/native_assets_cli.dart';
@@ -75,3 +75,16 @@ const fileHashes = <(OS, Architecture, String), String>{
7575
(OS.iOS, Architecture.x64, 'static'):
7676
'6e4e4072126b3017c6a532575a165d1a80b2bccb59a24108682483935c98ff19'
7777
};
78+
79+
const datagenHashes = <(OS, Architecture), String>{
80+
(OS.linux, Architecture.arm64):
81+
'b44dd95e9622f84552dd0599028bd867cdf3f14a1c3d807a39a710a3f2e3e491',
82+
(OS.linux, Architecture.riscv64):
83+
'fdee9c86eb6d8abad33c1ec2a343dc3b66ffd54412a448a38be2b17ea1d28241',
84+
(OS.linux, Architecture.x64):
85+
'10add51f8739a7e87907a1453f58c6fc268b06489bd1d51502e142db7e33eb28',
86+
(OS.macOS, Architecture.arm64):
87+
'019fb83b2a59f366afc21dea30b69ebaa65f16026cd55c57075617c6ca89c61e',
88+
(OS.macOS, Architecture.x64):
89+
'31908391cecd0c842bf9489e08eec57ccdaa5b82ad2f887e316303938011f0b7'
90+
};

pkgs/intl4x/tool/regenerate_hashes.dart

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@ final httpClient = HttpClient();
99
Future<void> main(List<String> args) async {
1010
print('Checking hashes for $version');
1111
final fileHashes = <(String, Architecture, String), String>{};
12-
final dynamicLibrary = File.fromUri(Directory.systemTemp.uri.resolve('lib'));
13-
await dynamicLibrary.create();
12+
final datagenHashes = <(String, Architecture), String>{};
13+
final file = File.fromUri(Directory.systemTemp.uri.resolve('lib'));
14+
await file.create();
1415
for (final os in ['linux', 'windows', 'fuchsia', 'android', 'macOS', 'iOS']) {
1516
for (final architecture in Architecture.values) {
17+
final target = '${os}_$architecture-datagen';
18+
final datagenHash = await getHash(target, file);
19+
if (datagenHash != null) {
20+
datagenHashes[(os, architecture)] = datagenHash;
21+
}
1622
for (final libraryType in ['dynamic', 'static']) {
17-
final target = [os, architecture, libraryType].join('_');
18-
print('Checking hash for $target');
19-
final success = await _fetchLibrary(target, httpClient, dynamicLibrary);
20-
if (success) {
21-
final bytes = await dynamicLibrary.readAsBytes();
22-
final fileHash = sha256.convert(bytes).toString();
23+
final target = '${os}_${architecture}_$libraryType';
24+
final fileHash = await getHash(target, file);
25+
if (fileHash != null) {
2326
fileHashes[(os, architecture, libraryType)] = fileHash;
24-
print('Hash is $fileHash');
25-
} else {
26-
print('Could not fetch library');
2727
}
2828
}
2929
}
@@ -37,7 +37,7 @@ Future<void> main(List<String> args) async {
3737
3838
// THIS FILE IS AUTOGENERATED BY `tool/regenerate_hashes.dart`. TO UPDATE, RUN
3939
//
40-
// dart --enable-experiment=native-assets run tool/regenerate_hashes.dart
40+
// dart --enable-experiment=native-assets tool/regenerate_hashes.dart
4141
//
4242
4343
import 'package:native_assets_cli/native_assets_cli.dart';
@@ -50,9 +50,32 @@ ${fileHashes.map((key, value) => MapEntry(
5050
(e) => ' ${e.key}:\n ${e.value}',
5151
).join(',\n')}
5252
};
53+
54+
const datagenHashes = <(OS, Architecture), String>{
55+
${datagenHashes.map((key, value) => MapEntry(
56+
('OS.${key.$1}', 'Architecture.${key.$2}'),
57+
"'$value'",
58+
)).entries.map(
59+
(e) => ' ${e.key}:\n ${e.value}',
60+
).join(',\n')}
61+
};
5362
''');
5463
}
5564

65+
Future<String?> getHash(String target, File dynamicLibrary) async {
66+
print('Checking hash for $target');
67+
final success = await _fetchLibrary(target, httpClient, dynamicLibrary);
68+
if (success) {
69+
final bytes = await dynamicLibrary.readAsBytes();
70+
final fileHash = sha256.convert(bytes).toString();
71+
print('Hash is $fileHash');
72+
return fileHash;
73+
} else {
74+
print('Could not fetch library');
75+
return null;
76+
}
77+
}
78+
5679
Future<bool> _fetchLibrary(
5780
String target, HttpClient httpClient, File dynamicLibrary) async {
5881
final uri = Uri.parse(

0 commit comments

Comments
 (0)