* builtins.filterSource: pass the type of the file ("regular",
"directory", "symlink") as the second argument to the filter predicate.
This commit is contained in:
parent
63f3ce6d9a
commit
e4b0666f8e
|
@ -7,6 +7,10 @@
|
||||||
#include "expr-to-xml.hh"
|
#include "expr-to-xml.hh"
|
||||||
#include "nixexpr-ast.hh"
|
#include "nixexpr-ast.hh"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
|
||||||
|
@ -739,7 +743,20 @@ struct FilterFromExpr : PathFilter
|
||||||
|
|
||||||
bool operator () (const Path & path)
|
bool operator () (const Path & path)
|
||||||
{
|
{
|
||||||
Expr call = makeCall(filter, makePath(toATerm(path)));
|
struct stat st;
|
||||||
|
if (lstat(path.c_str(), &st))
|
||||||
|
throw SysError(format("getting attributes of path `%1%'") % path);
|
||||||
|
|
||||||
|
Expr call =
|
||||||
|
makeCall(
|
||||||
|
makeCall(filter, makePath(toATerm(path))),
|
||||||
|
makeStr(
|
||||||
|
S_ISREG(st.st_mode) ? "regular" :
|
||||||
|
S_ISDIR(st.st_mode) ? "directory" :
|
||||||
|
S_ISLNK(st.st_mode) ? "symlink" :
|
||||||
|
"unknown" /* not supported, will fail! */
|
||||||
|
));
|
||||||
|
|
||||||
return evalBool(state, call);
|
return evalBool(state, call);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,5 +3,7 @@ derivation {
|
||||||
system = "@system@";
|
system = "@system@";
|
||||||
builder = "@shell@";
|
builder = "@shell@";
|
||||||
args = ["-e" "-x" (builtins.toFile "builder" "PATH=@testPath@; ln -s $input $out")];
|
args = ["-e" "-x" (builtins.toFile "builder" "PATH=@testPath@; ln -s $input $out")];
|
||||||
input = builtins.filterSource (path: baseNameOf (toString path) != "foo") ./test-tmp/filterin;
|
input =
|
||||||
|
let filter = path: type: type != "symlink" && baseNameOf (toString path) != "foo";
|
||||||
|
in builtins.filterSource filter ./test-tmp/filterin;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,11 @@ mkdir $TEST_ROOT/filterin
|
||||||
mkdir $TEST_ROOT/filterin/foo
|
mkdir $TEST_ROOT/filterin/foo
|
||||||
touch $TEST_ROOT/filterin/foo/bar
|
touch $TEST_ROOT/filterin/foo/bar
|
||||||
touch $TEST_ROOT/filterin/xyzzy
|
touch $TEST_ROOT/filterin/xyzzy
|
||||||
|
ln -s xyzzy $TEST_ROOT/filterin/link
|
||||||
|
|
||||||
$NIX_BIN_DIR/nix-build ./filter-source.nix -o $TEST_ROOT/filterout
|
$NIX_BIN_DIR/nix-build ./filter-source.nix -o $TEST_ROOT/filterout
|
||||||
|
|
||||||
set -x
|
set -x
|
||||||
test ! -e $TEST_ROOT/filterout/foo/bar
|
test ! -e $TEST_ROOT/filterout/foo/bar
|
||||||
test -e $TEST_ROOT/filterout/xyzzy
|
test -e $TEST_ROOT/filterout/xyzzy
|
||||||
|
test ! -L $TEST_ROOT/filterout/link
|
||||||
|
|
Loading…
Reference in a new issue