From 47950b53538471c1aff04b00790fadded7eca207 Mon Sep 17 00:00:00 2001 From: obadz Date: Tue, 24 May 2016 23:34:28 +0100 Subject: modules/misc/version.nix: populate nixosRevision based on when possible (#15624) Example: $ nixos-option system.nixosLabel Value: "16.09.git.4643ca1" --- lib/sources.nix | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'lib/sources.nix') diff --git a/lib/sources.nix b/lib/sources.nix index 4ed16d65d2b..6b19b192dfd 100644 --- a/lib/sources.nix +++ b/lib/sources.nix @@ -29,4 +29,30 @@ rec { in type == "directory" || lib.any (ext: lib.hasSuffix ext base) exts; in builtins.filterSource filter path; + # Get the commit id of a git repo + # Example: commitIdFromGitRepo + commitIdFromGitRepo = + let readCommitFromFile = path: file: + with builtins; + let fileName = toString path + "/" + file; + packedRefsName = toString path + "/packed-refs"; + in if lib.pathExists fileName + then + let fileContent = readFile fileName; + # Sometimes git stores the commitId directly in the file but + # sometimes it stores something like: «ref: refs/heads/branch-name» + matchRef = match "^ref: (.*)\n$" fileContent; + in if isNull matchRef + then lib.removeSuffix "\n" fileContent + else readCommitFromFile path (lib.head matchRef) + # Sometimes, the file isn't there at all and has been packed away in the + # packed-refs file, so we have to grep through it: + else if lib.pathExists packedRefsName + then + let packedRefs = lib.splitString "\n" (readFile packedRefsName); + matchRule = match ("^(.*) " + file + "$"); + matchedRefs = lib.flatten (lib.filter (m: ! (isNull m)) (map matchRule packedRefs)); + in lib.head matchedRefs + else throw ("Not a .git directory: " + path); + in lib.flip readCommitFromFile "HEAD"; } -- cgit 1.4.1