From 3fab3b780b04f6cbddf6cdef625adb095c8702e3 Mon Sep 17 00:00:00 2001 From: sterni Date: Sat, 1 Oct 2022 20:09:07 +0200 Subject: [PATCH] feat(nix/dependency-analyzer): improved directDrvDeps for Nix >= 2.6 This codepath will basically never be used in depot, but I want to add it as kind of a note to myself. It's kind of a neat feature, although I'm not quite sure it is going to stick around. Change-Id: If0e26ef47bdedc6dbf3d048ad4fc9a3a1fd6c5a2 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6833 Reviewed-by: grfn Tested-by: BuildkiteCI --- nix/dependency-analyzer/default.nix | 36 ++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/nix/dependency-analyzer/default.nix b/nix/dependency-analyzer/default.nix index 4ced173ea..c988d9409 100644 --- a/nix/dependency-analyzer/default.nix +++ b/nix/dependency-analyzer/default.nix @@ -23,19 +23,33 @@ let in appendContext drvPath' { ${drvPath'} = { path = true; }; }; - # Find all quoted references to a derivation path in the specified drv file. - # Should correspond to the list of input derivations, but is obviously a big - # HACK as we just grep for store paths that look right. This should eventually - # be solved properly by parsing the drv file. + # Determine all paths a derivation depends on, i.e. input derivations and + # files imported into the Nix store. + # + # Implementation for Nix < 2.6 is quite hacky at the moment. # # Type: str -> [str] - directDrvDeps = drvPath: builtins.concatLists ( - builtins.filter builtins.isList ( - builtins.split - "\"(${lib.escapeRegex builtins.storeDir}/[[:alnum:]+._?=-]+.drv)\"" - (builtins.readFile drvPath) - ) - ); + # + # TODO(sterni): clean this up and expose it + directDrvDeps = + if lib.versionAtLeast builtins.nixVersion "2.6" + then + # Since https://github.com/NixOS/nix/pull/1643, Nix apparently »preserves + # string context« through a readFile invocation. This has the side effect + # that it becomes possible to query the actual references a store path has. + # Not a 100% sure this is intended, but _very_ convenient for us here. + drvPath: builtins.attrNames (builtins.getContext (builtins.readFile drvPath)) + else + # For Nix < 2.6 we have to rely on HACK, namely grepping for quoted store + # path references in the file. In the future this should be replaced by + # a proper derivation parser. + drvPath: builtins.concatLists ( + builtins.filter builtins.isList ( + builtins.split + "\"(${lib.escapeRegex builtins.storeDir}/[[:alnum:]+._?=-]+.drv)\"" + (builtins.readFile drvPath) + ) + ); # Maps a list of derivation to the list of corresponding `drvPath`s. #