From 063cdb5508bb4a6917eff25e8f8da55ecfedae2e Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 19 Nov 2025 11:04:52 +0100 Subject: [PATCH] Add `nix registry resolve` command --- src/nix/registry-resolve.md | 28 +++++++++++++++++++++++++ src/nix/registry.cc | 35 +++++++++++++++++++++++++++++++ tests/functional/flakes/flakes.sh | 4 +++- 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 src/nix/registry-resolve.md diff --git a/src/nix/registry-resolve.md b/src/nix/registry-resolve.md new file mode 100644 index 000000000..7de25a26a --- /dev/null +++ b/src/nix/registry-resolve.md @@ -0,0 +1,28 @@ +R""( + +# Examples + +* Resolve the `nixpkgs` and `blender-bin` flakerefs: + + ```console + # nix registry resolve nixpkgs blender-bin + github:NixOS/nixpkgs/nixpkgs-unstable + github:edolstra/nix-warez?dir=blender + ``` + +* Resolve an indirect flakeref with a branch override: + + ```console + # nix registry resolve nixpkgs/25.05 + github:NixOS/nixpkgs/25.05 + ``` + +# Description + +This command resolves indirect flakerefs (e.g. `nixpkgs`) to direct flakerefs (e.g. `github:NixOS/nixpkgs`) using the flake registries. It looks up each provided flakeref in all available registries (flag, user, system, and global) and returns the resolved direct flakeref on a separate line on standard output. It does not fetch any flakes. + +The resolution process may apply multiple redirections if necessary until a direct flakeref is found. If an indirect flakeref cannot be found in any registry, an error will be thrown. + +See the [`nix registry` manual page](./nix3-registry.md) for more details on the registry. + +)"" \ No newline at end of file diff --git a/src/nix/registry.cc b/src/nix/registry.cc index 91a73ff2f..d62665a58 100644 --- a/src/nix/registry.cc +++ b/src/nix/registry.cc @@ -202,6 +202,40 @@ struct CmdRegistryPin : RegistryCommand, EvalCommand } }; +struct CmdRegistryResolve : StoreCommand +{ + std::vector urls; + + std::string description() override + { + return "resolve flake references using the registry"; + } + + std::string doc() override + { + return +#include "registry-resolve.md" + ; + } + + CmdRegistryResolve() + { + expectArgs({ + .label = "flake-refs", + .handler = {&urls}, + }); + } + + void run(nix::ref store) override + { + for (auto & url : urls) { + auto ref = parseFlakeRef(fetchSettings, url); + auto resolved = ref.resolve(fetchSettings, *store); + logger->cout("%s", resolved.to_string()); + } + } +}; + struct CmdRegistry : NixMultiCommand { CmdRegistry() @@ -212,6 +246,7 @@ struct CmdRegistry : NixMultiCommand {"add", []() { return make_ref(); }}, {"remove", []() { return make_ref(); }}, {"pin", []() { return make_ref(); }}, + {"resolve", []() { return make_ref(); }}, }) { } diff --git a/tests/functional/flakes/flakes.sh b/tests/functional/flakes/flakes.sh index 9383cc3ad..d9e187251 100755 --- a/tests/functional/flakes/flakes.sh +++ b/tests/functional/flakes/flakes.sh @@ -252,15 +252,17 @@ nix flake lock "$flake3Dir" nix flake update --flake "$flake3Dir" --override-flake flake2 nixpkgs [[ -n $(git -C "$flake3Dir" diff master || echo failed) ]] -# Testing the nix CLI +# Test `nix registry` commands. nix registry add flake1 flake3 [[ $(nix registry list | wc -l) == 5 ]] +[[ $(nix registry resolve flake1) = "git+file://$percentEncodedFlake3Dir" ]] nix registry pin flake1 [[ $(nix registry list | wc -l) == 5 ]] nix registry pin flake1 flake3 [[ $(nix registry list | wc -l) == 5 ]] nix registry remove flake1 [[ $(nix registry list | wc -l) == 4 ]] +[[ $(nix registry resolve flake1) = "git+file://$flake1Dir" ]] # Test 'nix registry list' with a disabled global registry. nix registry add user-flake1 git+file://"$flake1Dir"