diff options
Diffstat (limited to 'nixpkgs/lib/sources.nix')
-rw-r--r-- | nixpkgs/lib/sources.nix | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/nixpkgs/lib/sources.nix b/nixpkgs/lib/sources.nix index 343449d9a603..d990777c6fcc 100644 --- a/nixpkgs/lib/sources.nix +++ b/nixpkgs/lib/sources.nix @@ -4,7 +4,6 @@ # Tested in lib/tests/sources.sh let inherit (builtins) - hasContext match readDir split @@ -19,21 +18,11 @@ let pathExists readFile ; - - /* - Returns the type of a path: regular (for file), symlink, or directory. - */ - pathType = path: getAttr (baseNameOf path) (readDir (dirOf path)); - - /* - Returns true if the path exists and is a directory, false otherwise. - */ - pathIsDirectory = path: if pathExists path then (pathType path) == "directory" else false; - - /* - Returns true if the path exists and is a regular file, false otherwise. - */ - pathIsRegularFile = path: if pathExists path then (pathType path) == "regular" else false; + inherit (lib.filesystem) + pathType + pathIsDirectory + pathIsRegularFile + ; /* A basic filter for `cleanSourceWith` that removes @@ -167,17 +156,27 @@ let in type == "directory" || lib.any (ext: lib.hasSuffix ext base) exts; in cleanSourceWith { inherit filter src; }; - pathIsGitRepo = path: (tryEval (commitIdFromGitRepo path)).success; + pathIsGitRepo = path: (_commitIdFromGitRepoOrError path)?value; /* Get the commit id of a git repo. Example: commitIdFromGitRepo <nixpkgs/.git> */ - commitIdFromGitRepo = + commitIdFromGitRepo = path: + let commitIdOrError = _commitIdFromGitRepoOrError path; + in commitIdOrError.value or (throw commitIdOrError.error); + + # Get the commit id of a git repo. + + # Returns `{ value = commitHash }` or `{ error = "... message ..." }`. + + # Example: commitIdFromGitRepo <nixpkgs/.git> + # not exported, used for commitIdFromGitRepo + _commitIdFromGitRepoOrError = let readCommitFromFile = file: path: - let fileName = toString path + "/" + file; - packedRefsName = toString path + "/packed-refs"; + let fileName = path + "/${file}"; + packedRefsName = path + "/packed-refs"; absolutePath = base: path: if lib.hasPrefix "/" path then path @@ -187,7 +186,7 @@ let then let m = match "^gitdir: (.*)$" (lib.fileContents path); in if m == null - then throw ("File contains no gitdir reference: " + path) + then { error = "File contains no gitdir reference: " + path; } else let gitDir = absolutePath (dirOf path) (lib.head m); commonDir'' = if pathIsRegularFile "${gitDir}/commondir" @@ -205,7 +204,7 @@ let let fileContent = lib.fileContents fileName; matchRef = match "^ref: (.*)$" fileContent; in if matchRef == null - then fileContent + then { value = fileContent; } else readCommitFromFile (lib.head matchRef) path else if pathIsRegularFile packedRefsName @@ -219,10 +218,10 @@ let # https://github.com/NixOS/nix/issues/2147#issuecomment-659868795 refs = filter isRef (split "\n" fileContent); in if refs == [] - then throw ("Could not find " + file + " in " + packedRefsName) - else lib.head (matchRef (lib.head refs)) + then { error = "Could not find " + file + " in " + packedRefsName; } + else { value = lib.head (matchRef (lib.head refs)); } - else throw ("Not a .git directory: " + path); + else { error = "Not a .git directory: " + toString path; }; in readCommitFromFile "HEAD"; pathHasContext = builtins.hasContext or (lib.hasPrefix storeDir); @@ -262,11 +261,20 @@ let }; in { - inherit - pathType - pathIsDirectory - pathIsRegularFile + pathType = lib.warnIf (lib.isInOldestRelease 2305) + "lib.sources.pathType has been moved to lib.filesystem.pathType." + lib.filesystem.pathType; + + pathIsDirectory = lib.warnIf (lib.isInOldestRelease 2305) + "lib.sources.pathIsDirectory has been moved to lib.filesystem.pathIsDirectory." + lib.filesystem.pathIsDirectory; + + pathIsRegularFile = lib.warnIf (lib.isInOldestRelease 2305) + "lib.sources.pathIsRegularFile has been moved to lib.filesystem.pathIsRegularFile." + lib.filesystem.pathIsRegularFile; + + inherit pathIsGitRepo commitIdFromGitRepo |