diff --git a/lib/filesystem.nix b/lib/filesystem.nix index b8ce722dac557..620ab54024dc4 100644 --- a/lib/filesystem.nix +++ b/lib/filesystem.nix @@ -18,7 +18,10 @@ let ; inherit (lib.filesystem) + pathIsDirectory + pathIsRegularFile pathType + packagesFromDirectoryRecursive ; inherit (lib.strings) @@ -386,51 +389,29 @@ in ... }: let - # Determine if a directory entry from `readDir` indicates a package or - # directory of packages. - directoryEntryIsPackage = basename: type: - type == "directory" || hasSuffix ".nix" basename; - - # List directory entries that indicate packages in the given `path`. - packageDirectoryEntries = path: - filterAttrs directoryEntryIsPackage (readDir path); - - # Transform a directory entry (a `basename` and `type` pair) into a - # package. - directoryEntryToAttrPair = subdirectory: basename: type: - let - path = subdirectory + "/${basename}"; - in - if type == "regular" - then - { - name = removeSuffix ".nix" basename; - value = callPackage path { }; - } - else - if type == "directory" - then - { - name = basename; - value = packagesFromDirectory path; - } - else - throw - '' - lib.filesystem.packagesFromDirectoryRecursive: Unsupported file type ${type} at path ${toString subdirectory} - ''; - - # Transform a directory into a package (if there's a `package.nix`) or - # set of packages (otherwise). - packagesFromDirectory = path: - let - defaultPackagePath = path + "/package.nix"; - in - if pathExists defaultPackagePath - then callPackage defaultPackagePath { } - else mapAttrs' - (directoryEntryToAttrPair path) - (packageDirectoryEntries path); + inherit (lib) concatMapAttrs removeSuffix; + inherit (lib.path) append; + defaultPath = append directory "package.nix"; in - packagesFromDirectory directory; + if pathExists defaultPath then + # if `${directory}/package.nix` exists, call it directly + callPackage defaultPath {} + else concatMapAttrs (name: type: + # otherwise, for each directory entry + let path = append directory name; in + if type == "directory" then { + # recurse into directories + "${name}" = packagesFromDirectoryRecursive { + inherit callPackage; + directory = path; + }; + } else if type == "regular" && hasSuffix ".nix" name then { + # call .nix files + "${removeSuffix ".nix" name}" = callPackage path {}; + } else if type == "regular" then { + # ignore non-nix files + } else throw '' + lib.filesystem.packagesFromDirectoryRecursive: Unsupported file type ${type} at path ${toString path} + '' + ) (builtins.readDir directory); }