diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-11-03 13:48:02 +0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-11-03 13:55:31 +0100 |
commit | ee6ac38848277d80c62fa5c2734ada1b5edc8680 (patch) | |
tree | b334ed6f568806c94f7cfb135327060a04ab9db7 /src/libexpr/primops | |
parent | 4dee01da7c7bc5d67dc916f159bfee8a873ac19b (diff) |
fetchGit/fetchMercurial: Filter out directories with untracked files
Diffstat (limited to 'src/libexpr/primops')
-rw-r--r-- | src/libexpr/primops/fetchMercurial.cc | 12 | ||||
-rw-r--r-- | src/libexpr/primops/fetchgit.cc | 12 |
2 files changed, 16 insertions, 8 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); }; |