* Don't cache transient build hook problems.

This commit is contained in:
Eelco Dolstra 2009-04-15 06:25:02 +00:00
parent 435a93b5d8
commit dfb863f333
1 changed files with 11 additions and 6 deletions

View File

@ -1160,12 +1160,15 @@ void DerivationGoal::buildDone()
printMsg(lvlError, e.msg());
outputLocks.unlock();
buildUser.release();
/* When using a build hook, the hook will return a remote
build failure using exit code 100. Anything else is a hook
problem. */
bool hookError = usingBuildHook &&
(!WIFEXITED(status) || WEXITSTATUS(status) != 100);
if (printBuildTrace) {
/* When using a build hook, the hook will return a
remote build failure using exit code 100. Anything
else is a hook problem. */
if (usingBuildHook && (!WIFEXITED(status) || WEXITSTATUS(status) != 100))
if (usingBuildHook && hookError)
printMsg(lvlError, format("@ hook-failed %1% %2% %3% %4%")
% drvPath % drv.outputs["out"].path % status % e.msg());
else
@ -1177,8 +1180,10 @@ void DerivationGoal::buildDone()
try to build them again (negative caching). However, don't
do this for fixed-output derivations, since they're likely
to fail for transient reasons (e.g., fetchurl not being
able to access the network). */
if (worker.cacheFailure && !fixedOutput)
able to access the network). Hook errors (like
communication problems with the remote machine) shouldn't
be cached either. */
if (worker.cacheFailure && !hookError && !fixedOutput)
foreach (DerivationOutputs::iterator, i, drv.outputs)
worker.store.registerFailedPath(i->second.path);