From b4bce7db3e904c417b26b682bbe49b8b0f47d71a Mon Sep 17 00:00:00 2001 From: Lukas Klingsbo Date: Tue, 10 Jan 2023 22:17:54 +0100 Subject: [PATCH] [xdg_directories] Return null from `getUserDirectory` instead of throwing exception (#3033) * fix: xdg.getUserDirectory to return null on missing executable * Update changelog * Fix review comments --- packages/xdg_directories/CHANGELOG.md | 4 ++++ .../xdg_directories/lib/xdg_directories.dart | 5 +++++ packages/xdg_directories/pubspec.yaml | 2 +- .../test/xdg_directories_test.dart | 18 +++++++++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/packages/xdg_directories/CHANGELOG.md b/packages/xdg_directories/CHANGELOG.md index ec5bb29f53..7c97e6c966 100644 --- a/packages/xdg_directories/CHANGELOG.md +++ b/packages/xdg_directories/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.0+3 + +* Returns null instead of throwing exception from getUserDirectory when xdg-user-dir executable is missing. + ## 0.2.0+2 * Fixes unit tests on Windows. diff --git a/packages/xdg_directories/lib/xdg_directories.dart b/packages/xdg_directories/lib/xdg_directories.dart index 2192153090..bf6de2d312 100644 --- a/packages/xdg_directories/lib/xdg_directories.dart +++ b/packages/xdg_directories/lib/xdg_directories.dart @@ -149,7 +149,12 @@ Directory? get runtimeDir => _directoryFromEnvironment('XDG_RUNTIME_DIR'); /// Gets the xdg user directory named by `dirName`. /// /// Use [getUserDirectoryNames] to find out the list of available names. +/// +/// If the `xdg-user-dir` executable is not present this returns null. Directory? getUserDirectory(String dirName) { + if (!_processManager.canRun('xdg-user-dir')) { + return null; + } final ProcessResult result = _processManager.runSync( ['xdg-user-dir', dirName], stdoutEncoding: utf8, diff --git a/packages/xdg_directories/pubspec.yaml b/packages/xdg_directories/pubspec.yaml index 8edfad111f..1103bec1fc 100644 --- a/packages/xdg_directories/pubspec.yaml +++ b/packages/xdg_directories/pubspec.yaml @@ -2,7 +2,7 @@ name: xdg_directories description: A Dart package for reading XDG directory configuration information on Linux. repository: https://github.com/flutter/packages/tree/main/packages/xdg_directories issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+xdg_directories%22 -version: 0.2.0+2 +version: 0.2.0+3 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/xdg_directories/test/xdg_directories_test.dart b/packages/xdg_directories/test/xdg_directories_test.dart index 800b0b69e2..b3c95d3df7 100644 --- a/packages/xdg_directories/test/xdg_directories_test.dart +++ b/packages/xdg_directories/test/xdg_directories_test.dart @@ -113,6 +113,16 @@ XDG_VIDEOS_DIR="$HOME/Videos" xdg.xdgProcessManager = const LocalProcessManager(); }); + test('Returns null when xdg-user-dir executable is not present', () { + xdg.xdgProcessManager = FakeProcessManager( + {}, + canRunExecutable: false, + ); + expect(xdg.getUserDirectory('DESKTOP'), isNull, + reason: 'Found xdg user directory without access to xdg-user-dir'); + xdg.xdgProcessManager = const LocalProcessManager(); + }); + test('Throws StateError when HOME not set', () { fakeEnv.clear(); expect(() { @@ -122,9 +132,10 @@ XDG_VIDEOS_DIR="$HOME/Videos" } class FakeProcessManager extends Fake implements ProcessManager { - FakeProcessManager(this.expected); + FakeProcessManager(this.expected, {this.canRunExecutable = true}); Map expected; + final bool canRunExecutable; @override ProcessResult runSync( @@ -138,4 +149,9 @@ class FakeProcessManager extends Fake implements ProcessManager { }) { return ProcessResult(0, 0, expected[command[1]], ''); } + + @override + bool canRun(dynamic executable, {String? workingDirectory}) { + return canRunExecutable; + } }