aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/build.cc')
-rw-r--r--src/libstore/build.cc47
1 files changed, 22 insertions, 25 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index 22f1c64ae..33a53c148 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -2187,14 +2187,34 @@ void SubstitutionGoal::init()
return;
}
- if (!worker.store.querySubstitutablePathInfo(storePath, info)) {
+ subs = substituters;
+
+ tryNext();
+}
+
+
+void SubstitutionGoal::tryNext()
+{
+ trace("trying next substituter");
+
+ if (subs.size() == 0) {
+ /* None left. Terminate this goal and let someone else deal
+ with it. */
printMsg(lvlError,
- format("path `%1%' is required, but there is no substituter that knows anything about it")
+ format("path `%1%' is required, but there is no substituter that can build it")
% storePath);
amDone(ecFailed);
return;
}
+ sub = subs.front();
+ subs.pop_front();
+
+ if (!worker.store.querySubstitutablePathInfo(sub, storePath, info)) {
+ tryNext();
+ return;
+ }
+
/* To maintain the closure invariant, we first have to realise the
paths referenced by this one. */
foreach (PathSet::iterator, i, info.references)
@@ -2223,29 +2243,6 @@ void SubstitutionGoal::referencesValid()
if (*i != storePath) /* ignore self-references */
assert(worker.store.isValidPath(*i));
- subs = substituters;
-
- tryNext();
-}
-
-
-void SubstitutionGoal::tryNext()
-{
- trace("trying next substituter");
-
- if (subs.size() == 0) {
- /* None left. Terminate this goal and let someone else deal
- with it. */
- printMsg(lvlError,
- format("path `%1%' is required, but there is no substituter that can build it")
- % storePath);
- amDone(ecFailed);
- return;
- }
-
- sub = subs.front();
- subs.pop_front();
-
state = &SubstitutionGoal::tryToRun;
worker.waitForBuildSlot(shared_from_this());
}