From 9f64cb89cbbd0cd0540ad99e3578b6cecd385a81 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 27 Jul 2017 17:15:09 +0200 Subject: [PATCH] builtins.fetchgit: Respect tarball-ttl I.e. if the local ref is more recent than tarball-ttl seconds, then don't check the remote. --- src/libexpr/primops/fetchgit.cc | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/libexpr/primops/fetchgit.cc b/src/libexpr/primops/fetchgit.cc index b64a00b61..3ab2644c8 100644 --- a/src/libexpr/primops/fetchgit.cc +++ b/src/libexpr/primops/fetchgit.cc @@ -4,6 +4,8 @@ #include "store-api.hh" #include "pathlocks.hh" +#include + namespace nix { Path exportGit(ref store, const std::string & uri, const std::string & rev) @@ -24,7 +26,23 @@ Path exportGit(ref store, const std::string & uri, const std::string & re Path localRefFile = cacheDir + "/refs/heads/" + localRef; - runProgram("git", true, { "-C", cacheDir, "fetch", "--force", uri, rev + ":" + localRef }); + /* If the local ref is older than ‘tarball-ttl’ seconds, do a git + fetch to update the local ref to the remote ref. */ + time_t now = time(0); + struct stat st; + if (stat(localRefFile.c_str(), &st) != 0 || + st.st_mtime < now - settings.tarballTtl) + { + runProgram("git", true, { "-C", cacheDir, "fetch", "--force", uri, rev + ":" + localRef }); + + struct timeval times[2]; + times[0].tv_sec = now; + times[0].tv_usec = 0; + times[1].tv_sec = now; + times[1].tv_usec = 0; + + utimes(localRefFile.c_str(), times); + } std::string commitHash = chomp(readFile(localRefFile));