about summary refs log tree commit diff
path: root/default.nix
diff options
context:
space:
mode:
authorsterni <sternenseemann@systemli.org>2021-09-15T11·22+0200
committersterni <sternenseemann@systemli.org>2021-09-15T22·37+0000
commitd7f60bcb043925670c02a8ccf9067e97d647bc87 (patch)
tree927382756adc56ef8c8b63558603234cf23ab204 /default.nix
parentd904724adf6650747d79b80426432f59620ec175 (diff)
feat(nix/readTree): record list of children added by readTree r/2869
This change adds a new attribute to readTree nodes, `__readTreeChildren`
which is a list of attribute names added to this node by readTree.

This is then used by `gather` for `ci.targets` to avoid evaluating
attributes unnecessarily. Especially since Nix is not as lazy as we'd
like when determining types (i. e. child ? __readTree needs to force
`child` even when it's not an attribute set), evaluating attributes
unnecessarily is sometimes problematic.

Change-Id: I0a98691d41f987e23ee7e9ba21fbe465da5fe402
Diffstat (limited to 'default.nix')
-rw-r--r--default.nix3
1 files changed, 2 insertions, 1 deletions
diff --git a/default.nix b/default.nix
index 866b3fa6bfe9..941110b22200 100644
--- a/default.nix
+++ b/default.nix
@@ -79,13 +79,14 @@ let
       # Include the node itself if it is eligible.
       (if eligible node then [ node ] else [])
       # Include eligible children of the node
-      ++ concatMap gather (attrValues node)
+      ++ concatMap gather (map (attr: node."${attr}") node.__readTreeChildren)
       # Include specified sub-targets of the node
       ++ filter eligible (map
            (k: (node."${k}" or {}) // {
              # Keep the same tree location, but explicitly mark this
              # node as a subtarget.
              __readTree = node.__readTree;
+             __readTreeChildren = [];
              __subtarget = k;
            })
            (node.meta.targets or []))