about summary refs log tree commit diff
path: root/nix
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2021-08-26T16·41+0300
committertazjin <mail@tazj.in>2021-08-26T20·33+0000
commit8b851956ad3adab52c0740d6d9353d3900613fe3 (patch)
tree741327b0e55e9f6fc3d7f67a0835d04f16b6b123 /nix
parentd857d5ad685e41c24f376fa16182588e938624d0 (diff)
feat(readTree): Add support for path-dependent args filtering r/2792
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>
Diffstat (limited to 'nix')
-rw-r--r--nix/readTree/default.nix9
1 files changed, 7 insertions, 2 deletions
diff --git a/nix/readTree/default.nix b/nix/readTree/default.nix
index 4d5385921e..633915f78b 100644
--- a/nix/readTree/default.nix
+++ b/nix/readTree/default.nix
@@ -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 it’s 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;