Skip to content

Commit

Permalink
Move registry-related commands from 'nix flake' to 'nix registry'
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
edolstra committed May 15, 2020
1 parent 849d396 commit 5f64655
Show file tree
Hide file tree
Showing 4 changed files with 159 additions and 118 deletions.
108 changes: 0 additions & 108 deletions src/nix/flake.cc
Original file line number Diff line number Diff line change
Expand Up @@ -55,34 +55,6 @@ class FlakeCommand : virtual Args, public EvalCommand, public MixFlakeOptions
}
};

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());
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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>(); }},
Expand Down
150 changes: 150 additions & 0 deletions src/nix/registry.cc
Original file line number Diff line number Diff line change
@@ -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");
1 change: 0 additions & 1 deletion src/nix/run.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
18 changes: 9 additions & 9 deletions tests/flakes.sh
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ cat > $registry <<EOF
EOF

# Test 'nix flake list'.
[[ $(nix flake list | wc -l) == 6 ]]
[[ $(nix registry list | wc -l) == 6 ]]

# Test 'nix flake info'.
nix flake info flake1 | grep -q 'URL: .*flake1.*'
Expand Down Expand Up @@ -264,10 +264,10 @@ git -C $flake3Dir add flake.lock
git -C $flake3Dir commit -m 'Add lockfile'

# 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
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

# Test whether flakes are registered as GC roots for offline use.
Expand Down Expand Up @@ -391,12 +391,12 @@ git -C $flake3Dir checkout master
nix build -o $TEST_ROOT/result flake4/removeXyzzy#sth

# Testing the nix CLI
nix flake add flake1 flake3
[[ $(nix flake list | wc -l) == 7 ]]
nix flake pin flake1
[[ $(nix flake list | wc -l) == 7 ]]
nix flake remove flake1
[[ $(nix flake list | wc -l) == 6 ]]
nix registry add flake1 flake3
[[ $(nix registry list | wc -l) == 7 ]]
nix registry pin flake1
[[ $(nix registry list | wc -l) == 7 ]]
nix registry remove flake1
[[ $(nix registry list | wc -l) == 6 ]]

# Test 'nix flake init'.
(cd $flake7Dir && nix flake init)
Expand Down

0 comments on commit 5f64655

Please sign in to comment.