Fix hang running as a macos desktop app. (#2085)
Fix hang on macos if the terminal doesn't have permission to access the downloads directory.
diff --git a/packages/devtools_app/lib/src/config_specific/file/_file_desktop.dart b/packages/devtools_app/lib/src/config_specific/file/_file_desktop.dart
index 38246d6..1391816 100644
--- a/packages/devtools_app/lib/src/config_specific/file/_file_desktop.dart
+++ b/packages/devtools_app/lib/src/config_specific/file/_file_desktop.dart
@@ -6,6 +6,8 @@
import 'package:file/local.dart';
import 'package:path/path.dart' as _path;
+import '../logger/logger.dart';
+
import 'file.dart';
FileSystemDesktop createFileSystem() {
@@ -57,25 +59,35 @@
List<String> list({String prefix}) {
final List<String> logs = [];
- final previousCurrentDirectory = _fs.currentDirectory;
+ try {
+ final previousCurrentDirectory = _fs.currentDirectory;
- // TODO(terry): Use path_provider when available?
- _fs.currentDirectory = exportDirectory();
+ // TODO(terry): Use path_provider when available?
+ _fs.currentDirectory = exportDirectory();
- final allFiles = _fs.currentDirectory.listSync();
-
- for (FileSystemEntity entry in allFiles) {
- final basename = _path.basename(entry.path);
- if (_fs.isFileSync(entry.path) && basename.startsWith(prefix)) {
- logs.add(basename);
+ if (!_fs.currentDirectory.existsSync()) {
+ return logs;
}
+ final allFiles = _fs.currentDirectory.listSync(followLinks: false);
+ for (FileSystemEntity entry in allFiles) {
+ final basename = _path.basename(entry.path);
+ if (_fs.isFileSync(entry.path) && basename.startsWith(prefix)) {
+ logs.add(basename);
+ }
+ }
+ // Sort by newest file top-most (DateTime is in the filename).
+ logs.sort((a, b) => b.compareTo(a));
+
+ _fs.currentDirectory = previousCurrentDirectory;
+ } on FileSystemException catch (e) {
+ // TODO(jacobr): prompt the user to grant permission to access the
+ // directory if Flutter ever provides that option or consider using an
+ // alternate directory. This error should generally only occur on MacOS
+ // desktop Catalina and later where access to the Downloads folder
+ // is not granted by default.
+ log(e.toString());
}
- // Sort by newest file top-most (DateTime is in the filename).
- logs.sort((a, b) => b.compareTo(a));
-
- _fs.currentDirectory = previousCurrentDirectory;
-
return logs;
}