* 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:
Eelco Dolstra 2008-08-04 11:44:50 +00:00
parent b3c26180e3
commit 03427e76f1
7 changed files with 49 additions and 16 deletions

View file

@ -217,7 +217,7 @@ static void initAndRun(int argc, char * * argv)
/* Automatically clean up the temporary roots file when we /* Automatically clean up the temporary roots file when we
exit. */ exit. */
RemoveTempRoots removeTempRoots; /* unused variable - don't remove */ RemoveTempRoots removeTempRoots __attribute__((unused));
/* Make sure that the database gets closed properly, even if /* Make sure that the database gets closed properly, even if
terminate() is called (which happens sometimes due to bugs in terminate() is called (which happens sometimes due to bugs in

View file

@ -46,7 +46,7 @@ Path findOutput(const Derivation & drv, string id)
void queryMissing(const PathSet & targets, void queryMissing(const PathSet & targets,
PathSet & willBuild, PathSet & willSubstitute) PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown)
{ {
PathSet todo(targets.begin(), targets.end()), done; PathSet todo(targets.begin(), targets.end()), done;
@ -57,7 +57,10 @@ void queryMissing(const PathSet & targets,
done.insert(p); done.insert(p);
if (isDerivation(p)) { if (isDerivation(p)) {
if (!store->isValidPath(p)) continue; if (!store->isValidPath(p)) {
unknown.insert(p);
continue;
}
Derivation drv = derivationFromPath(p); Derivation drv = derivationFromPath(p);
bool mustBuild = false; bool mustBuild = false;
@ -81,12 +84,11 @@ void queryMissing(const PathSet & targets,
else { else {
if (store->isValidPath(p)) continue; if (store->isValidPath(p)) continue;
SubstitutablePathInfo info; SubstitutablePathInfo info;
if (dynamic_cast<LocalStore *>(store.get())->querySubstitutablePathInfo(p, info)) { if (store->querySubstitutablePathInfo(p, info)) {
willSubstitute.insert(p); willSubstitute.insert(p);
todo.insert(info.references.begin(), info.references.end()); todo.insert(info.references.begin(), info.references.end());
} } else
/* Not substitutable and not buildable; should we flag unknown.insert(p);
this? */
} }
} }
} }

View file

@ -29,7 +29,7 @@ Path findOutput(const Derivation & drv, string id);
derivations that will be built, and the set of output paths that derivations that will be built, and the set of output paths that
will be substituted. */ will be substituted. */
void queryMissing(const PathSet & targets, void queryMissing(const PathSet & targets,
PathSet & willBuild, PathSet & willSubstitute); PathSet & willBuild, PathSet & willSubstitute, PathSet & unknown);
} }

View file

@ -216,7 +216,16 @@ bool RemoteStore::hasSubstitutes(const Path & path)
bool RemoteStore::querySubstitutablePathInfo(const Path & path, bool RemoteStore::querySubstitutablePathInfo(const Path & path,
SubstitutablePathInfo & info) 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;
} }

View file

@ -33,6 +33,7 @@ typedef enum {
wopQueryDeriver = 18, wopQueryDeriver = 18,
wopSetOptions = 19, wopSetOptions = 19,
wopCollectGarbage = 20, wopCollectGarbage = 20,
wopQuerySubstitutablePathInfo = 21,
} WorkerOp; } WorkerOp;

View file

@ -531,7 +531,7 @@ static void queryInstSources(EvalState & state,
static void printMissing(EvalState & state, const DrvInfos & elems) 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) { for (DrvInfos::const_iterator i = elems.begin(); i != elems.end(); ++i) {
Path drvPath = i->queryDrvPath(state); Path drvPath = i->queryDrvPath(state);
if (drvPath != "") if (drvPath != "")
@ -540,17 +540,24 @@ static void printMissing(EvalState & state, const DrvInfos & elems)
targets.insert(i->queryOutPath(state)); targets.insert(i->queryOutPath(state));
} }
queryMissing(targets, willBuild, willSubstitute); queryMissing(targets, willBuild, willSubstitute, unknown);
if (!willBuild.empty()) { if (!willBuild.empty()) {
printMsg(lvlInfo, format("the following derivations will be built:")); 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); printMsg(lvlInfo, format(" %1%") % *i);
} }
if (!willSubstitute.empty()) { if (!willSubstitute.empty()) {
printMsg(lvlInfo, format("the following paths will be substituted:")); printMsg(lvlInfo, format("the following paths will be downloaded/copied:"));
for (PathSet::iterator i = willSubstitute.begin(); i != willSubstitute.end(); ++i) 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); printMsg(lvlInfo, format(" %1%") % *i);
} }
} }

View file

@ -430,7 +430,21 @@ static void performOp(unsigned int clientVersion,
stopWork(); stopWork();
break; 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: default:
throw Error(format("invalid operation %1%") % op); throw Error(format("invalid operation %1%") % op);
@ -440,7 +454,7 @@ static void performOp(unsigned int clientVersion,
static void processConnection() static void processConnection()
{ {
RemoveTempRoots removeTempRoots; /* unused variable - don't remove */ RemoveTempRoots removeTempRoots __attribute__((unused));
canSendStderr = false; canSendStderr = false;
myPid = getpid(); myPid = getpid();