check if directory exists before listing content (#119748)
diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index 356618e..c4ecd3d 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -1242,6 +1242,10 @@
continue;
}
for (Directory directory = file.parent; directory.absolute.path != _tempStorage.absolute.path; directory = directory.parent) {
+ // Handle race condition when the directory is deleted before this step
+ if (!directory.existsSync()) {
+ break;
+ }
if (directory.listSync().isNotEmpty) {
break;
}
diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart
index c6628f1..3dc6e7f 100644
--- a/packages/flutter_tools/test/general.shard/cache_test.dart
+++ b/packages/flutter_tools/test/general.shard/cache_test.dart
@@ -398,6 +398,30 @@
expect(staleFile, isNot(exists));
});
+ testWithoutContext('Try to remove without a parent', () async {
+ final FileSystem fileSystem = MemoryFileSystem.test();
+ final Directory parent = fileSystem.directory('dir');
+ parent.createSync();
+ final Directory child = parent.childDirectory('child');
+ child.createSync();
+ final Directory tempStorage = parent.childDirectory('temp');
+ tempStorage.createSync();
+ final FakeArtifactUpdaterDownload fakeArtifact = FakeArtifactUpdaterDownload(
+ operatingSystemUtils: FakeOperatingSystemUtils(),
+ logger: BufferLogger.test(),
+ fileSystem: fileSystem,
+ tempStorage: tempStorage,
+ httpClient: HttpClient(),
+ platform: FakePlatform(),
+ allowedBaseUrls: <String>[]
+ );
+ final File file = child.childFile('file');
+ file.createSync();
+ fakeArtifact.addFiles(<File>[file]);
+ child.deleteSync(recursive: true);
+ fakeArtifact.removeDownloadedFiles();
+ });
+
testWithoutContext('IosUsbArtifacts verifies executables for libimobiledevice in isUpToDateInner', () async {
final FileSystem fileSystem = MemoryFileSystem.test();
final Cache cache = Cache.test(fileSystem: fileSystem, processManager: FakeProcessManager.any());
@@ -1212,3 +1236,19 @@
@override
void removeDownloadedFiles() { }
}
+
+class FakeArtifactUpdaterDownload extends ArtifactUpdater {
+ FakeArtifactUpdaterDownload({
+ required super.operatingSystemUtils,
+ required super.logger,
+ required super.fileSystem,
+ required super.tempStorage,
+ required super.httpClient,
+ required super.platform,
+ required super.allowedBaseUrls
+ });
+
+ void addFiles(List<File> files) {
+ downloadedFiles.addAll(files);
+ }
+}