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 <grfn@gws.fyi>
Tested-by: BuildkiteCI
This commit is contained in:
sterni 2022-10-01 20:09:07 +02:00
parent 57d5988b34
commit 3fab3b780b

View file

@ -23,13 +23,27 @@ 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 (
#
# 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)\""