4
4
5
5
import 'dart:async' ;
6
6
import 'dart:convert' ;
7
- import 'dart:io' ;
7
+ import 'dart:io' show Platform ;
8
8
9
+ import 'package:file/file.dart' ;
9
10
import 'package:logging/logging.dart' ;
10
11
import 'package:native_assets_cli/native_assets_cli_internal.dart' ;
11
12
import 'package:package_config/package_config.dart' ;
@@ -63,15 +64,18 @@ typedef ApplicationAssetValidator = Future<ValidationErrors> Function(
63
64
/// [BuildConfig] and [LinkConfig] ! For more info see:
64
65
/// https://github.com/dart-lang/native/issues/1319
65
66
class NativeAssetsBuildRunner {
67
+ final FileSystem _fileSystem;
66
68
final Logger logger;
67
69
final Uri dartExecutable;
68
70
final Duration singleHookTimeout;
69
71
70
72
NativeAssetsBuildRunner ({
71
73
required this .logger,
72
74
required this .dartExecutable,
75
+ required FileSystem fileSystem,
73
76
Duration ? singleHookTimeout,
74
- }) : singleHookTimeout = singleHookTimeout ?? const Duration (minutes: 5 );
77
+ }) : _fileSystem = fileSystem,
78
+ singleHookTimeout = singleHookTimeout ?? const Duration (minutes: 5 );
75
79
76
80
/// [workingDirectory] is expected to contain `.dart_tool` .
77
81
///
@@ -98,7 +102,8 @@ class NativeAssetsBuildRunner {
98
102
required List <String > buildAssetTypes,
99
103
required bool linkingEnabled,
100
104
}) async {
101
- packageLayout ?? = await PackageLayout .fromRootPackageRoot (workingDirectory);
105
+ packageLayout ?? =
106
+ await PackageLayout .fromRootPackageRoot (_fileSystem, workingDirectory);
102
107
103
108
final (buildPlan, packageGraph) = await _makePlan (
104
109
hook: Hook .build,
@@ -203,7 +208,8 @@ class NativeAssetsBuildRunner {
203
208
required List <String > buildAssetTypes,
204
209
required BuildResult buildResult,
205
210
}) async {
206
- packageLayout ?? = await PackageLayout .fromRootPackageRoot (workingDirectory);
211
+ packageLayout ?? =
212
+ await PackageLayout .fromRootPackageRoot (_fileSystem, workingDirectory);
207
213
208
214
final (buildPlan, packageGraph) = await _makePlan (
209
215
hook: Hook .link,
@@ -231,9 +237,9 @@ class NativeAssetsBuildRunner {
231
237
232
238
File ? resourcesFile;
233
239
if (resourceIdentifiers != null ) {
234
- resourcesFile = File . fromUri (buildDirUri.resolve ('resources.json' ));
240
+ resourcesFile = _fileSystem. file (buildDirUri.resolve ('resources.json' ));
235
241
await resourcesFile.create ();
236
- await File . fromUri (resourceIdentifiers).copy (resourcesFile.path);
242
+ await _fileSystem. file (resourceIdentifiers).copy (resourcesFile.path);
237
243
}
238
244
configBuilder.setupLinkRunConfig (
239
245
outputDirectory: outDirUri,
@@ -291,14 +297,14 @@ class NativeAssetsBuildRunner {
291
297
final buildDirUri =
292
298
packageLayout.dartToolNativeAssetsBuilder.resolve ('$buildDirName /' );
293
299
final outDirUri = buildDirUri.resolve ('out/' );
294
- final outDir = Directory . fromUri (outDirUri);
300
+ final outDir = _fileSystem. directory (outDirUri);
295
301
if (! await outDir.exists ()) {
296
302
// TODO(https://dartbug.com/50565): Purge old or unused folders.
297
303
await outDir.create (recursive: true );
298
304
}
299
305
final outDirSharedUri = packageLayout.dartToolNativeAssetsBuilder
300
306
.resolve ('shared/${package .name }/$hook /' );
301
- final outDirShared = Directory . fromUri (outDirSharedUri);
307
+ final outDirShared = _fileSystem. directory (outDirSharedUri);
302
308
if (! await outDirShared.exists ()) {
303
309
// TODO(https://dartbug.com/50565): Purge old or unused folders.
304
310
await outDirShared.create (recursive: true );
@@ -318,9 +324,10 @@ class NativeAssetsBuildRunner {
318
324
final environment = _filteredEnvironment (_environmentVariablesFilter);
319
325
final outDir = config.outputDirectory;
320
326
return await runUnderDirectoriesLock (
327
+ _fileSystem,
321
328
[
322
- Directory . fromUri (config.outputDirectoryShared.parent) ,
323
- Directory . fromUri (config.outputDirectory.parent) ,
329
+ _fileSystem. directory (config.outputDirectoryShared) .parent.uri ,
330
+ _fileSystem. directory (config.outputDirectory) .parent.uri ,
324
331
],
325
332
timeout: singleHookTimeout,
326
333
logger: logger,
@@ -338,15 +345,13 @@ class NativeAssetsBuildRunner {
338
345
final (hookKernelFile, hookHashes) = hookCompileResult;
339
346
340
347
final buildOutputFile =
341
- File .fromUri (config.outputDirectory.resolve (hook.outputName));
342
- final dependenciesHashFile = File .fromUri (
343
- config.outputDirectory
344
- .resolve ('../dependencies.dependencies_hash_file.json' ),
345
- );
348
+ _fileSystem.file (config.outputDirectory.resolve (hook.outputName));
349
+ final dependenciesHashFile = config.outputDirectory
350
+ .resolve ('../dependencies.dependencies_hash_file.json' );
346
351
final dependenciesHashes =
347
- DependenciesHashFile (file : dependenciesHashFile);
352
+ DependenciesHashFile (_fileSystem, fileUri : dependenciesHashFile);
348
353
final lastModifiedCutoffTime = DateTime .now ();
349
- if (buildOutputFile.existsSync () && dependenciesHashFile. existsSync ()) {
354
+ if (buildOutputFile.existsSync () && await dependenciesHashes. exists ()) {
350
355
late final HookOutput output;
351
356
try {
352
357
output = _readHookOutputFromUri (hook, buildOutputFile);
@@ -391,8 +396,8 @@ ${e.message}
391
396
environment,
392
397
);
393
398
if (result == null ) {
394
- if (await dependenciesHashFile .exists ()) {
395
- await dependenciesHashFile .delete ();
399
+ if (await dependenciesHashes .exists ()) {
400
+ await dependenciesHashes .delete ();
396
401
}
397
402
return null ;
398
403
} else {
@@ -446,9 +451,9 @@ ${e.message}
446
451
final configFileContents =
447
452
const JsonEncoder .withIndent (' ' ).convert (config.json);
448
453
logger.info ('config.json contents: $configFileContents ' );
449
- await File . fromUri (configFile).writeAsString (configFileContents);
454
+ await _fileSystem. file (configFile).writeAsString (configFileContents);
450
455
final hookOutputUri = config.outputDirectory.resolve (hook.outputName);
451
- final hookOutputFile = File . fromUri (hookOutputUri);
456
+ final hookOutputFile = _fileSystem. file (hookOutputUri);
452
457
if (await hookOutputFile.exists ()) {
453
458
// Ensure we'll never read outdated build results.
454
459
await hookOutputFile.delete ();
@@ -461,6 +466,7 @@ ${e.message}
461
466
if (resources != null ) resources.toFilePath (),
462
467
];
463
468
final result = await runProcess (
469
+ filesystem: _fileSystem,
464
470
workingDirectory: workingDirectory,
465
471
executable: dartExecutable,
466
472
arguments: arguments,
@@ -472,7 +478,8 @@ ${e.message}
472
478
var deleteOutputIfExists = false ;
473
479
try {
474
480
if (result.exitCode != 0 ) {
475
- final printWorkingDir = workingDirectory != Directory .current.uri;
481
+ final printWorkingDir =
482
+ workingDirectory != _fileSystem.currentDirectory.uri;
476
483
final commandString = [
477
484
if (printWorkingDir) '(cd ${workingDirectory .toFilePath ()};' ,
478
485
dartExecutable.toFilePath (),
@@ -558,19 +565,19 @@ ${e.message}
558
565
) async {
559
566
// Don't invalidate cache with environment changes.
560
567
final environmentForCaching = < String , String > {};
561
- final kernelFile = File . fromUri (
568
+ final kernelFile = _fileSystem. file (
562
569
outputDirectory.resolve ('../hook.dill' ),
563
570
);
564
- final depFile = File . fromUri (
571
+ final depFile = _fileSystem. file (
565
572
outputDirectory.resolve ('../hook.dill.d' ),
566
573
);
567
- final dependenciesHashFile = File . fromUri (
568
- outputDirectory.resolve ('../hook.dependencies_hash_file.json' ),
569
- );
570
- final dependenciesHashes = DependenciesHashFile (file : dependenciesHashFile);
574
+ final dependenciesHashFile =
575
+ outputDirectory.resolve ('../hook.dependencies_hash_file.json' );
576
+ final dependenciesHashes =
577
+ DependenciesHashFile (_fileSystem, fileUri : dependenciesHashFile);
571
578
final lastModifiedCutoffTime = DateTime .now ();
572
579
var mustCompile = false ;
573
- if (! await dependenciesHashFile .exists ()) {
580
+ if (! await dependenciesHashes .exists ()) {
574
581
mustCompile = true ;
575
582
} else {
576
583
final outdatedDependency = await dependenciesHashes
@@ -633,6 +640,7 @@ ${e.message}
633
640
scriptUri.toFilePath (),
634
641
];
635
642
final compileResult = await runProcess (
643
+ filesystem: _fileSystem,
636
644
workingDirectory: workingDirectory,
637
645
executable: dartExecutable,
638
646
arguments: compileArguments,
@@ -641,7 +649,8 @@ ${e.message}
641
649
);
642
650
var success = true ;
643
651
if (compileResult.exitCode != 0 ) {
644
- final printWorkingDir = workingDirectory != Directory .current.uri;
652
+ final printWorkingDir =
653
+ workingDirectory != _fileSystem.currentDirectory.uri;
645
654
final commandString = [
646
655
if (printWorkingDir) '(cd ${workingDirectory .toFilePath ()};' ,
647
656
dartExecutable.toFilePath (),
@@ -780,10 +789,6 @@ ${compileResult.stdout}
780
789
}
781
790
}
782
791
783
- extension on Uri {
784
- Uri get parent => File (toFilePath ()).parent.uri;
785
- }
786
-
787
792
/// Parses depfile contents.
788
793
///
789
794
/// Format: `path/to/my.dill: path/to/my.dart, path/to/more.dart`
0 commit comments