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; | ||||
| 
 | ||||
|     /* 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.
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue