From 6813598c17959862734e5878d745e7dd8a197717 Mon Sep 17 00:00:00 2001 From: sterni Date: Sat, 28 May 2022 13:49:34 +0200 Subject: [PATCH] feat(nix/utils): add onlyDrvPath to get the drvPath w/o the outputs I want to use this utility in a deploy script where the .drv is nix-copy-closure-d to a remote host and realized there. Consequently it doesn't make sense that the local deploy script depends on the derivation's outputs which drvPath does by default. This also came up when working on //nix/buildkite, although we didn't end up using it there. Change-Id: I952bbfd4d7e9de212569d5ee12182eb50d360f53 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5767 Tested-by: BuildkiteCI Autosubmit: sterni Reviewed-by: tazjin --- nix/utils/default.nix | 16 ++++++++++++++++ nix/utils/tests/default.nix | 11 +++++++++++ 2 files changed, 27 insertions(+) diff --git a/nix/utils/default.nix b/nix/utils/default.nix index 0c6c88faf..a29f34651 100644 --- a/nix/utils/default.nix +++ b/nix/utils/default.nix @@ -43,6 +43,21 @@ let else builtins.throw "Don't know how to get (base)name of " + lib.generators.toPretty { } p; + /* Retrieves the drvPath attribute from a given derivation, but ensures that + the resulting string only depends on the `.drv` file in the nix store and + not on its realised outputs as well. + + Type: drv -> string + */ + onlyDrvPath = drv: + let + inherit (drv) drvPath; + unsafeDrvPath = builtins.unsafeDiscardStringContext drvPath; + in + builtins.appendContext unsafeDrvPath { + ${unsafeDrvPath} = { path = true; }; + }; + /* Query the type of a path exposing the same information as would be by `builtins.readDir`, but for a single, specific target path. @@ -152,6 +167,7 @@ in { inherit storePathName + onlyDrvPath pathType isDirectory isRegularFile diff --git a/nix/utils/tests/default.nix b/nix/utils/tests/default.nix index 344a1771d..d5159a843 100644 --- a/nix/utils/tests/default.nix +++ b/nix/utils/tests/default.nix @@ -15,6 +15,7 @@ let isSymlink pathType storePathName + onlyDrvPath ; assertUtilsPred = msg: act: exp: [ @@ -91,9 +92,19 @@ let (storePathName cleanedSource) cleanedSource.name) ]; + + onlyDrvPathTests = it "correctly updates the string context of drvPath" [ + (assertEq "onlyDrvPath only produces path dependencies" + (builtins.all + (dep: dep.path or false) + (builtins.attrValues + (builtins.getContext (onlyDrvPath depot.tools.cheddar)))) + true) + ]; in runTestsuite "nix.utils" [ pathPredicates storePathNameTests + onlyDrvPathTests ]