Merge branch 'balsoft/registry' of https://github.com/serokell/nix

This commit is contained in:
Eelco Dolstra 2021-07-07 09:57:15 +02:00
commit e37ecd1282
7 changed files with 110 additions and 86 deletions

View file

@ -124,6 +124,13 @@ std::shared_ptr<Registry> getUserRegistry()
return userRegistry; return userRegistry;
} }
std::shared_ptr<Registry> getCustomRegistry(Path p)
{
static auto customRegistry =
Registry::read(p, Registry::Custom);
return customRegistry;
}
static std::shared_ptr<Registry> flagRegistry = static std::shared_ptr<Registry> flagRegistry =
std::make_shared<Registry>(Registry::Flag); std::make_shared<Registry>(Registry::Flag);

View file

@ -14,6 +14,7 @@ struct Registry
User = 1, User = 1,
System = 2, System = 2,
Global = 3, Global = 3,
Custom = 4,
}; };
RegistryType type; RegistryType type;
@ -48,6 +49,8 @@ typedef std::vector<std::shared_ptr<Registry>> Registries;
std::shared_ptr<Registry> getUserRegistry(); std::shared_ptr<Registry> getUserRegistry();
std::shared_ptr<Registry> getCustomRegistry(Path p);
Path getUserRegistryPath(); Path getUserRegistryPath();
Registries getRegistries(ref<Store> store); Registries getRegistries(ref<Store> store);

View file

@ -21,6 +21,13 @@ R""(
# nix registry add nixpkgs/nixos-20.03 ~/Dev/nixpkgs # nix registry add nixpkgs/nixos-20.03 ~/Dev/nixpkgs
``` ```
* Add `nixpkgs` pointing to `github:nixos/nixpkgs` to your custom flake
registry:
```console
nix registry add --registry ./custom-flake-registry.json nixpkgs github:nixos/nixpkgs
```
# Description # Description
This command adds an entry to the user registry that maps flake This command adds an entry to the user registry that maps flake

View file

@ -24,6 +24,13 @@ R""(
``` ```
* Pin `nixpkgs` in a custom registry to its most recent Git revision
```console
# nix registry pin --registry ./custom-flake-registry.json nixpkgs
```
# Description # Description
This command adds an entry to the user registry that maps flake This command adds an entry to the user registry that maps flake

View file

@ -8,6 +8,12 @@ R""(
# nix registry remove nixpkgs # nix registry remove nixpkgs
``` ```
* Remove the entry `nixpkgs` from a custom registry:
```console
# nix registry remove --registry ./custom-flake-registry.json nixpkgs
```
# Description # Description
This command removes from the user registry any entry for flake This command removes from the user registry any entry for flake

View file

@ -10,6 +10,45 @@
using namespace nix; using namespace nix;
using namespace nix::flake; using namespace nix::flake;
class RegistryCommand: virtual Args
{
std::string registry_path;
std::shared_ptr<fetchers::Registry> registry;
public:
RegistryCommand()
{
addFlag({
.longName = "registry",
.description = "The registry to operate on.",
.labels = {"registry"},
.handler = {&registry_path},
});
}
std::shared_ptr<fetchers::Registry> getRegistry() {
if (registry) return registry;
if (registry_path.empty()) {
registry = fetchers::getUserRegistry();
} else {
registry = fetchers::getCustomRegistry(registry_path);
}
return registry;
}
Path getRegistryPath() {
if (registry_path.empty()) {
return fetchers::getUserRegistryPath();
} else {
return registry_path;
}
}
};
struct CmdRegistryList : StoreCommand struct CmdRegistryList : StoreCommand
{ {
std::string description() override std::string description() override
@ -45,7 +84,7 @@ struct CmdRegistryList : StoreCommand
} }
}; };
struct CmdRegistryAdd : MixEvalArgs, Command struct CmdRegistryAdd : MixEvalArgs, Command, RegistryCommand
{ {
std::string fromUrl, toUrl; std::string fromUrl, toUrl;
@ -71,16 +110,16 @@ struct CmdRegistryAdd : MixEvalArgs, Command
{ {
auto fromRef = parseFlakeRef(fromUrl); auto fromRef = parseFlakeRef(fromUrl);
auto toRef = parseFlakeRef(toUrl); auto toRef = parseFlakeRef(toUrl);
auto registry = getRegistry();
fetchers::Attrs extraAttrs; fetchers::Attrs extraAttrs;
if (toRef.subdir != "") extraAttrs["dir"] = toRef.subdir; if (toRef.subdir != "") extraAttrs["dir"] = toRef.subdir;
auto userRegistry = fetchers::getUserRegistry(); registry->remove(fromRef.input);
userRegistry->remove(fromRef.input); registry->add(fromRef.input, toRef.input, extraAttrs);
userRegistry->add(fromRef.input, toRef.input, extraAttrs); registry->write(getRegistryPath());
userRegistry->write(fetchers::getUserRegistryPath());
} }
}; };
struct CmdRegistryRemove : virtual Args, MixEvalArgs, Command struct CmdRegistryRemove : RegistryCommand, Command
{ {
std::string url; std::string url;
@ -103,19 +142,21 @@ struct CmdRegistryRemove : virtual Args, MixEvalArgs, Command
void run() override void run() override
{ {
auto userRegistry = fetchers::getUserRegistry(); auto registry = getRegistry();
userRegistry->remove(parseFlakeRef(url).input); registry->remove(parseFlakeRef(url).input);
userRegistry->write(fetchers::getUserRegistryPath()); registry->write(getRegistryPath());
} }
}; };
struct CmdRegistryPin : virtual Args, EvalCommand struct CmdRegistryPin : RegistryCommand, EvalCommand
{ {
std::string url; std::string url;
std::string locked;
std::string description() override std::string description() override
{ {
return "pin a flake to its current version in user flake registry"; return "pin a flake to its current version in user flake registry or to the current version of a flake URI";
} }
std::string doc() override std::string doc() override
@ -128,18 +169,31 @@ struct CmdRegistryPin : virtual Args, EvalCommand
CmdRegistryPin() CmdRegistryPin()
{ {
expectArg("url", &url); expectArg("url", &url);
expectArgs({
.label = "locked",
.optional = true,
.handler = {&locked},
.completer = {[&](size_t, std::string_view prefix) {
completeFlakeRef(getStore(), prefix);
}}
});
} }
void run(nix::ref<nix::Store> store) override void run(nix::ref<nix::Store> store) override
{ {
if (locked.empty()) {
locked = url;
}
auto registry = getRegistry();
auto ref = parseFlakeRef(url); auto ref = parseFlakeRef(url);
auto userRegistry = fetchers::getUserRegistry(); auto locked_ref = parseFlakeRef(locked);
userRegistry->remove(ref.input); registry->remove(ref.input);
auto [tree, resolved] = ref.resolve(store).input.fetch(store); auto [tree, resolved] = locked_ref.resolve(store).input.fetch(store);
fetchers::Attrs extraAttrs; fetchers::Attrs extraAttrs;
if (ref.subdir != "") extraAttrs["dir"] = ref.subdir; if (ref.subdir != "") extraAttrs["dir"] = ref.subdir;
userRegistry->add(ref.input, resolved, extraAttrs); registry->add(ref.input, resolved, extraAttrs);
userRegistry->write(fetchers::getUserRegistryPath()); registry->write(getRegistryPath());
} }
}; };

View file

@ -90,76 +90,14 @@ EOF
git -C $nonFlakeDir add README.md git -C $nonFlakeDir add README.md
git -C $nonFlakeDir commit -m 'Initial' git -C $nonFlakeDir commit -m 'Initial'
cat > $registry <<EOF # Construct a custom registry, additionally test the --registry flag
{ nix registry add --registry $registry flake1 git+file://$flake1Dir
"version": 2, nix registry add --registry $registry flake2 git+file://$flake2Dir
"flakes": [ nix registry add --registry $registry flake3 git+file://$flake3Dir
{ "from": { nix registry add --registry $registry flake4 flake3
"type": "indirect", nix registry add --registry $registry flake5 hg+file://$flake5Dir
"id": "flake1" nix registry add --registry $registry nixpkgs flake1
}, nix registry add --registry $registry templates git+file://$templatesDir
"to": {
"type": "git",
"url": "file://$flake1Dir"
}
},
{ "from": {
"type": "indirect",
"id": "flake2"
},
"to": {
"type": "git",
"url": "file://$flake2Dir"
}
},
{ "from": {
"type": "indirect",
"id": "flake3"
},
"to": {
"type": "git",
"url": "file://$flake3Dir"
}
},
{ "from": {
"type": "indirect",
"id": "flake4"
},
"to": {
"type": "indirect",
"id": "flake3"
}
},
{ "from": {
"type": "indirect",
"id": "flake5"
},
"to": {
"type": "hg",
"url": "file://$flake5Dir"
}
},
{ "from": {
"type": "indirect",
"id": "nixpkgs"
},
"to": {
"type": "indirect",
"id": "flake1"
}
},
{ "from": {
"type": "indirect",
"id": "templates"
},
"to": {
"type": "git",
"url": "file://$templatesDir"
}
}
]
}
EOF
# Test 'nix flake list'. # Test 'nix flake list'.
[[ $(nix registry list | wc -l) == 7 ]] [[ $(nix registry list | wc -l) == 7 ]]
@ -405,6 +343,8 @@ nix registry add flake1 flake3
[[ $(nix registry list | wc -l) == 8 ]] [[ $(nix registry list | wc -l) == 8 ]]
nix registry pin flake1 nix registry pin flake1
[[ $(nix registry list | wc -l) == 8 ]] [[ $(nix registry list | wc -l) == 8 ]]
nix registry pin flake1 flake3
[[ $(nix registry list | wc -l) == 8 ]]
nix registry remove flake1 nix registry remove flake1
[[ $(nix registry list | wc -l) == 7 ]] [[ $(nix registry list | wc -l) == 7 ]]