aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthew Kenigsberg <matthewkenigsberg@gmail.com>2020-05-12 23:45:45 -0600
committerMatthew Kenigsberg <matthewkenigsberg@gmail.com>2020-05-16 11:03:06 -0600
commit085879360415a2c667c6d75dce5765f01afbb25d (patch)
tree09fd01a06b29ce61d792473fe872cccfe29aad10 /src
parent04821bc1718aff975b51e98ce7bfb91888167c6d (diff)
Call lockFlake once and store in _lockedFlake
Diffstat (limited to 'src')
-rw-r--r--src/nix/installables.cc20
-rw-r--r--src/nix/installables.hh3
2 files changed, 16 insertions, 7 deletions
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index 4e38876ca..21fd54f64 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -408,8 +408,7 @@ ref<eval_cache::EvalCache> openEvalCache(
std::tuple<std::string, FlakeRef, InstallableValue::DerivationInfo> InstallableFlake::toDerivation()
{
- auto lockedFlake = std::make_shared<flake::LockedFlake>(
- lockFlake(*state, flakeRef, lockFlags));
+ auto lockedFlake = getLockedFlake();
auto cache = openEvalCache(*state, lockedFlake, true);
auto root = cache->getRoot();
@@ -455,9 +454,9 @@ std::vector<InstallableValue::DerivationInfo> InstallableFlake::toDerivations()
std::pair<Value *, Pos> InstallableFlake::toValue(EvalState & state)
{
- auto lockedFlake = lockFlake(state, flakeRef, lockFlags);
+ auto lockedFlake = getLockedFlake();
- auto vOutputs = getFlakeOutputs(state, lockedFlake);
+ auto vOutputs = getFlakeOutputs(state, *lockedFlake);
auto emptyArgs = state.allocBindings(0);
@@ -493,12 +492,19 @@ InstallableFlake::getCursor(EvalState & state, bool useEvalCache)
return res;
}
+std::shared_ptr<flake::LockedFlake> InstallableFlake::getLockedFlake() const
+{
+ if (!_lockedFlake)
+ _lockedFlake = std::make_shared<flake::LockedFlake>(lockFlake(*state, flakeRef, lockFlags));
+ return _lockedFlake;
+}
+
FlakeRef InstallableFlake::nixpkgsFlakeRef() const
{
- auto lockedFlake = lockFlake(*(cmd.getEvalState()), flakeRef, cmd.lockFlags);
+ auto lockedFlake = getLockedFlake();
- auto nixpkgsInput = lockedFlake.flake.inputs.find("nixpkgs");
- if (nixpkgsInput != lockedFlake.flake.inputs.end()) {
+ auto nixpkgsInput = lockedFlake->flake.inputs.find("nixpkgs");
+ if (nixpkgsInput != lockedFlake->flake.inputs.end()) {
return std::move(nixpkgsInput->second.ref);
}
diff --git a/src/nix/installables.hh b/src/nix/installables.hh
index 57e3d6c8e..a2db71389 100644
--- a/src/nix/installables.hh
+++ b/src/nix/installables.hh
@@ -88,6 +88,7 @@ struct InstallableFlake : InstallableValue
Strings attrPaths;
Strings prefixes;
const flake::LockFlags & lockFlags;
+ mutable std::shared_ptr<flake::LockedFlake> _lockedFlake;
InstallableFlake(ref<EvalState> state, FlakeRef && flakeRef,
Strings && attrPaths, Strings && prefixes, const flake::LockFlags & lockFlags)
@@ -110,6 +111,8 @@ struct InstallableFlake : InstallableValue
std::vector<std::pair<std::shared_ptr<eval_cache::AttrCursor>, std::string>>
getCursor(EvalState & state, bool useEvalCache) override;
+ std::shared_ptr<flake::LockedFlake> getLockedFlake() const;
+
FlakeRef nixpkgsFlakeRef() const override;
};