aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/primops/fetchMercurial.cc12
-rw-r--r--src/libexpr/primops/fetchgit.cc12
-rw-r--r--tests/fetchGit.sh9
-rw-r--r--tests/fetchMercurial.sh9
4 files changed, 28 insertions, 14 deletions
diff --git a/src/libexpr/primops/fetchMercurial.cc b/src/libexpr/primops/fetchMercurial.cc
index 2a423f61b..7def7103b 100644
--- a/src/libexpr/primops/fetchMercurial.cc
+++ b/src/libexpr/primops/fetchMercurial.cc
@@ -47,11 +47,15 @@ HgInfo exportMercurial(ref<Store> store, const std::string & uri,
PathFilter filter = [&](const Path & p) -> bool {
assert(hasPrefix(p, uri));
- auto st = lstat(p);
std::string file(p, uri.size() + 1);
- if (file == ".hg") return false;
- // FIXME: filter out directories with no tracked files.
- if (S_ISDIR(st.st_mode)) return true;
+
+ auto st = lstat(p);
+
+ if (S_ISDIR(st.st_mode)) {
+ auto i = files.lower_bound(file);
+ return i != files.end() && hasPrefix(*i, file);
+ }
+
return files.count(file);
};
diff --git a/src/libexpr/primops/fetchgit.cc b/src/libexpr/primops/fetchgit.cc
index 1d8f55bcd..baa48f642 100644
--- a/src/libexpr/primops/fetchgit.cc
+++ b/src/libexpr/primops/fetchgit.cc
@@ -44,11 +44,15 @@ GitInfo exportGit(ref<Store> store, const std::string & uri,
PathFilter filter = [&](const Path & p) -> bool {
assert(hasPrefix(p, uri));
- auto st = lstat(p);
std::string file(p, uri.size() + 1);
- if (file == ".git") return false;
- // FIXME: filter out directories with no tracked files.
- if (S_ISDIR(st.st_mode)) return true;
+
+ auto st = lstat(p);
+
+ if (S_ISDIR(st.st_mode)) {
+ auto i = files.lower_bound(file);
+ return i != files.end() && hasPrefix(*i, file);
+ }
+
return files.count(file);
};
diff --git a/tests/fetchGit.sh b/tests/fetchGit.sh
index e2bb7b68c..a967380cd 100644
--- a/tests/fetchGit.sh
+++ b/tests/fetchGit.sh
@@ -57,15 +57,18 @@ path2=$(nix eval --raw "(builtins.fetchGit $repo).outPath")
[[ $path = $path2 ]]
# Using an unclean tree should yield the tracked but uncommitted changes.
-echo foo > $repo/foo
+mkdir $repo/dir1 $repo/dir2
+echo foo > $repo/dir1/foo
echo bar > $repo/bar
-git -C $repo add foo
+echo bar > $repo/dir2/bar
+git -C $repo add dir1/foo
git -C $repo rm hello
path2=$(nix eval --raw "(builtins.fetchGit $repo).outPath")
[ ! -e $path2/hello ]
[ ! -e $path2/bar ]
-[[ $(cat $path2/foo) = foo ]]
+[ ! -e $path2/dir2/bar ]
+[[ $(cat $path2/dir1/foo) = foo ]]
[[ $(nix eval --raw "(builtins.fetchGit $repo).rev") = 0000000000000000000000000000000000000000 ]]
diff --git a/tests/fetchMercurial.sh b/tests/fetchMercurial.sh
index 9c897ada9..0c9f4bdbb 100644
--- a/tests/fetchMercurial.sh
+++ b/tests/fetchMercurial.sh
@@ -58,15 +58,18 @@ path2=$(nix eval --raw "(builtins.fetchMercurial $repo).outPath")
[[ $path = $path2 ]]
# Using an unclean tree should yield the tracked but uncommitted changes.
-echo foo > $repo/foo
+mkdir $repo/dir1 $repo/dir2
+echo foo > $repo/dir1/foo
echo bar > $repo/bar
-hg add --cwd $repo foo
+echo bar > $repo/dir2/bar
+hg add --cwd $repo dir1/foo
hg rm --cwd $repo hello
path2=$(nix eval --raw "(builtins.fetchMercurial $repo).outPath")
[ ! -e $path2/hello ]
[ ! -e $path2/bar ]
-[[ $(cat $path2/foo) = foo ]]
+[ ! -e $path2/dir2/bar ]
+[[ $(cat $path2/dir1/foo) = foo ]]
[[ $(nix eval --raw "(builtins.fetchMercurial $repo).rev") = 0000000000000000000000000000000000000000 ]]