forked from lix-project/lix
nix registry pin: add a way to pin to a custom locked
This commit is contained in:
parent
093ed47636
commit
811f3e8605
|
@ -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);
|
||||||
|
|
|
@ -152,9 +152,11 @@ 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
|
||||||
|
@ -167,14 +169,27 @@ struct CmdRegistryPin : RegistryCommand, 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 registry = getRegistry();
|
||||||
auto ref = parseFlakeRef(url);
|
auto ref = parseFlakeRef(url);
|
||||||
|
auto locked_ref = parseFlakeRef(locked);
|
||||||
registry->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;
|
||||||
registry->add(ref.input, resolved, extraAttrs);
|
registry->add(ref.input, resolved, extraAttrs);
|
||||||
|
|
Loading…
Reference in a new issue