aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-05-15 14:38:10 +0200
committerEelco Dolstra <edolstra@gmail.com>2020-05-15 14:38:10 +0200
commit5f64655ff429be08aa0787761697787e7050f373 (patch)
tree7e556119ceab59852e1392fd4112e83719b7bb8a /src
parent849d3968dbe8c18651e1a7fbf071fc3304257517 (diff)
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).
Diffstat (limited to 'src')
-rw-r--r--src/nix/flake.cc108
-rw-r--r--src/nix/registry.cc150
-rw-r--r--src/nix/run.cc1
3 files changed, 150 insertions, 109 deletions
diff --git a/src/nix/flake.cc b/src/nix/flake.cc
index b6cc7eb54..d255bdda5 100644
--- a/src/nix/flake.cc
+++ b/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)
{
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
{
std::string description() override
@@ -836,14 +732,10 @@ struct CmdFlake : virtual MultiCommand, virtual Command
{
CmdFlake()
: MultiCommand({
- {"list", []() { return make_ref<CmdFlakeList>(); }},
{"update", []() { return make_ref<CmdFlakeUpdate>(); }},
{"info", []() { return make_ref<CmdFlakeInfo>(); }},
{"list-inputs", []() { return make_ref<CmdFlakeListInputs>(); }},
{"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>(); }},
{"clone", []() { return make_ref<CmdFlakeClone>(); }},
{"archive", []() { return make_ref<CmdFlakeArchive>(); }},
diff --git a/src/nix/registry.cc b/src/nix/registry.cc
new file mode 100644
index 000000000..e9c76e6c6
--- /dev/null
+++ b/src/nix/registry.cc
@@ -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");
diff --git a/src/nix/run.cc b/src/nix/run.cc
index f9b1298f1..2ab9d9ef4 100644
--- a/src/nix/run.cc
+++ b/src/nix/run.cc
@@ -108,7 +108,6 @@ struct CmdShell : InstallablesCommand, RunCommon, MixEnvironment
auto accessor = store->getFSAccessor();
-
std::unordered_set<StorePath> done;
std::queue<StorePath> todo;
for (auto & path : outPaths) todo.push(path.clone());