Extract flake dependencies from the 'outputs' arguments

That is, instead of

  inputs = [ "nixpkgs" ];

  outputs = inputs: ... inputs.nixpkgs ...;

you can write

  outputs = { nixpkgs }: ... inputs.nixpkgs ...;
This commit is contained in:
Eelco Dolstra 2019-08-30 11:22:34 +02:00
parent ebc4dae517
commit 89468410d5
3 changed files with 15 additions and 5 deletions

View file

@ -304,6 +304,7 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
, sOutputHashAlgo(symbols.create("outputHashAlgo")) , sOutputHashAlgo(symbols.create("outputHashAlgo"))
, sOutputHashMode(symbols.create("outputHashMode")) , sOutputHashMode(symbols.create("outputHashMode"))
, sDescription(symbols.create("description")) , sDescription(symbols.create("description"))
, sSelf(symbols.create("self"))
, repair(NoRepair) , repair(NoRepair)
, store(store) , store(store)
, baseEnv(allocEnv(128)) , baseEnv(allocEnv(128))

View file

@ -80,7 +80,7 @@ public:
sFile, sLine, sColumn, sFunctor, sToString, sFile, sLine, sColumn, sFunctor, sToString,
sRight, sWrong, sStructuredAttrs, sBuilder, sArgs, sRight, sWrong, sStructuredAttrs, sBuilder, sArgs,
sOutputHash, sOutputHashAlgo, sOutputHashMode, sOutputHash, sOutputHashAlgo, sOutputHashMode,
sDescription; sDescription, sSelf;
Symbol sDerivationNix; Symbol sDerivationNix;
/* If set, force copying files to the Nix store even if they /* If set, force copying files to the Nix store even if they

View file

@ -232,10 +232,10 @@ Flake getFlake(EvalState & state, const FlakeRef & flakeRef)
if (edition) { if (edition) {
flake.edition = state.forceInt(*(**edition).value, *(**edition).pos); flake.edition = state.forceInt(*(**edition).value, *(**edition).pos);
if (flake.edition < 201906) if (flake.edition > 201909)
throw Error("flake '%s' has illegal edition %d", flakeRef, flake.edition);
if (flake.edition > 201906)
throw Error("flake '%s' requires unsupported edition %d; please upgrade Nix", flakeRef, flake.edition); throw Error("flake '%s' requires unsupported edition %d; please upgrade Nix", flakeRef, flake.edition);
if (flake.edition < 201909)
throw Error("flake '%s' has illegal edition %d", flakeRef, flake.edition);
} else } else
throw Error("flake '%s' lacks attribute 'edition'", flakeRef); throw Error("flake '%s' lacks attribute 'edition'", flakeRef);
@ -272,6 +272,15 @@ Flake getFlake(EvalState & state, const FlakeRef & flakeRef)
if (auto outputs = vInfo.attrs->get(sOutputs)) { if (auto outputs = vInfo.attrs->get(sOutputs)) {
state.forceFunction(*(**outputs).value, *(**outputs).pos); state.forceFunction(*(**outputs).value, *(**outputs).pos);
flake.vOutputs = (**outputs).value; flake.vOutputs = (**outputs).value;
if (flake.vOutputs->lambda.fun->matchAttrs) {
for (auto & formal : flake.vOutputs->lambda.fun->formals->formals) {
if (formal.name != state.sSelf) {
flake.inputs.push_back(FlakeRef(formal.name));
}
}
}
} else } else
throw Error("flake '%s' lacks attribute 'outputs'", flakeRef); throw Error("flake '%s' lacks attribute 'outputs'", flakeRef);
@ -538,7 +547,7 @@ void callFlake(EvalState & state,
auto vOutputs = state.allocAttr(v, state.symbols.create("outputs")); auto vOutputs = state.allocAttr(v, state.symbols.create("outputs"));
mkApp(*vOutputs, *flake.vOutputs, v); mkApp(*vOutputs, *flake.vOutputs, v);
v.attrs->push_back(Attr(state.symbols.create("self"), &v)); v.attrs->push_back(Attr(state.sSelf, &v));
v.attrs->sort(); v.attrs->sort();