* 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
|
/* 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
|
||||||
|
|
|
@ -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? */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ typedef enum {
|
||||||
wopQueryDeriver = 18,
|
wopQueryDeriver = 18,
|
||||||
wopSetOptions = 19,
|
wopSetOptions = 19,
|
||||||
wopCollectGarbage = 20,
|
wopCollectGarbage = 20,
|
||||||
|
wopQuerySubstitutablePathInfo = 21,
|
||||||
} WorkerOp;
|
} WorkerOp;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue