1+ // ignore_for_file: avoid_print, specify_nonobvious_local_variable_types, public_member_api_docs
2+
13import 'dart:convert' ;
24import 'dart:io' ;
3- import 'package:args/args.dart' ;
4- import 'package:path/path.dart' as path;
55
6+ import 'package:args/args.dart' ;
67import 'package:engine_build_configs/engine_build_configs.dart' ;
8+ import 'package:path/path.dart' as path;
79
810class YamlWriter {
911 YamlWriter () {
@@ -16,10 +18,10 @@ class YamlWriter {
1618}
1719
1820class YamlWriterSection {
19- final YamlWriter writer;
20-
2121 YamlWriterSection ._(this .writer, {required bool isArray}) : _isArray = isArray;
2222
23+ final YamlWriter writer;
24+
2325 void writeln (String line) {
2426 final arrayPrefix = _isArray ? '- ' : '' ;
2527 writer._buffer.writeln ('${' ' * _indentationLevel }$arrayPrefix $line ' );
@@ -32,14 +34,14 @@ class YamlWriterSection {
3234
3335 YamlWriterSection beginMap (String label, [String value = '' ]) {
3436 write (label, value);
35- YamlWriterSection section = YamlWriterSection ._(writer, isArray: false );
37+ final section = YamlWriterSection ._(writer, isArray: false );
3638 section._indentationLevel = _indentationLevel + 1 ;
3739 return section;
3840 }
3941
4042 YamlWriterSection beginArray (String label, [String value = '' ]) {
4143 write (label, value);
42- YamlWriterSection section = YamlWriterSection ._(writer, isArray: true );
44+ final section = YamlWriterSection ._(writer, isArray: true );
4345 section._indentationLevel = _indentationLevel + 1 ;
4446 return section;
4547 }
@@ -70,7 +72,7 @@ class BuildConfigWriter {
7072 run.writeln ('./flutter/bin/et build --config ${build .name }' );
7173 }
7274 for (final generator in build.generators) {
73- writeBuildTask (steps, generator);
75+ _writeBuildTask (steps, generator);
7476 }
7577 // For global generators we need to upload artifacts so that we can use them
7678 // in dependent jobs.
@@ -115,7 +117,7 @@ class BuildConfigWriter {
115117 w.write ('path' , 'engine/src/out/${build .name }' );
116118 }
117119 for (final generator in _config.generators) {
118- writeTestTask (steps, generator);
120+ _writeTestTask (steps, generator);
119121 }
120122 for (final archive in _config.archives) {
121123 _writeGlobalPublishStep (steps, archive);
@@ -133,17 +135,17 @@ class BuildConfigWriter {
133135 {
134136 final step = steps.beginMap ('name' , 'Set up depot_tools' );
135137 final run = step.beginMap ('run' , '|' );
136- run.writeln ('git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git \ $ HOME/depot_tools' );
138+ run.writeln (r 'git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git $HOME/depot_tools' );
137139 run.writeln ('# Append depot_tools to the PATH for subsequent steps' );
138- run.writeln ('echo "\ $ HOME/depot_tools" >> \ $ GITHUB_PATH' );
140+ run.writeln (r 'echo "$HOME/depot_tools" >> $GITHUB_PATH' );
139141 }
140142 {
141143 final step = steps.beginMap ('name' , 'Generate engine content hash' );
142144 step.write ('id' , 'engine_content_hash' );
143145 final run = step.beginMap ('run' , '|' );
144- run.writeln ('engine_content_hash=\ $ (bin/internal/content_aware_hash.sh)' );
145- run.writeln ('echo "::notice:: Engine content hash: \ $ {engine_content_hash}"' );
146- run.writeln ('echo "value=\ $ {engine_content_hash}" >> \ $ GITHUB_OUTPUT' );
146+ run.writeln (r 'engine_content_hash=$(bin/internal/content_aware_hash.sh)' );
147+ run.writeln (r 'echo "::notice:: Engine content hash: ${engine_content_hash}"' );
148+ run.writeln (r 'echo "value=${engine_content_hash}" >> $GITHUB_OUTPUT' );
147149 }
148150 {
149151 final step = steps.beginMap ('name' , 'Copy gclient file' );
@@ -166,10 +168,10 @@ class BuildConfigWriter {
166168 final step = steps.beginMap ('name' , 'Publish $relativePath ' );
167169 step.write ('uses' , 'ryand56/r2-upload-action@b801a390acbdeb034c5e684ff5e1361c06639e7c' );
168170 final w = step.beginMap ('with' );
169- w.write ('r2-account-id' , ' \ $ {{ secrets.R2_ACCOUNT_ID }}' );
170- w.write ('r2-access-key-id' , ' \ $ {{ secrets.R2_ACCESS_KEY_ID }}' );
171- w.write ('r2-secret-access-key' , ' \ $ {{ secrets.R2_SECRET_ACCESS_KEY }}' );
172- w.write ('r2-bucket' , ' \ $ {{ env.R2_BUCKET }}' );
171+ w.write ('r2-account-id' , r' ${{ secrets.R2_ACCOUNT_ID }}' );
172+ w.write ('r2-access-key-id' , r' ${{ secrets.R2_ACCESS_KEY_ID }}' );
173+ w.write ('r2-secret-access-key' , r' ${{ secrets.R2_SECRET_ACCESS_KEY }}' );
174+ w.write ('r2-bucket' , r' ${{ env.R2_BUCKET }}' );
173175 w.write ('source-dir' , 'engine/src/$assetPath ' );
174176 var relativePathDir = path.dirname (relativePath);
175177 if (relativePathDir == '.' ) {
@@ -188,10 +190,10 @@ class BuildConfigWriter {
188190 final step = steps.beginMap ('name' , 'Publish ${archive .destination }' );
189191 step.write ('uses' , 'ryand56/r2-upload-action@b801a390acbdeb034c5e684ff5e1361c06639e7c' );
190192 final w = step.beginMap ('with' );
191- w.write ('r2-account-id' , ' \ $ {{ secrets.R2_ACCOUNT_ID }}' );
192- w.write ('r2-access-key-id' , ' \ $ {{ secrets.R2_ACCESS_KEY_ID }}' );
193- w.write ('r2-secret-access-key' , ' \ $ {{ secrets.R2_SECRET_ACCESS_KEY }}' );
194- w.write ('r2-bucket' , ' \ $ {{ env.R2_BUCKET }}' );
193+ w.write ('r2-account-id' , r' ${{ secrets.R2_ACCOUNT_ID }}' );
194+ w.write ('r2-access-key-id' , r' ${{ secrets.R2_ACCESS_KEY_ID }}' );
195+ w.write ('r2-secret-access-key' , r' ${{ secrets.R2_SECRET_ACCESS_KEY }}' );
196+ w.write ('r2-bucket' , r' ${{ env.R2_BUCKET }}' );
195197 w.write ('source-dir' , 'engine/src/${archive .source }' );
196198 var relativePathDir = path.dirname (archive.destination);
197199 if (relativePathDir == '.' ) {
@@ -200,33 +202,47 @@ class BuildConfigWriter {
200202 w.write ('destination-dir' , '\$ {{ steps.engine_content_hash.outputs.value }}/$relativePathDir ' );
201203 }
202204
203- void writeBuildTask (YamlWriterSection steps, BuildTask generator) {
205+ String _taskLauncherScript (String script, {required String language}) {
206+ if (language == 'dart' ) {
207+ return '../../bin/dart $script ' ;
208+ } else if (language == 'python3' ) {
209+ return 'python3 $script ' ;
210+ } else if (language == 'bash' || language == '<undef>' ) {
211+ return script;
212+ } else {
213+ throw Exception ('Unsupported generator language: $language ' );
214+ }
215+ }
216+
217+ void _writeBuildTask (YamlWriterSection steps, BuildTask generator) {
204218 final step = steps.beginMap ('name' , 'Run generator ${generator .name }' );
205219 final run = step.beginMap ('run' , '|' );
206220 run.writeln ('cd engine/src' );
207221 for (final script in generator.scripts) {
222+ final launcher = _taskLauncherScript (script, language: generator.language);
208223 if (generator.parameters.isEmpty) {
209- run.writeln (script );
224+ run.writeln (launcher );
210225 } else {
211- run.writeln ('$script \\ ' );
226+ run.writeln ('$launcher \\ ' );
212227 for (final (index, arg) in generator.parameters.indexed) {
213- final suffix = index == generator.parameters.length - 1 ? '' : ' \ \ ' ;
228+ final suffix = index == generator.parameters.length - 1 ? '' : r' \' ;
214229 run.writeln (' $arg $suffix ' );
215230 }
216231 }
217232 }
218233 }
219234
220- void writeTestTask (YamlWriterSection steps, TestTask generator) {
235+ void _writeTestTask (YamlWriterSection steps, TestTask generator) {
221236 final step = steps.beginMap ('name' , 'Run generator ${generator .name }' );
222237 final run = step.beginMap ('run' , '|' );
223238 run.writeln ('cd engine/src' );
239+ final launcher = _taskLauncherScript (generator.script, language: generator.language);
224240 if (generator.parameters.isEmpty) {
225- run.writeln (generator.script );
241+ run.writeln (launcher );
226242 } else {
227- run.writeln ('${ generator . script } \\ ' );
243+ run.writeln ('$launcher \\ ' );
228244 for (final (index, arg) in generator.parameters.indexed) {
229- final suffix = index == generator.parameters.length - 1 ? '' : ' \ \ ' ;
245+ final suffix = index == generator.parameters.length - 1 ? '' : r' \' ;
230246 run.writeln (' $arg $suffix ' );
231247 }
232248 }
@@ -253,7 +269,7 @@ class BuildConfigWriter {
253269 }
254270 name = name.substring (3 ); // Remove 'ci/' prefix.
255271 final prefix = _prefix ();
256- if (name.startsWith (" ${prefix }_" )) {
272+ if (name.startsWith (' ${prefix }_' )) {
257273 return name;
258274 } else {
259275 return '${_prefix ()}_$name ' ;
@@ -297,7 +313,8 @@ void main(List<String> arguments) {
297313 exit (1 );
298314 }
299315
300- if (args['input' ].isEmpty) {
316+ final input = args['input' ] as List <String >;
317+ if (input.isEmpty) {
301318 print ('No input files specified. Use --input to specify at least one builder config JSON file.' );
302319 exit (1 );
303320 }
@@ -314,12 +331,13 @@ void main(List<String> arguments) {
314331 env.write ('DEPOT_TOOLS_WIN_TOOLCHAIN' , '0' );
315332 env.write ('FLUTTER_PREBUILT_DART_SDK' , '1' );
316333 env.write ('R2_BUCKET' , 'flutter-zero-engine' );
334+ env.write ('ENGINE_CHECKOUT_PATH' , r'${{ github.workspace }}/engine' );
317335
318336 final jobs = root.beginMap ('jobs' );
319337
320338 for (final inputPath in args['input' ] as List <String >) {
321339 final content = File (inputPath).readAsStringSync ();
322- final map = jsonDecode (content);
340+ final map = jsonDecode (content) as Map < String , dynamic > ;
323341 final buildConfig = BuilderConfig .fromJson (path: inputPath, map: map);
324342 final writer = BuildConfigWriter (config: buildConfig, jobsSections: jobs);
325343 writer.write ();
0 commit comments