From d064d972f07b908db3efb909d6663bee3adf8d40 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Wed, 5 Apr 2023 16:58:29 +0200 Subject: [PATCH] lib.filesystem.pathType: Improve error for non-existent paths Previously it would fail with error: attribute 'nonexistent' missing at nixpkgs/lib/filesystem.nix:29:10: 28| if dirOf path == path then "directory" 29| else (readDir (dirOf path)).${baseNameOf path}; | ^ 30| --- lib/filesystem.nix | 6 +++++- lib/tests/filesystem.sh | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/filesystem.nix b/lib/filesystem.nix index 13f4ebb26402..db120a48c64b 100644 --- a/lib/filesystem.nix +++ b/lib/filesystem.nix @@ -22,10 +22,14 @@ in Returns the type of a path: regular (for file), symlink, or directory. */ pathType = path: + if ! pathExists path + # Fail irrecoverably to mimic the historic behavior of this function and + # the new builtins.readFileType + then abort "lib.filesystem.pathType: Path ${toString path} does not exist." # The filesystem root is the only path where `dirOf / == /` and # `baseNameOf /` is not valid. We can detect this and directly return # "directory", since we know the filesystem root can't be anything else. - if dirOf path == path + else if dirOf path == path then "directory" else (readDir (dirOf path)).${baseNameOf path}; diff --git a/lib/tests/filesystem.sh b/lib/tests/filesystem.sh index 61710da92ba2..4a5ffeb12431 100755 --- a/lib/tests/filesystem.sh +++ b/lib/tests/filesystem.sh @@ -51,6 +51,7 @@ checkPathType "$PWD/directory" '"directory"' checkPathType "$PWD/regular" '"regular"' checkPathType "$PWD/symlink" '"symlink"' checkPathType "$PWD/fifo" '"unknown"' +checkPathType "$PWD/non-existent" "error: evaluation aborted with the following error message: 'lib.filesystem.pathType: Path $PWD/non-existent does not exist.'" checkPathIsDirectory() { local path=$1