From ee6ac38848277d80c62fa5c2734ada1b5edc8680 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 3 Nov 2017 13:48:02 +0100 Subject: [PATCH] fetchGit/fetchMercurial: Filter out directories with untracked files --- src/libexpr/primops/fetchMercurial.cc | 12 ++++++++---- src/libexpr/primops/fetchgit.cc | 12 ++++++++---- tests/fetchGit.sh | 9 ++++++--- tests/fetchMercurial.sh | 9 ++++++--- 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, 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, 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 ]]