about summary refs log tree commit diff
path: root/nix/utils
diff options
context:
space:
mode:
authorsterni <sternenseemann@systemli.org>2021-04-20T08·18+0200
committersterni <sternenseemann@systemli.org>2021-04-20T11·00+0000
commitf88ac5c0b5292ad2398927fd0ec97489399493e6 (patch)
treea9232fc9b0c2a260c10ea503db2d31e214954dd8 /nix/utils
parentc21dee2b5bad39a44afb900684236c48f767069a (diff)
feat(nix/utils): add storePathName, a more generic baseNameOf r/2532
This is a wrapper around baseNameOf which also can deal with
derivations. Added to //nix/utils since I've found myself introducing an
ad-hoc implementation of this for both //web/bubblegum and //nix/buildC.

Change-Id: I2fcd97a150d6eda21ab323fa0d881ff7442a892e
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3049
Tested-by: BuildkiteCI
Reviewed-by: tazjin <mail@tazj.in>
Diffstat (limited to 'nix/utils')
-rw-r--r--nix/utils/default.nix42
1 files changed, 42 insertions, 0 deletions
diff --git a/nix/utils/default.nix b/nix/utils/default.nix
index 33f72e3903..2d765c0c45 100644
--- a/nix/utils/default.nix
+++ b/nix/utils/default.nix
@@ -17,8 +17,50 @@ let
       } // (attrs.meta or {});
     };
 
+  /* Get the basename of a store path without
+     the leading hash.
+
+     Type: (path | drv | string) -> string
+
+     Example:
+       storePathName ./foo.c
+       => "foo.c"
+
+       storePathName (writeText "foo.c" "int main() { return 0; }")
+       => "foo.c"
+
+       storePathName "${hello}/bin/hello"
+       => "hello"
+  */
+  storePathName = p:
+    if lib.isDerivation p
+    then p.name
+    else if builtins.isPath p
+    then builtins.baseNameOf p
+    else if builtins.isString p
+    then
+      let
+        # strip leading storeDir and trailing slashes
+        noStoreDir = lib.removeSuffix "/"
+          (lib.removePrefix "${builtins.storeDir}/" p);
+        # a basename of a child of a store path isn't really
+        # referring to a store path, so removing the string
+        # context is safe (e. g. "hello" for "${hello}/bin/hello").
+        basename = builtins.unsafeDiscardStringContext
+          (builtins.baseNameOf p);
+      in
+        # If p is a direct child of storeDir, we need to remove
+        # the leading hash as well to make sure that:
+        # `storePathName drv == storePathName (toString drv)`.
+        if noStoreDir == basename
+        then builtins.substring 33 (-1) basename
+        else basename
+    else builtins.throw "Don't know how to get (base)name of "
+      + lib.generators.toPretty {} p;
+
 in {
   inherit
     drvTargets
+    storePathName
     ;
 }