forked from lix-project/lix
Merge branch 'fetchGit-fast-revision-update'
This commit is contained in:
commit
11a7f8ce14
|
@ -89,32 +89,43 @@ GitInfo exportGit(ref<Store> store, const std::string & uri,
|
||||||
|
|
||||||
Path localRefFile = cacheDir + "/refs/heads/" + localRef;
|
Path localRefFile = cacheDir + "/refs/heads/" + localRef;
|
||||||
|
|
||||||
/* If the local ref is older than ‘tarball-ttl’ seconds, do a git
|
bool doFetch;
|
||||||
fetch to update the local ref to the remote ref. */
|
|
||||||
time_t now = time(0);
|
time_t now = time(0);
|
||||||
struct stat st;
|
/* If a rev was specified, we need to fetch if it's not in the
|
||||||
if (stat(localRefFile.c_str(), &st) != 0 ||
|
repo. */
|
||||||
st.st_mtime <= now - settings.tarballTtl)
|
if (rev != "") {
|
||||||
{
|
try {
|
||||||
if (rev == "" ||
|
runProgram("git", true, { "-C", cacheDir, "cat-file", "-e", rev });
|
||||||
chomp(runProgram(
|
doFetch = false;
|
||||||
RunOptions("git", { "-C", cacheDir, "cat-file", "-t", rev })
|
} catch (ExecError & e) {
|
||||||
.killStderr(true)).second) != "commit")
|
if (WIFEXITED(e.status)) {
|
||||||
{
|
doFetch = true;
|
||||||
Activity act(*logger, lvlTalkative, actUnknown, fmt("fetching Git repository '%s'", uri));
|
} else {
|
||||||
|
throw;
|
||||||
// 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);
|
|
||||||
}
|
}
|
||||||
|
} 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.
|
// FIXME: check whether rev is an ancestor of ref.
|
||||||
|
|
|
@ -21,6 +21,7 @@ export NIX_REMOTE=$NIX_REMOTE_
|
||||||
unset NIX_PATH
|
unset NIX_PATH
|
||||||
export TEST_HOME=$TEST_ROOT/test-home
|
export TEST_HOME=$TEST_ROOT/test-home
|
||||||
export HOME=$TEST_HOME
|
export HOME=$TEST_HOME
|
||||||
|
unset XDG_CACHE_HOME
|
||||||
mkdir -p $TEST_HOME
|
mkdir -p $TEST_HOME
|
||||||
|
|
||||||
export PATH=@bindir@:$PATH
|
export PATH=@bindir@:$PATH
|
||||||
|
|
|
@ -86,3 +86,10 @@ git -C $repo commit -m 'Bla3' -a
|
||||||
|
|
||||||
path4=$(nix eval --tarball-ttl 0 --raw "(builtins.fetchGit file://$repo).outPath")
|
path4=$(nix eval --tarball-ttl 0 --raw "(builtins.fetchGit file://$repo).outPath")
|
||||||
[[ $path2 = $path4 ]]
|
[[ $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
|
||||||
|
|
Loading…
Reference in a new issue