From dfb863f3339ee7e43c83803ade2d9fdf418399b7 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 15 Apr 2009 06:25:02 +0000 Subject: [PATCH] * Don't cache transient build hook problems. --- src/libstore/build.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 747a7decf2..b475341bd4 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -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);