diff --git a/src/libcmd/common-eval-args.cc b/src/libcmd/common-eval-args.cc index de967e3fe..adf816494 100644 --- a/src/libcmd/common-eval-args.cc +++ b/src/libcmd/common-eval-args.cc @@ -34,7 +34,9 @@ EvalSettings evalSettings { // FIXME `parseFlakeRef` should take a `std::string_view`. auto flakeRef = parseFlakeRef(fetchSettings, std::string { rest }, {}, true, false); debug("fetching flake search path element '%s''", rest); - auto storePath = flakeRef.resolve(state.store).fetchTree(state.store).first; + 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->toRealPath(storePath)); }, }, @@ -183,7 +185,9 @@ SourcePath lookupFileArg(EvalState & state, std::string_view s, const Path * bas else if (hasPrefix(s, "flake:")) { experimentalFeatureSettings.require(Xp::Flakes); auto flakeRef = parseFlakeRef(fetchSettings, std::string(s.substr(6)), {}, true, false); - auto storePath = flakeRef.resolve(state.store).fetchTree(state.store).first; + 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->toRealPath(storePath))); } diff --git a/src/libflake/flake/flakeref.cc b/src/libflake/flake/flakeref.cc index cc9403ceb..4fc720eb5 100644 --- a/src/libflake/flake/flakeref.cc +++ b/src/libflake/flake/flakeref.cc @@ -283,12 +283,6 @@ FlakeRef FlakeRef::fromAttrs( fetchers::maybeGetStrAttr(attrs, "dir").value_or("")); } -std::pair FlakeRef::fetchTree(ref store) const -{ - auto [storePath, lockedInput] = input.fetchToStore(store); - return {std::move(storePath), FlakeRef(std::move(lockedInput), subdir)}; -} - std::pair, FlakeRef> FlakeRef::lazyFetch(ref store) const { auto [accessor, lockedInput] = input.getAccessor(store); diff --git a/src/libflake/flake/flakeref.hh b/src/libflake/flake/flakeref.hh index f47730da5..d3c15018e 100644 --- a/src/libflake/flake/flakeref.hh +++ b/src/libflake/flake/flakeref.hh @@ -71,9 +71,6 @@ struct FlakeRef const fetchers::Settings & fetchSettings, const fetchers::Attrs & attrs); - // FIXME: remove - std::pair fetchTree(ref store) const; - std::pair, FlakeRef> lazyFetch(ref store) const; }; diff --git a/src/nix/flake.cc b/src/nix/flake.cc index adf391b97..6f220b495 100644 --- a/src/nix/flake.cc +++ b/src/nix/flake.cc @@ -17,6 +17,7 @@ #include "eval-cache.hh" #include "markdown.hh" #include "users.hh" +#include "fetch-to-store.hh" #include #include @@ -1449,7 +1450,8 @@ struct CmdFlakePrefetch : FlakeCommand, MixJSON { auto originalRef = getFlakeRef(); auto resolvedRef = originalRef.resolve(store); - auto [storePath, lockedRef] = resolvedRef.fetchTree(store); + auto [accessor, lockedRef] = resolvedRef.lazyFetch(store); + auto storePath = fetchToStore(*store, accessor, FetchMode::Copy, lockedRef.input.getName()); auto hash = store->queryPathInfo(storePath)->narHash; if (json) {