From de22f58dfcc3d5d6d490ef65b1686147e7e3fd9a Mon Sep 17 00:00:00 2001 From: John Ericson Date: Wed, 19 Feb 2025 21:15:06 -0500 Subject: [PATCH] Introduce `EvalStore::storePath` This abstracts over a common case. Good for brevity, and enabling further experiments. --- src/libcmd/common-eval-args.cc | 6 +++--- src/libexpr/eval.cc | 2 +- src/libexpr/eval.hh | 9 +++++++++ src/libexpr/paths.cc | 6 ++++++ src/libflake/flake/flake.cc | 4 ++-- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/libcmd/common-eval-args.cc b/src/libcmd/common-eval-args.cc index 87aeb4f2d..57e1774be 100644 --- a/src/libcmd/common-eval-args.cc +++ b/src/libcmd/common-eval-args.cc @@ -37,7 +37,7 @@ EvalSettings evalSettings { auto [accessor, lockedRef] = flakeRef.resolve(state.store).lazyFetch(state.store); auto storePath = nix::fetchToStore(*state.store, SourcePath(accessor), FetchMode::Copy, lockedRef.input.getName()); state.allowPath(storePath); - return state.rootPath(state.store->printStorePath(storePath)); + return state.storePath(storePath); }, }, }, @@ -179,7 +179,7 @@ SourcePath lookupFileArg(EvalState & state, std::string_view s, const Path * bas state.fetchSettings, EvalSettings::resolvePseudoUrl(s)); auto storePath = fetchToStore(*state.store, SourcePath(accessor), FetchMode::Copy); - return state.rootPath(CanonPath(state.store->printStorePath(storePath))); + return state.storePath(storePath); } else if (hasPrefix(s, "flake:")) { @@ -188,7 +188,7 @@ SourcePath lookupFileArg(EvalState & state, std::string_view s, const Path * bas auto [accessor, lockedRef] = flakeRef.resolve(state.store).lazyFetch(state.store); auto storePath = nix::fetchToStore(*state.store, SourcePath(accessor), FetchMode::Copy, lockedRef.input.getName()); state.allowPath(storePath); - return state.rootPath(CanonPath(state.store->printStorePath(storePath))); + return state.storePath(storePath); } else if (s.size() > 2 && s.at(0) == '<' && s.at(s.size() - 1) == '>') { diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index c0842dbbd..6a45f24b8 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -3103,7 +3103,7 @@ std::optional EvalState::resolveLookupPathPath(const LookupPath::Pat fetchSettings, EvalSettings::resolvePseudoUrl(value)); auto storePath = fetchToStore(*store, SourcePath(accessor), FetchMode::Copy); - return finish(rootPath(store->printStorePath(storePath))); + return finish(this->storePath(storePath)); } catch (Error & e) { logWarning({ .msg = HintFmt("Nix search path entry '%1%' cannot be downloaded, ignoring", value) diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index aca2e8bfd..b11e40c30 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -389,6 +389,15 @@ public: */ SourcePath rootPath(PathView path); + /** + * Return a `SourcePath` that refers to `path` in the store. + * + * For now, this has to also be within the root filesystem for + * backwards compat, but for Windows and maybe also pure eval, we'll + * probably want to do something different. + */ + SourcePath storePath(const StorePath & path); + /** * Allow access to a path. */ diff --git a/src/libexpr/paths.cc b/src/libexpr/paths.cc index 50d0d9895..3d602ae2d 100644 --- a/src/libexpr/paths.cc +++ b/src/libexpr/paths.cc @@ -1,3 +1,4 @@ +#include "store-api.hh" #include "eval.hh" namespace nix { @@ -12,4 +13,9 @@ SourcePath EvalState::rootPath(PathView path) return {rootFS, CanonPath(absPath(path))}; } +SourcePath EvalState::storePath(const StorePath & path) +{ + return {rootFS, CanonPath{store->printStorePath(path)}}; +} + } diff --git a/src/libflake/flake/flake.cc b/src/libflake/flake/flake.cc index 4a72f0399..e573c55c4 100644 --- a/src/libflake/flake/flake.cc +++ b/src/libflake/flake/flake.cc @@ -423,7 +423,7 @@ static Flake getFlake( auto storePath = copyInputToStore(state, lockedRef.input, originalRef.input, accessor); // Re-parse flake.nix from the store. - return readFlake(state, originalRef, resolvedRef, lockedRef, state.rootPath(state.store->printStorePath(storePath)), lockRootAttrPath); + return readFlake(state, originalRef, resolvedRef, lockedRef, state.storePath(storePath), lockRootAttrPath); } Flake getFlake(EvalState & state, const FlakeRef & originalRef, bool useRegistries) @@ -784,7 +784,7 @@ LockedFlake lockFlake( // FIXME: allow input to be lazy. auto storePath = copyInputToStore(state, lockedRef.input, input.ref->input, accessor); - return {state.rootPath(state.store->printStorePath(storePath)), lockedRef}; + return {state.storePath(storePath), lockedRef}; } }();