feat(readTree): Add support for skipping directory subtrees

Placing a special `.skip-subtree` file in any directory will now
prevent readTree from further traversing that part of the tree.

This makes it possible to have packages with internal Nix files that
are incompatible with the larger depot structure, for example for
projects like buildGo.nix which need to be compatible with the
external nixpkgs model.
This commit is contained in:
Vincent Ambo 2019-12-19 15:33:30 +00:00
parent e996141d2e
commit 467a66bac2

View file

@ -5,6 +5,7 @@ let
attrNames
baseNameOf
filter
hasAttr
head
length
listToAttrs
@ -35,9 +36,15 @@ let
self = importWithMark path parts;
joinChild = c: path + ("/" + c);
# Import non-empty subdirectories
# Import subdirectories of the current one, unless the special
# `.skip-subtree` file exists which makes readTree ignore the
# children.
#
# This file can optionally contain information on why the tree
# should be ignored, but its content is not inspected by
# readTree
filterDir = f: dir."${f}" == "directory";
children = map (c: {
children = if hasAttr ".skip-subtree" dir then [] else map (c: {
name = c;
value = readTree (joinChild c) (parts ++ [ c ]);
}) (filter filterDir (attrNames dir));