forked from lix-project/lix
Move registry-related commands from 'nix flake' to 'nix registry'
This makes 'nix flake' less cluttered and more consistent (it's only subcommands that operator on a flake). Also, the registry is not inherently flake-related (e.g. fetchTree could also use it to remap inputs).
This commit is contained in:
parent
849d3968db
commit
5f64655ff4
108
src/nix/flake.cc
108
src/nix/flake.cc
|
@ -55,34 +55,6 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CmdFlakeList : EvalCommand
|
|
||||||
{
|
|
||||||
std::string description() override
|
|
||||||
{
|
|
||||||
return "list available Nix flakes";
|
|
||||||
}
|
|
||||||
|
|
||||||
void run(nix::ref<nix::Store> store) override
|
|
||||||
{
|
|
||||||
using namespace fetchers;
|
|
||||||
|
|
||||||
auto registries = getRegistries(store);
|
|
||||||
|
|
||||||
for (auto & registry : registries) {
|
|
||||||
for (auto & entry : registry->entries) {
|
|
||||||
// FIXME: format nicely
|
|
||||||
logger->stdout("%s %s %s",
|
|
||||||
registry->type == Registry::Flag ? "flags " :
|
|
||||||
registry->type == Registry::User ? "user " :
|
|
||||||
registry->type == Registry::System ? "system" :
|
|
||||||
"global",
|
|
||||||
entry.from->to_string(),
|
|
||||||
entry.to->to_string());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void printFlakeInfo(const Store & store, const Flake & flake)
|
static void printFlakeInfo(const Store & store, const Flake & flake)
|
||||||
{
|
{
|
||||||
logger->stdout("Resolved URL: %s", flake.resolvedRef.to_string());
|
logger->stdout("Resolved URL: %s", flake.resolvedRef.to_string());
|
||||||
|
@ -472,82 +444,6 @@ struct CmdFlakeCheck : FlakeCommand
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CmdFlakeAdd : MixEvalArgs, Command
|
|
||||||
{
|
|
||||||
std::string fromUrl, toUrl;
|
|
||||||
|
|
||||||
std::string description() override
|
|
||||||
{
|
|
||||||
return "upsert flake in user flake registry";
|
|
||||||
}
|
|
||||||
|
|
||||||
CmdFlakeAdd()
|
|
||||||
{
|
|
||||||
expectArg("from-url", &fromUrl);
|
|
||||||
expectArg("to-url", &toUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void run() override
|
|
||||||
{
|
|
||||||
auto fromRef = parseFlakeRef(fromUrl);
|
|
||||||
auto toRef = parseFlakeRef(toUrl);
|
|
||||||
fetchers::Attrs extraAttrs;
|
|
||||||
if (toRef.subdir != "") extraAttrs["dir"] = toRef.subdir;
|
|
||||||
auto userRegistry = fetchers::getUserRegistry();
|
|
||||||
userRegistry->remove(fromRef.input);
|
|
||||||
userRegistry->add(fromRef.input, toRef.input, extraAttrs);
|
|
||||||
userRegistry->write(fetchers::getUserRegistryPath());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CmdFlakeRemove : virtual Args, MixEvalArgs, Command
|
|
||||||
{
|
|
||||||
std::string url;
|
|
||||||
|
|
||||||
std::string description() override
|
|
||||||
{
|
|
||||||
return "remove flake from user flake registry";
|
|
||||||
}
|
|
||||||
|
|
||||||
CmdFlakeRemove()
|
|
||||||
{
|
|
||||||
expectArg("url", &url);
|
|
||||||
}
|
|
||||||
|
|
||||||
void run() override
|
|
||||||
{
|
|
||||||
auto userRegistry = fetchers::getUserRegistry();
|
|
||||||
userRegistry->remove(parseFlakeRef(url).input);
|
|
||||||
userRegistry->write(fetchers::getUserRegistryPath());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CmdFlakePin : virtual Args, EvalCommand
|
|
||||||
{
|
|
||||||
std::string url;
|
|
||||||
|
|
||||||
std::string description() override
|
|
||||||
{
|
|
||||||
return "pin a flake to its current version in user flake registry";
|
|
||||||
}
|
|
||||||
|
|
||||||
CmdFlakePin()
|
|
||||||
{
|
|
||||||
expectArg("url", &url);
|
|
||||||
}
|
|
||||||
|
|
||||||
void run(nix::ref<nix::Store> store) override
|
|
||||||
{
|
|
||||||
auto ref = parseFlakeRef(url);
|
|
||||||
auto userRegistry = fetchers::getUserRegistry();
|
|
||||||
userRegistry->remove(ref.input);
|
|
||||||
auto [tree, resolved] = ref.resolve(store).input->fetchTree(store);
|
|
||||||
fetchers::Attrs extraAttrs;
|
|
||||||
if (ref.subdir != "") extraAttrs["dir"] = ref.subdir;
|
|
||||||
userRegistry->add(ref.input, resolved, extraAttrs);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CmdFlakeInit : virtual Args, Command
|
struct CmdFlakeInit : virtual Args, Command
|
||||||
{
|
{
|
||||||
std::string description() override
|
std::string description() override
|
||||||
|
@ -836,14 +732,10 @@ struct CmdFlake : virtual MultiCommand, virtual Command
|
||||||
{
|
{
|
||||||
CmdFlake()
|
CmdFlake()
|
||||||
: MultiCommand({
|
: MultiCommand({
|
||||||
{"list", []() { return make_ref<CmdFlakeList>(); }},
|
|
||||||
{"update", []() { return make_ref<CmdFlakeUpdate>(); }},
|
{"update", []() { return make_ref<CmdFlakeUpdate>(); }},
|
||||||
{"info", []() { return make_ref<CmdFlakeInfo>(); }},
|
{"info", []() { return make_ref<CmdFlakeInfo>(); }},
|
||||||
{"list-inputs", []() { return make_ref<CmdFlakeListInputs>(); }},
|
{"list-inputs", []() { return make_ref<CmdFlakeListInputs>(); }},
|
||||||
{"check", []() { return make_ref<CmdFlakeCheck>(); }},
|
{"check", []() { return make_ref<CmdFlakeCheck>(); }},
|
||||||
{"add", []() { return make_ref<CmdFlakeAdd>(); }},
|
|
||||||
{"remove", []() { return make_ref<CmdFlakeRemove>(); }},
|
|
||||||
{"pin", []() { return make_ref<CmdFlakePin>(); }},
|
|
||||||
{"init", []() { return make_ref<CmdFlakeInit>(); }},
|
{"init", []() { return make_ref<CmdFlakeInit>(); }},
|
||||||
{"clone", []() { return make_ref<CmdFlakeClone>(); }},
|
{"clone", []() { return make_ref<CmdFlakeClone>(); }},
|
||||||
{"archive", []() { return make_ref<CmdFlakeArchive>(); }},
|
{"archive", []() { return make_ref<CmdFlakeArchive>(); }},
|
||||||
|
|
150
src/nix/registry.cc
Normal file
150
src/nix/registry.cc
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
#include "command.hh"
|
||||||
|
#include "common-args.hh"
|
||||||
|
#include "shared.hh"
|
||||||
|
#include "eval.hh"
|
||||||
|
#include "flake/flake.hh"
|
||||||
|
#include "store-api.hh"
|
||||||
|
#include "fetchers.hh"
|
||||||
|
#include "registry.hh"
|
||||||
|
|
||||||
|
using namespace nix;
|
||||||
|
using namespace nix::flake;
|
||||||
|
|
||||||
|
struct CmdRegistryList : StoreCommand
|
||||||
|
{
|
||||||
|
std::string description() override
|
||||||
|
{
|
||||||
|
return "list available Nix flakes";
|
||||||
|
}
|
||||||
|
|
||||||
|
void run(nix::ref<nix::Store> store) override
|
||||||
|
{
|
||||||
|
using namespace fetchers;
|
||||||
|
|
||||||
|
auto registries = getRegistries(store);
|
||||||
|
|
||||||
|
for (auto & registry : registries) {
|
||||||
|
for (auto & entry : registry->entries) {
|
||||||
|
// FIXME: format nicely
|
||||||
|
logger->stdout("%s %s %s",
|
||||||
|
registry->type == Registry::Flag ? "flags " :
|
||||||
|
registry->type == Registry::User ? "user " :
|
||||||
|
registry->type == Registry::System ? "system" :
|
||||||
|
"global",
|
||||||
|
entry.from->to_string(),
|
||||||
|
entry.to->to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CmdRegistryAdd : MixEvalArgs, Command
|
||||||
|
{
|
||||||
|
std::string fromUrl, toUrl;
|
||||||
|
|
||||||
|
std::string description() override
|
||||||
|
{
|
||||||
|
return "add/replace flake in user flake registry";
|
||||||
|
}
|
||||||
|
|
||||||
|
CmdRegistryAdd()
|
||||||
|
{
|
||||||
|
expectArg("from-url", &fromUrl);
|
||||||
|
expectArg("to-url", &toUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run() override
|
||||||
|
{
|
||||||
|
auto fromRef = parseFlakeRef(fromUrl);
|
||||||
|
auto toRef = parseFlakeRef(toUrl);
|
||||||
|
fetchers::Attrs extraAttrs;
|
||||||
|
if (toRef.subdir != "") extraAttrs["dir"] = toRef.subdir;
|
||||||
|
auto userRegistry = fetchers::getUserRegistry();
|
||||||
|
userRegistry->remove(fromRef.input);
|
||||||
|
userRegistry->add(fromRef.input, toRef.input, extraAttrs);
|
||||||
|
userRegistry->write(fetchers::getUserRegistryPath());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CmdRegistryRemove : virtual Args, MixEvalArgs, Command
|
||||||
|
{
|
||||||
|
std::string url;
|
||||||
|
|
||||||
|
std::string description() override
|
||||||
|
{
|
||||||
|
return "remove flake from user flake registry";
|
||||||
|
}
|
||||||
|
|
||||||
|
CmdRegistryRemove()
|
||||||
|
{
|
||||||
|
expectArg("url", &url);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run() override
|
||||||
|
{
|
||||||
|
auto userRegistry = fetchers::getUserRegistry();
|
||||||
|
userRegistry->remove(parseFlakeRef(url).input);
|
||||||
|
userRegistry->write(fetchers::getUserRegistryPath());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CmdRegistryPin : virtual Args, EvalCommand
|
||||||
|
{
|
||||||
|
std::string url;
|
||||||
|
|
||||||
|
std::string description() override
|
||||||
|
{
|
||||||
|
return "pin a flake to its current version in user flake registry";
|
||||||
|
}
|
||||||
|
|
||||||
|
CmdRegistryPin()
|
||||||
|
{
|
||||||
|
expectArg("url", &url);
|
||||||
|
}
|
||||||
|
|
||||||
|
void run(nix::ref<nix::Store> store) override
|
||||||
|
{
|
||||||
|
auto ref = parseFlakeRef(url);
|
||||||
|
auto userRegistry = fetchers::getUserRegistry();
|
||||||
|
userRegistry->remove(ref.input);
|
||||||
|
auto [tree, resolved] = ref.resolve(store).input->fetchTree(store);
|
||||||
|
fetchers::Attrs extraAttrs;
|
||||||
|
if (ref.subdir != "") extraAttrs["dir"] = ref.subdir;
|
||||||
|
userRegistry->add(ref.input, resolved, extraAttrs);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CmdRegistry : virtual MultiCommand, virtual Command
|
||||||
|
{
|
||||||
|
CmdRegistry()
|
||||||
|
: MultiCommand({
|
||||||
|
{"list", []() { return make_ref<CmdRegistryList>(); }},
|
||||||
|
{"add", []() { return make_ref<CmdRegistryAdd>(); }},
|
||||||
|
{"remove", []() { return make_ref<CmdRegistryRemove>(); }},
|
||||||
|
{"pin", []() { return make_ref<CmdRegistryPin>(); }},
|
||||||
|
})
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string description() override
|
||||||
|
{
|
||||||
|
return "manage the flake registry";
|
||||||
|
}
|
||||||
|
|
||||||
|
Category category() override { return catSecondary; }
|
||||||
|
|
||||||
|
void run() override
|
||||||
|
{
|
||||||
|
if (!command)
|
||||||
|
throw UsageError("'nix registry' requires a sub-command.");
|
||||||
|
command->second->prepare();
|
||||||
|
command->second->run();
|
||||||
|
}
|
||||||
|
|
||||||
|
void printHelp(const string & programName, std::ostream & out) override
|
||||||
|
{
|
||||||
|
MultiCommand::printHelp(programName, out);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static auto r1 = registerCommand<CmdRegistry>("registry");
|
|
@ -108,7 +108,6 @@ struct CmdShell : InstallablesCommand, RunCommon, MixEnvironment
|
||||||
|
|
||||||
auto accessor = store->getFSAccessor();
|
auto accessor = store->getFSAccessor();
|
||||||
|
|
||||||
|
|
||||||
std::unordered_set<StorePath> done;
|
std::unordered_set<StorePath> done;
|
||||||
std::queue<StorePath> todo;
|
std::queue<StorePath> todo;
|
||||||
for (auto & path : outPaths) todo.push(path.clone());
|
for (auto & path : outPaths) todo.push(path.clone());
|
||||||
|
|
|
@ -151,7 +151,7 @@ cat > $registry <<EOF
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Test 'nix flake list'.
|
# Test 'nix flake list'.
|
||||||
[[ $(nix flake list | wc -l) == 6 ]]
|
[[ $(nix registry list | wc -l) == 6 ]]
|
||||||
|
|
||||||
# Test 'nix flake info'.
|
# Test 'nix flake info'.
|
||||||
nix flake info flake1 | grep -q 'URL: .*flake1.*'
|
nix flake info flake1 | grep -q 'URL: .*flake1.*'
|
||||||
|
@ -264,10 +264,10 @@ git -C $flake3Dir add flake.lock
|
||||||
git -C $flake3Dir commit -m 'Add lockfile'
|
git -C $flake3Dir commit -m 'Add lockfile'
|
||||||
|
|
||||||
# Test whether registry caching works.
|
# Test whether registry caching works.
|
||||||
nix flake list --flake-registry file://$registry | grep -q flake3
|
nix registry list --flake-registry file://$registry | grep -q flake3
|
||||||
mv $registry $registry.tmp
|
mv $registry $registry.tmp
|
||||||
nix-store --gc
|
nix-store --gc
|
||||||
nix flake list --flake-registry file://$registry --refresh | grep -q flake3
|
nix registry list --flake-registry file://$registry --refresh | grep -q flake3
|
||||||
mv $registry.tmp $registry
|
mv $registry.tmp $registry
|
||||||
|
|
||||||
# Test whether flakes are registered as GC roots for offline use.
|
# Test whether flakes are registered as GC roots for offline use.
|
||||||
|
@ -391,12 +391,12 @@ git -C $flake3Dir checkout master
|
||||||
nix build -o $TEST_ROOT/result flake4/removeXyzzy#sth
|
nix build -o $TEST_ROOT/result flake4/removeXyzzy#sth
|
||||||
|
|
||||||
# Testing the nix CLI
|
# Testing the nix CLI
|
||||||
nix flake add flake1 flake3
|
nix registry add flake1 flake3
|
||||||
[[ $(nix flake list | wc -l) == 7 ]]
|
[[ $(nix registry list | wc -l) == 7 ]]
|
||||||
nix flake pin flake1
|
nix registry pin flake1
|
||||||
[[ $(nix flake list | wc -l) == 7 ]]
|
[[ $(nix registry list | wc -l) == 7 ]]
|
||||||
nix flake remove flake1
|
nix registry remove flake1
|
||||||
[[ $(nix flake list | wc -l) == 6 ]]
|
[[ $(nix registry list | wc -l) == 6 ]]
|
||||||
|
|
||||||
# Test 'nix flake init'.
|
# Test 'nix flake init'.
|
||||||
(cd $flake7Dir && nix flake init)
|
(cd $flake7Dir && nix flake init)
|
||||||
|
|
Loading…
Reference in a new issue