diff options
author | sterni <sternenseemann@systemli.org> | 2021-04-20T08·18+0200 |
---|---|---|
committer | sterni <sternenseemann@systemli.org> | 2021-04-20T11·00+0000 |
commit | f88ac5c0b5292ad2398927fd0ec97489399493e6 (patch) | |
tree | a9232fc9b0c2a260c10ea503db2d31e214954dd8 /nix/utils | |
parent | c21dee2b5bad39a44afb900684236c48f767069a (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.nix | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/nix/utils/default.nix b/nix/utils/default.nix index 33f72e39039b..2d765c0c4526 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 ; } |