Merge branch 'balsoft/registry' of https://github.com/serokell/nix
This commit is contained in:
commit
e37ecd1282
7 changed files with 110 additions and 86 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = {®istry_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());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 ]]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue