diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-01-06T21·07+0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-01-06T21·07+0100 |
commit | 02a66b3fd7041d32a61852b5be41802920c59d2f (patch) | |
tree | a084ed6d9c8ca54382aac97d2103eb28f50322d4 | |
parent | caaaff3954a164155f1ee2be8a29f50cd76d1717 (diff) |
nix-store --repair-path: Rebuild if there is no substituter
-rw-r--r-- | src/libstore/build.cc | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 931b0755bf31..54f905798ee2 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -3131,6 +3131,7 @@ void SubstitutionGoal::tryNext() /* None left. Terminate this goal and let someone else deal with it. */ debug(format("path ‘%1%’ is required, but there is no substituter that can build it") % storePath); + /* Hack: don't indicate failure if there were no substituters. In that case the calling derivation should just do a build. */ @@ -3826,8 +3827,17 @@ void LocalStore::repairPath(const Path & path) worker.run(goals); - if (goal->getExitCode() != Goal::ecSuccess) - throw Error(format("cannot repair path ‘%1%’") % path, worker.exitStatus()); + if (goal->getExitCode() != Goal::ecSuccess) { + /* Since substituting the path didn't work, if we have a valid + deriver, then rebuild the deriver. */ + Path deriver = queryDeriver(path); + if (deriver != "" && isValidPath(deriver)) { + goals.clear(); + goals.insert(worker.makeDerivationGoal(deriver, StringSet(), bmRepair)); + worker.run(goals); + } else + throw Error(format("cannot repair path ‘%1%’") % path, worker.exitStatus()); + } } |