From fe8915842d63e147a4912a3cc82d49f6a8979cb7 Mon Sep 17 00:00:00 2001 From: ilkecan Date: Wed, 22 Sep 2021 21:58:21 +0300 Subject: [PATCH] Add a warning to `filterSource` Warn about the usage of `filterSource` with Nix store paths --- src/libexpr/primops.cc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 8a087a781748..c4d4f72dc2f1 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -413,7 +413,7 @@ static RegisterPrimOp primop_isNull({ Return `true` if *e* evaluates to `null`, and `false` otherwise. > **Warning** - > + > > This function is *deprecated*; just write `e == null` instead. )", .fun = prim_isNull, @@ -1919,6 +1919,20 @@ static RegisterPrimOp primop_filterSource({ .name = "__filterSource", .args = {"e1", "e2"}, .doc = R"( + > **Warning** + > + > `filterSource` should not be used to filter Nix output paths + > (directories whose parent is `/nix/store`). Since `filterSource` + > uses the name of the input directory while naming the output + > directory, doing so will produce a directory name in the form of + > `--`, where `-` is the name of + > the input directory. Since `` depends on the unfiltered + > directory, the name of the output directory will indirectly + > depend on files that are filtered out by the function. This will + > trigger a rebuild even when a filtered out file is changed. Use + > `builtins.path` instead, which allows specifying the name of the + > output directory. + This function allows you to copy sources into the Nix store while filtering certain files. For instance, suppose that you want to use the directory `source-dir` as an input to a Nix expression, e.g. @@ -2519,7 +2533,7 @@ static RegisterPrimOp primop_tail({ the argument isn’t a list or is an empty list. > **Warning** - > + > > This function should generally be avoided since it's inefficient: > unlike Haskell's `tail`, it takes O(n) time, so recursing over a > list by repeatedly calling `tail` takes O(n^2) time.