From 8220f8f4e3021245e0d2ac5db4507fccb4675689 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 29 Mar 2019 14:26:56 -0700 Subject: [PATCH] add missing test case and handle wildcard removal (#30205) --- packages/flutter_tools/lib/src/asset.dart | 6 ++- .../flutter_tools/test/asset_bundle_test.dart | 43 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart index 267be6a1dac..e1e16e41afc 100644 --- a/packages/flutter_tools/lib/src/asset.dart +++ b/packages/flutter_tools/lib/src/asset.dart @@ -88,7 +88,11 @@ class _ManifestAssetBundle implements AssetBundle { return true; for (Directory directory in _wildcardDirectories.values) { - if (directory.statSync().modified.isAfter(_lastBuildTimestamp)) { + final DateTime dateTime = directory.statSync().modified; + if (dateTime == null) { + continue; + } + if (dateTime.isAfter(_lastBuildTimestamp)) { return true; } } diff --git a/packages/flutter_tools/test/asset_bundle_test.dart b/packages/flutter_tools/test/asset_bundle_test.dart index 5dc16e337be..6d99cde99ac 100644 --- a/packages/flutter_tools/test/asset_bundle_test.dart +++ b/packages/flutter_tools/test/asset_bundle_test.dart @@ -96,6 +96,49 @@ flutter: }, overrides: { FileSystem: () => testFileSystem, }); + + testUsingContext('handle removal of wildcard directories', () async { + fs.file('.packages').createSync(); + fs.file(fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true); + fs.file('pubspec.yaml') + ..createSync() + ..writeAsStringSync(r''' +name: example +flutter: + assets: + - assets/foo/ +'''); + final AssetBundle bundle = AssetBundleFactory.instance.createBundle(); + await bundle.build(manifestPath: 'pubspec.yaml'); + // Expected assets: + // - asset manifest + // - font manifest + // - license file + // - assets/foo/bar.txt + expect(bundle.entries.length, 4); + expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), false); + + // Delete the wildcard directory and update pubspec file. + fs.directory(fs.path.join('assets', 'foo')).deleteSync(recursive: true); + fs.file('pubspec.yaml') + ..createSync() + ..writeAsStringSync(r''' +name: example'''); + + // Even though the previous file was removed, it is left in the + // asset manifest and not updated. This is due to the devfs not + // supporting file deletion. + expect(bundle.needsBuild(manifestPath: 'pubspec.yaml'), true); + await bundle.build(manifestPath: 'pubspec.yaml'); + // Expected assets: + // - asset manifest + // - font manifest + // - license file + // - assets/foo/bar.txt + expect(bundle.entries.length, 4); + }, overrides: { + FileSystem: () => testFileSystem, + }); }); }