forked from lix-project/lix
Fix fatal "broken pipe" error when $NIX_BUILD_HOOK is missing
This commit is contained in:
parent
ffcf9d24a6
commit
2f992692e2
|
@ -1580,37 +1580,49 @@ HookReply DerivationGoal::tryBuildHook()
|
||||||
if (!worker.hook)
|
if (!worker.hook)
|
||||||
worker.hook = std::make_unique<HookInstance>();
|
worker.hook = std::make_unique<HookInstance>();
|
||||||
|
|
||||||
/* Tell the hook about system features (beyond the system type)
|
try {
|
||||||
required from the build machine. (The hook could parse the
|
|
||||||
drv file itself, but this is easier.) */
|
|
||||||
Strings features = tokenizeString<Strings>(get(drv->env, "requiredSystemFeatures"));
|
|
||||||
for (auto & i : features) checkStoreName(i); /* !!! abuse */
|
|
||||||
|
|
||||||
/* Send the request to the hook. */
|
/* Tell the hook about system features (beyond the system type)
|
||||||
writeLine(worker.hook->toHook.writeSide.get(), (format("%1% %2% %3% %4%")
|
required from the build machine. (The hook could parse the
|
||||||
% (worker.getNrLocalBuilds() < settings.maxBuildJobs ? "1" : "0")
|
drv file itself, but this is easier.) */
|
||||||
% drv->platform % drvPath % concatStringsSep(",", features)).str());
|
Strings features = tokenizeString<Strings>(get(drv->env, "requiredSystemFeatures"));
|
||||||
|
for (auto & i : features) checkStoreName(i); /* !!! abuse */
|
||||||
|
|
||||||
/* Read the first line of input, which should be a word indicating
|
/* Send the request to the hook. */
|
||||||
whether the hook wishes to perform the build. */
|
writeLine(worker.hook->toHook.writeSide.get(), (format("%1% %2% %3% %4%")
|
||||||
string reply;
|
% (worker.getNrLocalBuilds() < settings.maxBuildJobs ? "1" : "0")
|
||||||
while (true) {
|
% drv->platform % drvPath % concatStringsSep(",", features)).str());
|
||||||
string s = readLine(worker.hook->fromHook.readSide.get());
|
|
||||||
if (string(s, 0, 2) == "# ") {
|
/* Read the first line of input, which should be a word indicating
|
||||||
reply = string(s, 2);
|
whether the hook wishes to perform the build. */
|
||||||
break;
|
string reply;
|
||||||
|
while (true) {
|
||||||
|
string s = readLine(worker.hook->fromHook.readSide.get());
|
||||||
|
if (string(s, 0, 2) == "# ") {
|
||||||
|
reply = string(s, 2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
s += "\n";
|
||||||
|
writeToStderr(s);
|
||||||
}
|
}
|
||||||
s += "\n";
|
|
||||||
writeToStderr(s);
|
debug(format("hook reply is ‘%1%’") % reply);
|
||||||
|
|
||||||
|
if (reply == "decline" || reply == "postpone")
|
||||||
|
return reply == "decline" ? rpDecline : rpPostpone;
|
||||||
|
else if (reply != "accept")
|
||||||
|
throw Error(format("bad hook reply ‘%1%’") % reply);
|
||||||
|
|
||||||
|
} catch (SysError & e) {
|
||||||
|
if (e.errNo == EPIPE) {
|
||||||
|
printError("build hook died unexpectedly: %s",
|
||||||
|
chomp(drainFD(worker.hook->fromHook.readSide.get())));
|
||||||
|
worker.hook = 0;
|
||||||
|
return rpDecline;
|
||||||
|
} else
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug(format("hook reply is ‘%1%’") % reply);
|
|
||||||
|
|
||||||
if (reply == "decline" || reply == "postpone")
|
|
||||||
return reply == "decline" ? rpDecline : rpPostpone;
|
|
||||||
else if (reply != "accept")
|
|
||||||
throw Error(format("bad hook reply ‘%1%’") % reply);
|
|
||||||
|
|
||||||
printMsg(lvlTalkative, format("using hook to build path(s) %1%") % showPaths(missingPaths));
|
printMsg(lvlTalkative, format("using hook to build path(s) %1%") % showPaths(missingPaths));
|
||||||
|
|
||||||
hook = std::move(worker.hook);
|
hook = std::move(worker.hook);
|
||||||
|
|
Loading…
Reference in a new issue