diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nix/installables.cc | 26 | ||||
-rw-r--r-- | src/nix/installables.hh | 20 | ||||
-rw-r--r-- | src/nix/profile.cc | 2 |
3 files changed, 22 insertions, 26 deletions
diff --git a/src/nix/installables.cc b/src/nix/installables.cc index 16e03875c..5267a37a0 100644 --- a/src/nix/installables.cc +++ b/src/nix/installables.cc @@ -179,10 +179,8 @@ struct InstallableStorePath : Installable } }; -std::vector<InstallableValue::DerivationInfo> InstallableValue::toDerivations() +std::vector<InstallableValue::DerivationInfo> InstallableAttrPath::toDerivations() { - auto state = cmd.getEvalState(); - auto v = toValue(*state).first; Bindings & autoArgs = *cmd.getAutoArgs(*state); @@ -204,8 +202,6 @@ std::vector<InstallableValue::DerivationInfo> InstallableValue::toDerivations() Buildables InstallableValue::toBuildables() { - auto state = cmd.getEvalState(); - Buildables res; StorePathSet drvPaths; @@ -239,11 +235,12 @@ Buildables InstallableValue::toBuildables() struct InstallableAttrPath : InstallableValue { + SourceExprCommand & cmd; RootValue v; std::string attrPath; - InstallableAttrPath(SourceExprCommand & cmd, Value * v, const std::string & attrPath) - : InstallableValue(cmd), v(allocRootValue(v)), attrPath(attrPath) + InstallableAttrPath(ref<EvalState> state, SourceExprCommand & cmd, Value * v, const std::string & attrPath) + : InstallableValue(state), cmd(cmd), v(allocRootValue(v)), attrPath(attrPath) { } std::string what() override { return attrPath; } @@ -254,6 +251,8 @@ struct InstallableAttrPath : InstallableValue state.forceValue(*vRes); return {vRes, pos}; } + + virtual std::vector<InstallableValue::DerivationInfo> toDerivations() override; }; std::vector<std::string> InstallableFlake::getActualAttrPaths() @@ -313,10 +312,9 @@ ref<eval_cache::EvalCache> openEvalCache( std::tuple<std::string, FlakeRef, InstallableValue::DerivationInfo> InstallableFlake::toDerivation() { - auto state = cmd.getEvalState(); auto lockedFlake = std::make_shared<flake::LockedFlake>( - lockFlake(*state, flakeRef, cmd.lockFlags)); + lockFlake(*state, flakeRef, lockFlags)); auto cache = openEvalCache(*state, lockedFlake, true); auto root = cache->getRoot(); @@ -362,7 +360,7 @@ std::vector<InstallableValue::DerivationInfo> InstallableFlake::toDerivations() std::pair<Value *, Pos> InstallableFlake::toValue(EvalState & state) { - auto lockedFlake = lockFlake(state, flakeRef, cmd.lockFlags); + auto lockedFlake = lockFlake(state, flakeRef, lockFlags); auto vOutputs = getFlakeOutputs(state, lockedFlake); @@ -385,7 +383,7 @@ std::vector<std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>> InstallableFlake::getCursor(EvalState & state, bool useEvalCache) { auto evalCache = openEvalCache(state, - std::make_shared<flake::LockedFlake>(lockFlake(state, flakeRef, cmd.lockFlags)), + std::make_shared<flake::LockedFlake>(lockFlake(state, flakeRef, lockFlags)), useEvalCache); auto root = evalCache->getRoot(); @@ -423,7 +421,7 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables( } for (auto & s : ss) - result.push_back(std::make_shared<InstallableAttrPath>(*this, vFile, s == "." ? "" : s)); + result.push_back(std::make_shared<InstallableAttrPath>(state, *this, vFile, s == "." ? "" : s)); } else { @@ -433,9 +431,9 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables( try { auto [flakeRef, fragment] = parseFlakeRefWithFragment(s, absPath(".")); result.push_back(std::make_shared<InstallableFlake>( - *this, std::move(flakeRef), + getEvalState(), std::move(flakeRef), fragment == "" ? getDefaultFlakeAttrPaths() : Strings{fragment}, - getDefaultFlakeAttrPathPrefixes())); + getDefaultFlakeAttrPathPrefixes(), lockFlags)); continue; } catch (...) { ex = std::current_exception(); diff --git a/src/nix/installables.hh b/src/nix/installables.hh index c9e277a51..531720de6 100644 --- a/src/nix/installables.hh +++ b/src/nix/installables.hh @@ -37,10 +37,7 @@ struct Installable virtual std::string what() = 0; - virtual Buildables toBuildables() - { - throw Error("argument '%s' cannot be built", what()); - } + virtual Buildables toBuildables() = 0; Buildable toBuildable(); @@ -64,9 +61,9 @@ struct Installable struct InstallableValue : Installable { - SourceExprCommand & cmd; + ref<EvalState> state; - InstallableValue(SourceExprCommand & cmd) : cmd(cmd) { } + InstallableValue(ref<EvalState> state) : state(state) {} struct DerivationInfo { @@ -75,7 +72,7 @@ struct InstallableValue : Installable std::string outputName; }; - virtual std::vector<DerivationInfo> toDerivations(); + virtual std::vector<DerivationInfo> toDerivations() = 0; Buildables toBuildables() override; }; @@ -85,11 +82,12 @@ struct InstallableFlake : InstallableValue FlakeRef flakeRef; Strings attrPaths; Strings prefixes; + const flake::LockFlags & lockFlags; - InstallableFlake(SourceExprCommand & cmd, FlakeRef && flakeRef, - Strings && attrPaths, Strings && prefixes) - : InstallableValue(cmd), flakeRef(flakeRef), attrPaths(attrPaths), - prefixes(prefixes) + InstallableFlake(ref<EvalState> state, FlakeRef && flakeRef, + Strings && attrPaths, Strings && prefixes, const flake::LockFlags & lockFlags) + : InstallableValue(state), flakeRef(flakeRef), attrPaths(attrPaths), + prefixes(prefixes), lockFlags(lockFlags) { } std::string what() override { return flakeRef.to_string() + "#" + *attrPaths.begin(); } diff --git a/src/nix/profile.cc b/src/nix/profile.cc index 5aaf5234c..cc239052d 100644 --- a/src/nix/profile.cc +++ b/src/nix/profile.cc @@ -336,7 +336,7 @@ struct CmdProfileUpgrade : virtual SourceExprCommand, MixDefaultProfile, MixProf Activity act(*logger, lvlChatty, actUnknown, fmt("checking '%s' for updates", element.source->attrPath)); - InstallableFlake installable(*this, FlakeRef(element.source->originalRef), {element.source->attrPath}, {}); + InstallableFlake installable(getEvalState(), FlakeRef(element.source->originalRef), {element.source->attrPath}, {}, lockFlags); auto [attrPath, resolvedRef, drv] = installable.toDerivation(); |