resolveFlake -> lockFlake

"resolve" is ambiguous (also used for registry resolution).
This commit is contained in:
Eelco Dolstra 2020-01-22 20:59:59 +01:00
parent b5c9dbc84f
commit 872a22fa23
5 changed files with 36 additions and 40 deletions

View file

@ -302,7 +302,10 @@ static std::pair<Flake, LockedInput> updateLocks(
/* Compute an in-memory lockfile for the specified top-level flake, /* Compute an in-memory lockfile for the specified top-level flake,
and optionally write it to file, it the flake is writable. */ and optionally write it to file, it the flake is writable. */
ResolvedFlake resolveFlake(EvalState & state, const FlakeRef & topRef, HandleLockFile handleLockFile) LockedFlake lockFlake(
EvalState & state,
const FlakeRef & topRef,
HandleLockFile handleLockFile)
{ {
settings.requireExperimentalFeature("flakes"); settings.requireExperimentalFeature("flakes");
@ -356,12 +359,7 @@ ResolvedFlake resolveFlake(EvalState & state, const FlakeRef & topRef, HandleLoc
warn("using updated lock file without writing it to file"); warn("using updated lock file without writing it to file");
} }
return ResolvedFlake { .flake = std::move(flake), .lockFile = std::move(lockFile) }; return LockedFlake { .flake = std::move(flake), .lockFile = std::move(lockFile) };
}
void updateLockFile(EvalState & state, const FlakeRef & flakeRef, bool recreateLockFile)
{
resolveFlake(state, flakeRef, recreateLockFile ? RecreateLockFile : UpdateLockFile);
} }
static void emitSourceInfoAttrs(EvalState & state, const fetchers::Tree & sourceInfo, Value & vAttrs) static void emitSourceInfoAttrs(EvalState & state, const fetchers::Tree & sourceInfo, Value & vAttrs)
@ -480,16 +478,16 @@ void callFlake(EvalState & state,
} }
void callFlake(EvalState & state, void callFlake(EvalState & state,
const ResolvedFlake & resFlake, const LockedFlake & lockedFlake,
Value & v) Value & v)
{ {
callFlake(state, resFlake.flake, resFlake.lockFile, v); callFlake(state, lockedFlake.flake, lockedFlake.lockFile, v);
} }
// This function is exposed to be used in nix files. // This function is exposed to be used in nix files.
static void prim_getFlake(EvalState & state, const Pos & pos, Value * * args, Value & v) static void prim_getFlake(EvalState & state, const Pos & pos, Value * * args, Value & v)
{ {
callFlake(state, resolveFlake(state, parseFlakeRef(state.forceStringNoCtx(*args[0], pos)), callFlake(state, lockFlake(state, parseFlakeRef(state.forceStringNoCtx(*args[0], pos)),
evalSettings.pureEval ? AllPure : UseUpdatedLockFile), v); evalSettings.pureEval ? AllPure : UseUpdatedLockFile), v);
} }
@ -497,7 +495,7 @@ static RegisterPrimOp r2("getFlake", 1, prim_getFlake);
} }
Fingerprint ResolvedFlake::getFingerprint() const Fingerprint LockedFlake::getFingerprint() const
{ {
// FIXME: as an optimization, if the flake contains a lock file // FIXME: as an optimization, if the flake contains a lock file
// and we haven't changed it, then it's sufficient to use // and we haven't changed it, then it's sufficient to use

View file

@ -46,7 +46,7 @@ Flake getFlake(EvalState & state, const FlakeRef & flakeRef, bool allowLookup);
/* Fingerprint of a locked flake; used as a cache key. */ /* Fingerprint of a locked flake; used as a cache key. */
typedef Hash Fingerprint; typedef Hash Fingerprint;
struct ResolvedFlake struct LockedFlake
{ {
Flake flake; Flake flake;
LockFile lockFile; LockFile lockFile;
@ -54,7 +54,7 @@ struct ResolvedFlake
Fingerprint getFingerprint() const; Fingerprint getFingerprint() const;
}; };
ResolvedFlake resolveFlake(EvalState &, const FlakeRef &, HandleLockFile); LockedFlake lockFlake(EvalState &, const FlakeRef &, HandleLockFile);
void callFlake(EvalState & state, void callFlake(EvalState & state,
const Flake & flake, const Flake & flake,
@ -62,11 +62,9 @@ void callFlake(EvalState & state,
Value & v); Value & v);
void callFlake(EvalState & state, void callFlake(EvalState & state,
const ResolvedFlake & resFlake, const LockedFlake & resFlake,
Value & v); Value & v);
void updateLockFile(EvalState &, const FlakeRef & flakeRef, bool recreateLockFile);
} }
} }

View file

@ -41,9 +41,9 @@ public:
return flake::getFlake(*evalState, getFlakeRef(), useRegistries); return flake::getFlake(*evalState, getFlakeRef(), useRegistries);
} }
ResolvedFlake resolveFlake() LockedFlake lockFlake()
{ {
return flake::resolveFlake(*getEvalState(), getFlakeRef(), getLockFileMode()); return flake::lockFlake(*getEvalState(), getFlakeRef(), getLockFileMode());
} }
}; };
@ -122,16 +122,16 @@ struct CmdFlakeDeps : FlakeCommand
{ {
auto evalState = getEvalState(); auto evalState = getEvalState();
std::queue<ResolvedFlake> todo; std::queue<LockedFlake> todo;
todo.push(resolveFlake()); todo.push(lockFlake());
stopProgressBar(); stopProgressBar();
while (!todo.empty()) { while (!todo.empty()) {
auto resFlake = std::move(todo.front()); auto lockedFlake = std::move(todo.front());
todo.pop(); todo.pop();
for (auto & info : resFlake.flakeDeps) { for (auto & info : lockedFlake.flakeDeps) {
printFlakeInfo(*store, info.second.flake); printFlakeInfo(*store, info.second.flake);
todo.push(info.second); todo.push(info.second);
} }
@ -150,7 +150,7 @@ struct CmdFlakeUpdate : FlakeCommand
void run(nix::ref<nix::Store> store) override void run(nix::ref<nix::Store> store) override
{ {
auto evalState = getEvalState(); auto evalState = getEvalState();
resolveFlake(); lockFlake();
} }
}; };
@ -179,7 +179,7 @@ struct CmdFlakeInfo : FlakeCommand, MixJSON
{ {
if (json) { if (json) {
auto state = getEvalState(); auto state = getEvalState();
auto flake = resolveFlake(); auto flake = lockFlake();
auto json = flakeToJson(*store, flake.flake); auto json = flakeToJson(*store, flake.flake);
@ -235,7 +235,7 @@ struct CmdFlakeCheck : FlakeCommand, MixJSON
settings.readOnlyMode = !build; settings.readOnlyMode = !build;
auto state = getEvalState(); auto state = getEvalState();
auto flake = resolveFlake(); auto flake = lockFlake();
auto checkSystemName = [&](const std::string & system, const Pos & pos) { auto checkSystemName = [&](const std::string & system, const Pos & pos) {
// FIXME: what's the format of "system"? // FIXME: what's the format of "system"?

View file

@ -240,7 +240,7 @@ struct InstallableAttrPath : InstallableValue
void makeFlakeClosureGCRoot(Store & store, void makeFlakeClosureGCRoot(Store & store,
const FlakeRef & origFlakeRef, const FlakeRef & origFlakeRef,
const flake::ResolvedFlake & resFlake) const flake::LockedFlake & lockedFlake)
{ {
#if 0 #if 0
if (std::get_if<FlakeRef::IsPath>(&origFlakeRef.data)) return; if (std::get_if<FlakeRef::IsPath>(&origFlakeRef.data)) return;
@ -248,11 +248,11 @@ void makeFlakeClosureGCRoot(Store & store,
/* Get the store paths of all non-local flakes. */ /* Get the store paths of all non-local flakes. */
StorePathSet closure; StorePathSet closure;
assert(store.isValidPath(store.parseStorePath(resFlake.flake.sourceInfo.storePath))); assert(store.isValidPath(store.parseStorePath(lockedFlake.flake.sourceInfo.storePath)));
closure.insert(store.parseStorePath(resFlake.flake.sourceInfo.storePath)); closure.insert(store.parseStorePath(lockedFlake.flake.sourceInfo.storePath));
std::queue<std::reference_wrapper<const flake::LockedInputs>> queue; std::queue<std::reference_wrapper<const flake::LockedInputs>> queue;
queue.push(resFlake.lockFile); queue.push(lockedFlake.lockFile);
while (!queue.empty()) { while (!queue.empty()) {
const flake::LockedInputs & flake = queue.front(); const flake::LockedInputs & flake = queue.front();
@ -301,13 +301,13 @@ std::vector<std::string> InstallableFlake::getActualAttrPaths()
return res; return res;
} }
Value * InstallableFlake::getFlakeOutputs(EvalState & state, const flake::ResolvedFlake & resFlake) Value * InstallableFlake::getFlakeOutputs(EvalState & state, const flake::LockedFlake & lockedFlake)
{ {
auto vFlake = state.allocValue(); auto vFlake = state.allocValue();
callFlake(state, resFlake, *vFlake); callFlake(state, lockedFlake, *vFlake);
makeFlakeClosureGCRoot(*state.store, flakeRef, resFlake); makeFlakeClosureGCRoot(*state.store, flakeRef, lockedFlake);
auto aOutputs = vFlake->attrs->get(state.symbols.create("outputs")); auto aOutputs = vFlake->attrs->get(state.symbols.create("outputs"));
assert(aOutputs); assert(aOutputs);
@ -321,7 +321,7 @@ std::tuple<std::string, FlakeRef, flake::EvalCache::Derivation> InstallableFlake
{ {
auto state = cmd.getEvalState(); auto state = cmd.getEvalState();
auto resFlake = resolveFlake(*state, flakeRef, cmd.getLockFileMode()); auto lockedFlake = lockFlake(*state, flakeRef, cmd.getLockFileMode());
Value * vOutputs = nullptr; Value * vOutputs = nullptr;
@ -329,17 +329,17 @@ std::tuple<std::string, FlakeRef, flake::EvalCache::Derivation> InstallableFlake
auto & evalCache = flake::EvalCache::singleton(); auto & evalCache = flake::EvalCache::singleton();
auto fingerprint = resFlake.getFingerprint(); auto fingerprint = lockedFlake.getFingerprint();
for (auto & attrPath : getActualAttrPaths()) { for (auto & attrPath : getActualAttrPaths()) {
auto drv = evalCache.getDerivation(fingerprint, attrPath); auto drv = evalCache.getDerivation(fingerprint, attrPath);
if (drv) { if (drv) {
if (state->store->isValidPath(drv->drvPath)) if (state->store->isValidPath(drv->drvPath))
return {attrPath, resFlake.flake.resolvedRef, std::move(*drv)}; return {attrPath, lockedFlake.flake.resolvedRef, std::move(*drv)};
} }
if (!vOutputs) if (!vOutputs)
vOutputs = getFlakeOutputs(*state, resFlake); vOutputs = getFlakeOutputs(*state, lockedFlake);
try { try {
auto * v = findAlongAttrPath(*state, attrPath, *emptyArgs, *vOutputs); auto * v = findAlongAttrPath(*state, attrPath, *emptyArgs, *vOutputs);
@ -357,7 +357,7 @@ std::tuple<std::string, FlakeRef, flake::EvalCache::Derivation> InstallableFlake
evalCache.addDerivation(fingerprint, attrPath, drv); evalCache.addDerivation(fingerprint, attrPath, drv);
return {attrPath, resFlake.flake.resolvedRef, std::move(drv)}; return {attrPath, lockedFlake.flake.resolvedRef, std::move(drv)};
} catch (AttrPathNotFound & e) { } catch (AttrPathNotFound & e) {
} }
} }
@ -375,9 +375,9 @@ std::vector<flake::EvalCache::Derivation> InstallableFlake::toDerivations()
Value * InstallableFlake::toValue(EvalState & state) Value * InstallableFlake::toValue(EvalState & state)
{ {
auto resFlake = resolveFlake(state, flakeRef, cmd.getLockFileMode()); auto lockedFlake = lockFlake(state, flakeRef, cmd.getLockFileMode());
auto vOutputs = getFlakeOutputs(state, resFlake); auto vOutputs = getFlakeOutputs(state, lockedFlake);
auto emptyArgs = state.allocBindings(0); auto emptyArgs = state.allocBindings(0);

View file

@ -85,7 +85,7 @@ struct InstallableFlake : InstallableValue
std::vector<std::string> getActualAttrPaths(); std::vector<std::string> getActualAttrPaths();
Value * getFlakeOutputs(EvalState & state, const flake::ResolvedFlake & resFlake); Value * getFlakeOutputs(EvalState & state, const flake::LockedFlake & lockedFlake);
std::tuple<std::string, FlakeRef, flake::EvalCache::Derivation> toDerivation(); std::tuple<std::string, FlakeRef, flake::EvalCache::Derivation> toDerivation();