Skip to content

Commit

Permalink
Merge branch 'fetchGit-fast-revision-update'
Browse files Browse the repository at this point in the history
  • Loading branch information
shlevy committed Dec 5, 2017
2 parents 7f2c324 + eedbc4e commit 11a7f8c
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 24 deletions.
59 changes: 35 additions & 24 deletions src/libexpr/primops/fetchGit.cc
Expand Up @@ -89,32 +89,43 @@ GitInfo exportGit(ref<Store> store, const std::string & uri,

Path localRefFile = cacheDir + "/refs/heads/" + localRef;

/* If the local ref is older than ‘tarball-ttl’ seconds, do a git
fetch to update the local ref to the remote ref. */
bool doFetch;
time_t now = time(0);
struct stat st;
if (stat(localRefFile.c_str(), &st) != 0 ||
st.st_mtime <= now - settings.tarballTtl)
{
if (rev == "" ||
chomp(runProgram(
RunOptions("git", { "-C", cacheDir, "cat-file", "-t", rev })
.killStderr(true)).second) != "commit")
{
Activity act(*logger, lvlTalkative, actUnknown, fmt("fetching Git repository '%s'", uri));

// FIXME: git stderr messes up our progress indicator, so
// we're using --quiet for now. Should process its stderr.
runProgram("git", true, { "-C", cacheDir, "fetch", "--quiet", "--force", "--", uri, *ref + ":" + 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);
/* If a rev was specified, we need to fetch if it's not in the
repo. */
if (rev != "") {
try {
runProgram("git", true, { "-C", cacheDir, "cat-file", "-e", rev });
doFetch = false;
} catch (ExecError & e) {
if (WIFEXITED(e.status)) {
doFetch = true;
} else {
throw;
}
}
} else {
/* If the local ref is older than ‘tarball-ttl’ seconds, do a
git fetch to update the local ref to the remote ref. */
struct stat st;
doFetch = stat(localRefFile.c_str(), &st) != 0 ||
st.st_mtime <= now - settings.tarballTtl;
}
if (doFetch)
{
Activity act(*logger, lvlTalkative, actUnknown, fmt("fetching Git repository '%s'", uri));

// FIXME: git stderr messes up our progress indicator, so
// we're using --quiet for now. Should process its stderr.
runProgram("git", true, { "-C", cacheDir, "fetch", "--quiet", "--force", "--", uri, *ref + ":" + 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);
}

// FIXME: check whether rev is an ancestor of ref.
Expand Down
1 change: 1 addition & 0 deletions tests/common.sh.in
Expand Up @@ -21,6 +21,7 @@ export NIX_REMOTE=$NIX_REMOTE_
unset NIX_PATH
export TEST_HOME=$TEST_ROOT/test-home
export HOME=$TEST_HOME
unset XDG_CACHE_HOME
mkdir -p $TEST_HOME

export PATH=@bindir@:$PATH
Expand Down
7 changes: 7 additions & 0 deletions tests/fetchGit.sh
Expand Up @@ -86,3 +86,10 @@ git -C $repo commit -m 'Bla3' -a

path4=$(nix eval --tarball-ttl 0 --raw "(builtins.fetchGit file://$repo).outPath")
[[ $path2 = $path4 ]]

# tarball-ttl should be ignored if we specify a rev
echo delft > $repo/hello
git -C $repo add hello
git -C $repo commit -m 'Bla4'
rev3=$(git -C $repo rev-parse HEAD)
nix eval --tarball-ttl 3600 "(builtins.fetchGit { url = $repo; rev = \"$rev3\"; })" >/dev/null

0 comments on commit 11a7f8c

Please sign in to comment.