From b54bb6abbb5900ce7d39f2e6b67bbd496772fab6 Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Fri, 22 Nov 2019 14:06:05 -0800 Subject: [PATCH] Dont crash if the tool cannot delete asset directory during debugging (#45407) --- packages/flutter_tools/lib/src/bundle.dart | 12 +++++++++++- .../test/general.shard/asset_bundle_test.dart | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/flutter_tools/lib/src/bundle.dart b/packages/flutter_tools/lib/src/bundle.dart index 8d157ea97f9..e86469d49d1 100644 --- a/packages/flutter_tools/lib/src/bundle.dart +++ b/packages/flutter_tools/lib/src/bundle.dart @@ -10,6 +10,7 @@ import 'package:pool/pool.dart'; import 'asset.dart'; import 'base/common.dart'; import 'base/file_system.dart'; +import 'base/logger.dart'; import 'build_info.dart'; import 'build_system/build_system.dart'; import 'build_system/depfile.dart'; @@ -173,9 +174,18 @@ Future buildAssets({ Future writeBundle( Directory bundleDir, Map assetEntries, + { Logger loggerOverride } ) async { + loggerOverride ??= logger; if (bundleDir.existsSync()) { - bundleDir.deleteSync(recursive: true); + try { + bundleDir.deleteSync(recursive: true); + } on FileSystemException catch (err) { + loggerOverride.printError( + 'Failed to clean up asset directory ${bundleDir.path}: $err\n' + 'To clean build artifacts, use the command "flutter clean".' + ); + } } bundleDir.createSync(recursive: true); diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart index c46baba62a2..1bbb35a38fc 100644 --- a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart +++ b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart @@ -9,8 +9,12 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/asset.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/bundle.dart'; import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/devfs.dart'; +import 'package:mockito/mockito.dart'; import '../src/common.dart'; import '../src/context.dart'; @@ -179,4 +183,18 @@ flutter: }); }); + test('Failed directory delete shows message', () async { + final MockDirectory mockDirectory = MockDirectory(); + final BufferLogger bufferLogger = BufferLogger(); + when(mockDirectory.existsSync()).thenReturn(true); + when(mockDirectory.deleteSync(recursive: true)).thenThrow(const FileSystemException('ABCD')); + + await writeBundle(mockDirectory, {}, loggerOverride: bufferLogger); + + verify(mockDirectory.createSync(recursive: true)).called(1); + expect(bufferLogger.errorText, contains('ABCD')); + }); } + +class MockDirectory extends Mock implements Directory {} +