fetchGit: Ignore tarballTtl if rev is set and not in the repo.
Fixes #1697.
This commit is contained in:
		
							parent
							
								
									0fc3e581e0
								
							
						
					
					
						commit
						eedbc4e06c
					
				
					 3 changed files with 43 additions and 24 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue