aboutsummaryrefslogtreecommitdiff
path: root/src/libstore
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-07-02 17:37:49 +0200
committerGitHub <noreply@github.com>2019-07-02 17:37:49 +0200
commit7e1c85c5fbf48811bb9a4969f9c32fce2a3e5fa7 (patch)
tree4b6d7b4f6ab4e6eaaa1201167ab37ae30ffa0959 /src/libstore
parentdb700f730ee4543d41974089b225b365ec427028 (diff)
parent68bdd83dc88ec55c6c51fa92e84e7d7d408c554a (diff)
Merge pull request #2779 from LnL7/build-exit-codes
build: add exit code for hash and check mismatches
Diffstat (limited to 'src/libstore')
-rw-r--r--src/libstore/build.cc38
-rw-r--r--src/libstore/download.cc3
2 files changed, 37 insertions, 4 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 5b38bcf3c..350ac4092 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -266,6 +266,12 @@ public:
/* Set if at least one derivation had a timeout. */
bool timedOut;
+ /* Set if at least one derivation fails with a hash mismatch. */
+ bool hashMismatch;
+
+ /* Set if at least one derivation is not deterministic in check mode. */
+ bool checkMismatch;
+
LocalStore & store;
std::unique_ptr<HookInstance> hook;
@@ -3213,6 +3219,7 @@ void DerivationGoal::registerOutputs()
/* Throw an error after registering the path as
valid. */
+ worker.hashMismatch = true;
delayedException = std::make_exception_ptr(
BuildError("hash mismatch in fixed-output derivation '%s':\n wanted: %s\n got: %s",
dest, h.to_string(), h2.to_string()));
@@ -3255,6 +3262,7 @@ void DerivationGoal::registerOutputs()
if (!worker.store.isValidPath(path)) continue;
auto info = *worker.store.queryPathInfo(path);
if (hash.first != info.narHash) {
+ worker.checkMismatch = true;
if (settings.runDiffHook || settings.keepFailed) {
Path dst = worker.store.toRealPath(path + checkSuffix);
deletePath(dst);
@@ -3266,10 +3274,10 @@ void DerivationGoal::registerOutputs()
buildUser ? buildUser->getGID() : getgid(),
path, dst, drvPath, tmpDir);
- throw Error(format("derivation '%1%' may not be deterministic: output '%2%' differs from '%3%'")
+ throw NotDeterministic(format("derivation '%1%' may not be deterministic: output '%2%' differs from '%3%'")
% drvPath % path % dst);
} else
- throw Error(format("derivation '%1%' may not be deterministic: output '%2%' differs")
+ throw NotDeterministic(format("derivation '%1%' may not be deterministic: output '%2%' differs")
% drvPath % path);
}
@@ -4101,6 +4109,8 @@ Worker::Worker(LocalStore & store)
lastWokenUp = steady_time_point::min();
permanentFailure = false;
timedOut = false;
+ hashMismatch = false;
+ checkMismatch = false;
}
@@ -4461,7 +4471,29 @@ void Worker::waitForInput()
unsigned int Worker::exitStatus()
{
- return timedOut ? 101 : (permanentFailure ? 100 : 1);
+ /*
+ * 1100100
+ * ^^^^
+ * |||`- timeout
+ * ||`-- output hash mismatch
+ * |`--- build failure
+ * `---- not deterministic
+ */
+ unsigned int mask = 0;
+ bool buildFailure = permanentFailure || timedOut || hashMismatch;
+ if (buildFailure)
+ mask |= 0x04; // 100
+ if (timedOut)
+ mask |= 0x01; // 101
+ if (hashMismatch)
+ mask |= 0x02; // 102
+ if (checkMismatch) {
+ mask |= 0x08; // 104
+ }
+
+ if (mask)
+ mask |= 0x60;
+ return mask ? mask : 1;
}
diff --git a/src/libstore/download.cc b/src/libstore/download.cc
index 0c5a73ea3..7a2af237e 100644
--- a/src/libstore/download.cc
+++ b/src/libstore/download.cc
@@ -855,10 +855,11 @@ CachedDownloadResult Downloader::downloadCached(
}
if (expectedStorePath != "" && storePath != expectedStorePath) {
+ unsigned int statusCode = 102;
Hash gotHash = request.unpack
? hashPath(request.expectedHash.type, store->toRealPath(storePath)).first
: hashFile(request.expectedHash.type, store->toRealPath(storePath));
- throw nix::Error("hash mismatch in file downloaded from '%s':\n wanted: %s\n got: %s",
+ throw nix::Error(statusCode, "hash mismatch in file downloaded from '%s':\n wanted: %s\n got: %s",
url, request.expectedHash.to_string(), gotHash.to_string());
}