aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/primops/flake.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr/primops/flake.cc')
-rw-r--r--src/libexpr/primops/flake.cc60
1 files changed, 29 insertions, 31 deletions
diff --git a/src/libexpr/primops/flake.cc b/src/libexpr/primops/flake.cc
index 1b0b1eba7..bd8e5960c 100644
--- a/src/libexpr/primops/flake.cc
+++ b/src/libexpr/primops/flake.cc
@@ -304,6 +304,7 @@ Flake getFlake(EvalState & state, const FlakeRef & flakeRef, bool impureIsAllowe
state.forceAttrs(vInfo);
+ // FIXME: change to "id"?
if (auto name = vInfo.attrs->get(state.sName))
flake.id = state.forceStringNoCtx(*(**name).value, *(**name).pos);
else
@@ -423,48 +424,45 @@ void updateLockFile(EvalState & state, Path path)
}
}
-// Return the `provides` of the top flake, while assigning to `v` the provides
-// of the dependencies as well.
-Value * makeFlakeValue(EvalState & state, const FlakeRef & flakeRef, bool impureTopRef, Value & v)
+void callFlake(EvalState & state, const Dependencies & flake, Value & v)
{
- Dependencies deps = resolveFlake(state, flakeRef, impureTopRef);
-
- // FIXME: we should call each flake with only its dependencies
- // (rather than the closure of the top-level flake).
-
- auto vResult = state.allocValue();
- // This will store the attribute set of the `nonFlakeRequires` and the `requires.provides`.
+ // Construct the resulting attrset '{description, provides,
+ // ...}'. This attrset is passed lazily as an argument to 'provides'.
- state.mkAttrs(*vResult, deps.flakeDeps.size());
+ state.mkAttrs(v, flake.flakeDeps.size() + flake.nonFlakeDeps.size() + 4);
- Value * vTop = state.allocAttr(*vResult, deps.flake.id);
-
- for (auto & dep : deps.flakeDeps) {
- Flake flake = dep.flake;
- auto vFlake = state.allocAttr(*vResult, flake.id);
-
- state.mkAttrs(*vFlake, 4);
+ for (auto & dep : flake.flakeDeps) {
+ auto vFlake = state.allocAttr(v, dep.flake.id);
+ callFlake(state, dep, *vFlake);
+ }
- mkString(*state.allocAttr(*vFlake, state.sDescription), flake.description);
+ for (auto & dep : flake.nonFlakeDeps) {
+ auto vNonFlake = state.allocAttr(v, dep.alias);
+ state.mkAttrs(*vNonFlake, 4);
- state.store->assertStorePath(flake.path);
- mkString(*state.allocAttr(*vFlake, state.sOutPath), flake.path, {flake.path});
+ state.store->isValidPath(dep.path);
+ mkString(*state.allocAttr(*vNonFlake, state.sOutPath), dep.path, {dep.path});
+ }
- if (flake.revCount)
- mkInt(*state.allocAttr(*vFlake, state.symbols.create("revCount")), *flake.revCount);
+ mkString(*state.allocAttr(v, state.sDescription), flake.flake.description);
- auto vProvides = state.allocAttr(*vFlake, state.symbols.create("provides"));
- mkApp(*vProvides, *flake.vProvides, *vResult);
+ state.store->isValidPath(flake.flake.path);
+ mkString(*state.allocAttr(v, state.sOutPath), flake.flake.path, {flake.flake.path});
- vFlake->attrs->sort();
- }
+ if (flake.flake.revCount)
+ mkInt(*state.allocAttr(v, state.symbols.create("revCount")), *flake.flake.revCount);
- vResult->attrs->sort();
+ auto vProvides = state.allocAttr(v, state.symbols.create("provides"));
+ mkApp(*vProvides, *flake.flake.vProvides, v);
- v = *vResult;
+ v.attrs->sort();
+}
- assert(vTop);
- return vTop;
+// Return the `provides` of the top flake, while assigning to `v` the provides
+// of the dependencies as well.
+void makeFlakeValue(EvalState & state, const FlakeRef & flakeRef, bool impureTopRef, Value & v)
+{
+ callFlake(state, resolveFlake(state, flakeRef, impureTopRef), v);
}
// This function is exposed to be used in nix files.