f88ac5c0b5
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>
66 lines
1.8 KiB
Nix
66 lines
1.8 KiB
Nix
{ depot, lib, ... }:
|
|
|
|
let
|
|
|
|
/* Takes an attribute set and adds a meta.targets
|
|
attribute to it which contains all direct children
|
|
of the attribute set which are derivations.
|
|
|
|
Type: attrs -> attrs
|
|
*/
|
|
drvTargets = attrs:
|
|
attrs // {
|
|
meta = {
|
|
targets = builtins.filter
|
|
(x: lib.isDerivation attrs."${x}")
|
|
(builtins.attrNames attrs);
|
|
} // (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
|
|
;
|
|
}
|