diff options
-rw-r--r-- | src/libfetchers/registry.cc | 2 | ||||
-rw-r--r-- | src/nix/installables.cc | 25 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/libfetchers/registry.cc b/src/libfetchers/registry.cc index 914a0e1e8..d4134ce29 100644 --- a/src/libfetchers/registry.cc +++ b/src/libfetchers/registry.cc @@ -204,6 +204,8 @@ std::pair<Input, Attrs> lookupInRegistries( if (!input.isDirect()) 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}; } diff --git a/src/nix/installables.cc b/src/nix/installables.cc index 3683ab945..adfd14a75 100644 --- a/src/nix/installables.cc +++ b/src/nix/installables.cc @@ -84,6 +84,31 @@ MixFlakeOptions::MixFlakeOptions() 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() |