forked from lix-project/lix
Add --inputs-from to use flake inputs as registry entries
This allows you to refer to an input from another flake. For example, $ nix run --inputs-from /path/to/hydra nixpkgs#hello runs 'hello' from the 'nixpkgs' inputs of the 'hydra' flake. Fixes #3769.
This commit is contained in:
parent
7d554f295c
commit
d746503e5c
2 changed files with 27 additions and 0 deletions
|
@ -204,6 +204,8 @@ std::pair<Input, Attrs> lookupInRegistries(
|
||||||
if (!input.isDirect())
|
if (!input.isDirect())
|
||||||
throw Error("cannot find flake '%s' in the flake registries", input.to_string());
|
throw Error("cannot find flake '%s' in the flake registries", input.to_string());
|
||||||
|
|
||||||
|
debug("looked up '%s' -> '%s'", _input.to_string(), input.to_string());
|
||||||
|
|
||||||
return {input, extraAttrs};
|
return {input, extraAttrs};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,31 @@ MixFlakeOptions::MixFlakeOptions()
|
||||||
parseFlakeRef(flakeRef, absPath(".")));
|
parseFlakeRef(flakeRef, absPath(".")));
|
||||||
}}
|
}}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
addFlag({
|
||||||
|
.longName = "inputs-from",
|
||||||
|
.description = "use the inputs of the specified flake as registry entries",
|
||||||
|
.labels = {"flake-url"},
|
||||||
|
.handler = {[&](std::string flakeRef) {
|
||||||
|
auto evalState = getEvalState();
|
||||||
|
auto flake = flake::lockFlake(
|
||||||
|
*evalState,
|
||||||
|
parseFlakeRef(flakeRef, absPath(".")),
|
||||||
|
{ .writeLockFile = false });
|
||||||
|
for (auto & [inputName, input] : flake.lockFile.root->inputs) {
|
||||||
|
auto input2 = flake.lockFile.findInput({inputName}); // resolve 'follows' nodes
|
||||||
|
if (auto input3 = std::dynamic_pointer_cast<const flake::LockedNode>(input2)) {
|
||||||
|
overrideRegistry(
|
||||||
|
fetchers::Input::fromAttrs({{"type","indirect"}, {"id", inputName}}),
|
||||||
|
input3->lockedRef.input,
|
||||||
|
{});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
.completer = {[&](size_t, std::string_view prefix) {
|
||||||
|
completeFlakeRef(getEvalState()->store, prefix);
|
||||||
|
}}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
SourceExprCommand::SourceExprCommand()
|
SourceExprCommand::SourceExprCommand()
|
||||||
|
|
Loading…
Reference in a new issue