From f88ac5c0b5292ad2398927fd0ec97489399493e6 Mon Sep 17 00:00:00 2001 From: sterni Date: Tue, 20 Apr 2021 10:18:28 +0200 Subject: feat(nix/utils): add storePathName, a more generic baseNameOf 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 --- nix/utils/default.nix | 42 ++++++++++++++++++++++++++++++++++++++++++ web/bubblegum/default.nix | 14 ++++++-------- 2 files changed, 48 insertions(+), 8 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 ; } diff --git a/web/bubblegum/default.nix b/web/bubblegum/default.nix index d9b106dddedd..ed4e48839b89 100644 --- a/web/bubblegum/default.nix +++ b/web/bubblegum/default.nix @@ -5,6 +5,7 @@ let inherit (depot.nix) runExecline getBins + utils ; statusCodes = { @@ -179,16 +180,13 @@ let # the input path or name of the input derivation. # Must be given if the input is a string. , name ? null - }: + , ... + }@args: input: let drvName = - if name != null - then name - else if builtins.isPath input - then baseNameOf input - else if lib.isDerivation input - then input.name - else builtins.throw "Need name"; + if builtins.isString input || args ? name + then args.name + else utils.storePathName input; script = if builtins.isPath input || lib.isDerivation input then input -- cgit 1.4.1