forked from lix-project/lix
* Fallback didn't work for subderivations of an unnormalised the main
derivation, since NormalisationGoal would first run a NormalisationGoal on the subderivation (a no-op, since in a situation where we need fallback the successor is known), and then runs a RealisationGoal on the normal form, which then cannot do a fallback because it doesn't know the derivation expression for which it is a normal form. Tossed out the 2-phase normalisation/realisation in NormalisationGoal and SubstitutionGoal since it's no longer needed - a RealisationGoal will run a NormalisationGoal if necessary.
This commit is contained in:
parent
dcc433de47
commit
b357284a32
|
@ -357,7 +357,6 @@ private:
|
||||||
/* The states. */
|
/* The states. */
|
||||||
void init();
|
void init();
|
||||||
void haveStoreExpr();
|
void haveStoreExpr();
|
||||||
void inputNormalised();
|
|
||||||
void inputRealised();
|
void inputRealised();
|
||||||
void tryToBuild();
|
void tryToBuild();
|
||||||
void buildDone();
|
void buildDone();
|
||||||
|
@ -474,33 +473,11 @@ void NormalisationGoal::haveStoreExpr()
|
||||||
}
|
}
|
||||||
assert(expr.type == StoreExpr::neDerivation);
|
assert(expr.type == StoreExpr::neDerivation);
|
||||||
|
|
||||||
/* Inputs must be normalised before we can build this goal. */
|
/* Inputs must be realised before we can build this goal. */
|
||||||
for (PathSet::iterator i = expr.derivation.inputs.begin();
|
for (PathSet::iterator i = expr.derivation.inputs.begin();
|
||||||
i != expr.derivation.inputs.end(); ++i)
|
i != expr.derivation.inputs.end(); ++i)
|
||||||
addWaitee(worker.makeNormalisationGoal(*i));
|
addWaitee(worker.makeRealisationGoal(*i));
|
||||||
|
|
||||||
state = &NormalisationGoal::inputNormalised;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void NormalisationGoal::inputNormalised()
|
|
||||||
{
|
|
||||||
trace("all inputs normalised");
|
|
||||||
|
|
||||||
if (nrFailed != 0) {
|
|
||||||
printMsg(lvlError,
|
|
||||||
format("cannot normalise derivation `%1%': "
|
|
||||||
"%2% closure element(s) could not be normalised")
|
|
||||||
% nePath % nrFailed);
|
|
||||||
amDone(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Inputs must also be realised before we can build this goal. */
|
|
||||||
for (PathSet::iterator i = expr.derivation.inputs.begin();
|
|
||||||
i != expr.derivation.inputs.end(); ++i)
|
|
||||||
addWaitee(worker.makeRealisationGoal(queryNormalForm(*i)));
|
|
||||||
|
|
||||||
state = &NormalisationGoal::inputRealised;
|
state = &NormalisationGoal::inputRealised;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1474,26 +1451,9 @@ void SubstitutionGoal::tryNext()
|
||||||
sub = subs.front();
|
sub = subs.front();
|
||||||
subs.pop_front();
|
subs.pop_front();
|
||||||
|
|
||||||
/* Normalise the substitute store expression. */
|
|
||||||
nrFailed = 0;
|
|
||||||
addWaitee(worker.makeNormalisationGoal(sub.storeExpr));
|
|
||||||
|
|
||||||
state = &SubstitutionGoal::exprNormalised;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SubstitutionGoal::exprNormalised()
|
|
||||||
{
|
|
||||||
trace("substitute store expression normalised");
|
|
||||||
|
|
||||||
if (nrFailed != 0) {
|
|
||||||
tryNext();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Realise the substitute store expression. */
|
/* Realise the substitute store expression. */
|
||||||
nfSub = queryNormalForm(sub.storeExpr);
|
nrFailed = 0;
|
||||||
addWaitee(worker.makeRealisationGoal(nfSub));
|
addWaitee(worker.makeRealisationGoal(sub.storeExpr));
|
||||||
|
|
||||||
state = &SubstitutionGoal::exprRealised;
|
state = &SubstitutionGoal::exprRealised;
|
||||||
}
|
}
|
||||||
|
@ -1508,6 +1468,9 @@ void SubstitutionGoal::exprRealised()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* !!! the storeExpr doesn't have to be a derivation, right? */
|
||||||
|
nfSub = queryNormalForm(sub.storeExpr);
|
||||||
|
|
||||||
state = &SubstitutionGoal::tryToRun;
|
state = &SubstitutionGoal::tryToRun;
|
||||||
worker.waitForBuildSlot(shared_from_this());
|
worker.waitForBuildSlot(shared_from_this());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue