diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-11-01T17·43+0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-11-01T17·43+0100 |
commit | e026bc3b05ca45c2d855d0a38820034ab4ef3c4c (patch) | |
tree | 3a4d9435ac4c37df0099439cf42c71f44cb44dba /src/libexpr/primops | |
parent | 1969f357b7f9abbff82b613b88ae53b84ff4e483 (diff) |
fetchMercurial: Don't fetch hashes we already have
Diffstat (limited to 'src/libexpr/primops')
-rw-r--r-- | src/libexpr/primops/fetchMercurial.cc | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/libexpr/primops/fetchMercurial.cc b/src/libexpr/primops/fetchMercurial.cc index 391ce45a0a98..e68d1a2a5539 100644 --- a/src/libexpr/primops/fetchMercurial.cc +++ b/src/libexpr/primops/fetchMercurial.cc @@ -22,6 +22,8 @@ struct HgInfo uint64_t revCount = 0; }; +std::regex commitHashRegex("^[0-9a-fA-F]{40}$"); + HgInfo exportMercurial(ref<Store> store, const std::string & uri, std::string rev, const std::string & name) { @@ -66,20 +68,28 @@ HgInfo exportMercurial(ref<Store> store, const std::string & uri, Path stampFile = fmt("%s/.hg/%s.stamp", cacheDir, hashString(htSHA512, rev).to_string(Base32, false)); /* If we haven't pulled this repo less than ‘tarball-ttl’ seconds, - do so now. FIXME: don't do this if "rev" is a hash and we - fetched it previously */ + do so now. */ time_t now = time(0); struct stat st; if (stat(stampFile.c_str(), &st) != 0 || st.st_mtime < now - settings.tarballTtl) { - Activity act(*logger, lvlTalkative, actUnknown, fmt("fetching Mercurial repository '%s'", uri)); - - if (pathExists(cacheDir)) { - runProgram("hg", true, { "pull", "-R", cacheDir, "--", uri }); - } else { - createDirs(dirOf(cacheDir)); - runProgram("hg", true, { "clone", "--noupdate", "--", uri, cacheDir }); + /* Except that if this is a commit hash that we already have, + we don't have to pull again. */ + if (!(std::regex_match(rev, commitHashRegex) + && pathExists(cacheDir) + && runProgram( + RunOptions("hg", { "log", "-R", cacheDir, "-r", rev, "--template", "1" }) + .killStderr(true)).second == "1")) + { + Activity act(*logger, lvlTalkative, actUnknown, fmt("fetching Mercurial repository '%s'", uri)); + + if (pathExists(cacheDir)) { + runProgram("hg", true, { "pull", "-R", cacheDir, "--", uri }); + } else { + createDirs(dirOf(cacheDir)); + runProgram("hg", true, { "clone", "--noupdate", "--", uri, cacheDir }); + } } writeFile(stampFile, ""); |