summaryrefslogtreecommitdiff
path: root/lib/fileset/internal.nix
diff options
context:
space:
mode:
authorSilvan Mosberger <contact@infinisil.com>2023-11-14 07:25:15 +0100
committerSilvan Mosberger <contact@infinisil.com>2023-11-14 07:30:16 +0100
commit2035f8a3247a0fce215963e16a161d9387f4b070 (patch)
tree81ec517cfa1047dfa17f69696ed866b223d1fc5c /lib/fileset/internal.nix
parentlib.fileset.fileFilter: Minor cleanups and more tests (diff)
downloadnixpkgs-2035f8a3247a0fce215963e16a161d9387f4b070.tar.gz
lib.fileset.fileFilter: Don't run predicate unnecessarily
Before: nix-repl> fileset.trace (fileset.fileFilter (file: builtins.trace file.name false) ./default.nix) trace: README.md trace: benchmark.sh trace: default.nix trace: internal.nix trace: mock-splitRoot.nix trace: tests.sh After: nix-repl> fileset.trace (fileset.fileFilter (file: builtins.trace file.name false) ./default.nix) trace: default.nix
Diffstat (limited to 'lib/fileset/internal.nix')
-rw-r--r--lib/fileset/internal.nix39
1 files changed, 23 insertions, 16 deletions
diff --git a/lib/fileset/internal.nix b/lib/fileset/internal.nix
index a4a230a47983..622e9506679d 100644
--- a/lib/fileset/internal.nix
+++ b/lib/fileset/internal.nix
@@ -732,29 +732,36 @@ rec {
# Type: ({ name, type, ... } -> Bool) -> FileSet -> FileSet
_fileFilter = predicate: fileset:
let
- # Check the predicate for a path and a filesetTree, returning a new filesetTree
- # Type: Path -> filesetTree -> filesetTree
- recurse = path: tree:
+ # Check the predicate for a single file
+ # Type: String -> String -> filesetTree
+ fromFile = name: type:
+ if
+ predicate {
+ inherit name type;
+ # To ensure forwards compatibility with more arguments being added in the future,
+ # adding an attribute which can't be deconstructed :)
+ "lib.fileset.fileFilter: The predicate function passed as the first argument must be able to handle extra attributes for future compatibility. If you're using `{ name, file }:`, use `{ name, file, ... }:` instead." = null;
+ }
+ then
+ type
+ else
+ null;
+
+ # Check the predicate for all files in a directory
+ # Type: Path -> filesetTree
+ fromDir = path: tree:
mapAttrs (name: subtree:
if isAttrs subtree || subtree == "directory" then
- recurse (path + "/${name}") subtree
- else if
- predicate {
- inherit name;
- type = subtree;
- # To ensure forwards compatibility with more arguments being added in the future,
- # adding an attribute which can't be deconstructed :)
- "lib.fileset.fileFilter: The predicate function passed as the first argument must be able to handle extra attributes for future compatibility. If you're using `{ name, file }:`, use `{ name, file, ... }:` instead." = null;
- }
- then
- subtree
- else
+ fromDir (path + "/${name}") subtree
+ else if subtree == null then
null
+ else
+ fromFile name subtree
) (_directoryEntries path tree);
in
if fileset._internalIsEmptyWithoutBase then
_emptyWithoutBase
else
_create fileset._internalBase
- (recurse fileset._internalBase fileset._internalTree);
+ (fromDir fileset._internalBase fileset._internalTree);
}