feat(readTree): Add support for path-dependent args filtering

Adds another argument to readTree itself which can be passed when
importing readTree (e.g. in our default.nix) to filter the arguments
passed to a target based on that target's location in the tree.

This is intentionally not yet mentioned in the docs, and also
intentionally implemented in such a way that the API surface of
readTree doesn't change. The reason for this is that I want to figure
out whether these filter functions are actually useful, e.g. within
depot by filtering user-folder passing, and then refactor the readTree
API to find a public way of exposing this as part of the readTree
function itself (and not its import).

Relates to b/143.

Change-Id: I2cdf09f67916527d2337f4bfb578749aeac51a6a
Reviewed-on: https://cl.tvl.fyi/c/depot/+/3433
Tested-by: BuildkiteCI
Reviewed-by: grfn <grfn@gws.fyi>
Reviewed-by: sterni <sternenseemann@systemli.org>
This commit is contained in:
Vincent Ambo 2021-08-26 19:41:50 +03:00 committed by tazjin
parent d857d5ad68
commit 8b851956ad

View file

@ -4,7 +4,12 @@
#
# Provides a function to automatically read a a filesystem structure
# into a Nix attribute set.
{ ... }:
#
# Optionally accepts an argument `argsFilter` on import, which is a
# function that receives the current tree location (as a list of
# strings) and the argument set and can arbitrarily modify it.
{ argsFilter ? (x: _parts: x)
, ... }:
let
inherit (builtins)
@ -56,7 +61,7 @@ let
assert assertMsg
(pathType == "lambda")
"readTree: trying to import ${toString path}, but its a ${pathType}, you need to make it a function like { depot, pkgs, ... }";
importedFile (argsWithPath args parts);
importedFile (argsFilter (argsWithPath args parts) parts);
in if (isAttrs imported)
then imported // (marker parts)
else imported;