aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2021-06-29 21:09:48 +0200
committerEelco Dolstra <edolstra@gmail.com>2021-07-22 09:59:51 +0200
commitbef40c29491ba9b31c85b9b89a5342979344f583 (patch)
tree480e991942629add4359cca0dc2ba923be2aecd1
parentdfda499326bc8f0128d4a69a00e94a155115d3b5 (diff)
Add --eval-store option
-rw-r--r--src/libcmd/command.cc32
-rw-r--r--src/libcmd/command.hh13
-rw-r--r--src/libcmd/installables.cc13
-rw-r--r--src/libexpr/eval.cc6
-rw-r--r--src/libexpr/eval.hh9
5 files changed, 56 insertions, 17 deletions
diff --git a/src/libcmd/command.cc b/src/libcmd/command.cc
index 6777b23be..93f20a8c3 100644
--- a/src/libcmd/command.cc
+++ b/src/libcmd/command.cc
@@ -54,6 +54,38 @@ void StoreCommand::run()
run(getStore());
}
+EvalCommand::EvalCommand()
+{
+ // FIXME: move to MixEvalArgs?
+ addFlag({
+ .longName = "eval-store",
+ .description = "The Nix store to use for evaluations.",
+ .labels = {"store-url"},
+ //.category = ...,
+ .handler = {&evalStoreUrl},
+ });
+}
+
+EvalCommand::~EvalCommand()
+{
+ if (evalState)
+ evalState->printStats();
+}
+
+ref<Store> EvalCommand::getEvalStore()
+{
+ if (!evalStore)
+ evalStore = evalStoreUrl ? openStore(*evalStoreUrl) : getStore();
+ return ref<Store>(evalStore);
+}
+
+ref<EvalState> EvalCommand::getEvalState()
+{
+ if (!evalState)
+ evalState = std::make_shared<EvalState>(searchPath, getEvalStore(), getStore());
+ return ref<EvalState>(evalState);
+}
+
BuiltPathsCommand::BuiltPathsCommand(bool recursive)
: recursive(recursive)
{
diff --git a/src/libcmd/command.hh b/src/libcmd/command.hh
index 35b3a384b..3aba8f25f 100644
--- a/src/libcmd/command.hh
+++ b/src/libcmd/command.hh
@@ -45,11 +45,20 @@ private:
struct EvalCommand : virtual StoreCommand, MixEvalArgs
{
+ EvalCommand();
+
+ ~EvalCommand();
+
+ ref<Store> getEvalStore();
+
ref<EvalState> getEvalState();
- std::shared_ptr<EvalState> evalState;
+private:
+ std::optional<std::string> evalStoreUrl;
- ~EvalCommand();
+ std::shared_ptr<Store> evalStore;
+
+ std::shared_ptr<EvalState> evalState;
};
struct MixFlakeOptions : virtual Args, EvalCommand
diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
index 95327f958..66ec63da2 100644
--- a/src/libcmd/installables.cc
+++ b/src/libcmd/installables.cc
@@ -289,19 +289,6 @@ void completeFlakeRefWithFragment(
completeFlakeRef(evalState->store, prefix);
}
-ref<EvalState> EvalCommand::getEvalState()
-{
- if (!evalState)
- evalState = std::make_shared<EvalState>(searchPath, getStore());
- return ref<EvalState>(evalState);
-}
-
-EvalCommand::~EvalCommand()
-{
- if (evalState)
- evalState->printStats();
-}
-
void completeFlakeRef(ref<Store> store, std::string_view prefix)
{
if (prefix == "")
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index c3206a577..b3e952aaa 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -378,7 +378,10 @@ static Strings parseNixPath(const string & s)
}
-EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
+EvalState::EvalState(
+ const Strings & _searchPath,
+ ref<Store> store,
+ std::shared_ptr<Store> buildStore)
: sWith(symbols.create("<with>"))
, sOutPath(symbols.create("outPath"))
, sDrvPath(symbols.create("drvPath"))
@@ -411,6 +414,7 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
, sEpsilon(symbols.create(""))
, repair(NoRepair)
, store(store)
+ , buildStore(buildStore ? buildStore : store)
, regexCache(makeRegexCache())
, baseEnv(allocEnv(128))
, staticBaseEnv(false, 0)
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index e3eaed6d3..a7aebb8ef 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -94,8 +94,12 @@ public:
Value vEmptySet;
+ /* Store used to materialise .drv files. */
const ref<Store> store;
+ /* Store used to build stuff. */
+ const ref<Store> buildStore;
+
private:
SrcToStore srcToStore;
@@ -128,7 +132,10 @@ private:
public:
- EvalState(const Strings & _searchPath, ref<Store> store);
+ EvalState(
+ const Strings & _searchPath,
+ ref<Store> store,
+ std::shared_ptr<Store> buildStore = nullptr);
~EvalState();
void addToSearchPath(const string & s);