* querySubstitutablePathInfo: work properly when run via the daemon.
* --dry-run: print the paths that we don't know how to build/substitute.
This commit is contained in:
		
							parent
							
								
									b3c26180e3
								
							
						
					
					
						commit
						03427e76f1
					
				
					 7 changed files with 49 additions and 16 deletions
				
			
		|  | @ -217,7 +217,7 @@ static void initAndRun(int argc, char * * argv) | |||
| 
 | ||||
|     /* Automatically clean up the temporary roots file when we
 | ||||
|        exit. */ | ||||
|     RemoveTempRoots removeTempRoots; /* unused variable - don't remove */ | ||||
|     RemoveTempRoots removeTempRoots __attribute__((unused)); | ||||
| 
 | ||||
|     /* Make sure that the database gets closed properly, even if
 | ||||
|        terminate() is called (which happens sometimes due to bugs in | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ Path findOutput(const Derivation & drv, string id) | |||
| 
 | ||||
| 
 | ||||
| void queryMissing(const PathSet & targets, | ||||
|     PathSet & willBuild, PathSet & willSubstitute) | ||||
|     PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown) | ||||
| { | ||||
|     PathSet todo(targets.begin(), targets.end()), done; | ||||
| 
 | ||||
|  | @ -57,7 +57,10 @@ void queryMissing(const PathSet & targets, | |||
|         done.insert(p); | ||||
| 
 | ||||
|         if (isDerivation(p)) { | ||||
|             if (!store->isValidPath(p)) continue; | ||||
|             if (!store->isValidPath(p)) { | ||||
|                 unknown.insert(p); | ||||
|                 continue; | ||||
|             } | ||||
|             Derivation drv = derivationFromPath(p); | ||||
| 
 | ||||
|             bool mustBuild = false; | ||||
|  | @ -81,12 +84,11 @@ void queryMissing(const PathSet & targets, | |||
|         else { | ||||
|             if (store->isValidPath(p)) continue; | ||||
|             SubstitutablePathInfo info; | ||||
|             if (dynamic_cast<LocalStore *>(store.get())->querySubstitutablePathInfo(p, info)) { | ||||
|             if (store->querySubstitutablePathInfo(p, info)) { | ||||
|                 willSubstitute.insert(p); | ||||
|                 todo.insert(info.references.begin(), info.references.end()); | ||||
|             } | ||||
|             /* Not substitutable and not buildable; should we flag
 | ||||
|                this? */ | ||||
|             } else | ||||
|                 unknown.insert(p); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -29,7 +29,7 @@ Path findOutput(const Derivation & drv, string id); | |||
|    derivations that will be built, and the set of output paths that | ||||
|    will be substituted. */ | ||||
| void queryMissing(const PathSet & targets, | ||||
|     PathSet & willBuild, PathSet & willSubstitute); | ||||
|     PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown); | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -216,7 +216,16 @@ bool RemoteStore::hasSubstitutes(const Path & path) | |||
| bool RemoteStore::querySubstitutablePathInfo(const Path & path, | ||||
|     SubstitutablePathInfo & info) | ||||
| { | ||||
|     throw Error("not implemented"); | ||||
|     writeInt(wopQuerySubstitutablePathInfo, to); | ||||
|     writeString(path, to); | ||||
|     processStderr(); | ||||
|     unsigned int reply = readInt(from); | ||||
|     if (reply == 0) return false; | ||||
|     info.deriver = readString(from); | ||||
|     if (info.deriver != "") assertStorePath(info.deriver); | ||||
|     info.references = readStorePaths(from); | ||||
|     info.downloadSize = readLongLong(from); | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -33,6 +33,7 @@ typedef enum { | |||
|     wopQueryDeriver = 18, | ||||
|     wopSetOptions = 19, | ||||
|     wopCollectGarbage = 20, | ||||
|     wopQuerySubstitutablePathInfo = 21, | ||||
| } WorkerOp; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -531,7 +531,7 @@ static void queryInstSources(EvalState & state, | |||
| 
 | ||||
| static void printMissing(EvalState & state, const DrvInfos & elems) | ||||
| { | ||||
|     PathSet targets, willBuild, willSubstitute; | ||||
|     PathSet targets, willBuild, willSubstitute, unknown; | ||||
|     for (DrvInfos::const_iterator i = elems.begin(); i != elems.end(); ++i) { | ||||
|         Path drvPath = i->queryDrvPath(state); | ||||
|         if (drvPath != "") | ||||
|  | @ -540,17 +540,24 @@ static void printMissing(EvalState & state, const DrvInfos & elems) | |||
|             targets.insert(i->queryOutPath(state)); | ||||
|     } | ||||
| 
 | ||||
|     queryMissing(targets, willBuild, willSubstitute); | ||||
|     queryMissing(targets, willBuild, willSubstitute, unknown); | ||||
| 
 | ||||
|     if (!willBuild.empty()) { | ||||
|         printMsg(lvlInfo, format("the following derivations will be built:")); | ||||
|         for (PathSet::iterator i = willBuild.begin(); i != willBuild.end(); ++i) | ||||
|         foreach (PathSet::iterator, i, willBuild) | ||||
|             printMsg(lvlInfo, format("  %1%") % *i); | ||||
|     } | ||||
| 
 | ||||
|     if (!willSubstitute.empty()) { | ||||
|         printMsg(lvlInfo, format("the following paths will be substituted:")); | ||||
|         for (PathSet::iterator i = willSubstitute.begin(); i != willSubstitute.end(); ++i) | ||||
|         printMsg(lvlInfo, format("the following paths will be downloaded/copied:")); | ||||
|         foreach (PathSet::iterator, i, willSubstitute) | ||||
|             printMsg(lvlInfo, format("  %1%") % *i); | ||||
|     } | ||||
| 
 | ||||
|     if (!unknown.empty()) { | ||||
|         printMsg(lvlInfo, format("don't know how to build the following paths%1%:") | ||||
|             % (readOnlyMode ? " (may be caused by read-only store access)" : "")); | ||||
|         foreach (PathSet::iterator, i, unknown) | ||||
|             printMsg(lvlInfo, format("  %1%") % *i); | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -431,6 +431,20 @@ static void performOp(unsigned int clientVersion, | |||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     case wopQuerySubstitutablePathInfo: { | ||||
|         Path path = absPath(readString(from)); | ||||
|         startWork(); | ||||
|         SubstitutablePathInfo info; | ||||
|         bool res = store->querySubstitutablePathInfo(path, info); | ||||
|         stopWork(); | ||||
|         writeInt(res ? 1 : 0, to); | ||||
|         if (res) { | ||||
|             writeString(info.deriver, to); | ||||
|             writeStringSet(info.references, to); | ||||
|             writeLongLong(info.downloadSize, to); | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
|              | ||||
|     default: | ||||
|         throw Error(format("invalid operation %1%") % op); | ||||
|  | @ -440,7 +454,7 @@ static void performOp(unsigned int clientVersion, | |||
| 
 | ||||
| static void processConnection() | ||||
| { | ||||
|     RemoveTempRoots removeTempRoots; /* unused variable - don't remove */ | ||||
|     RemoveTempRoots removeTempRoots __attribute__((unused)); | ||||
| 
 | ||||
|     canSendStderr = false; | ||||
|     myPid = getpid();     | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue