2016-02-09 20:28:29 +00:00
|
|
|
#include "command.hh"
|
|
|
|
#include "store-api.hh"
|
2017-04-25 11:20:26 +00:00
|
|
|
#include "derivations.hh"
|
2019-11-08 14:13:32 +00:00
|
|
|
#include "nixexpr.hh"
|
2016-02-09 20:28:29 +00:00
|
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
2019-06-18 14:01:35 +00:00
|
|
|
Commands * RegisterCommand::commands = nullptr;
|
2016-02-09 20:28:29 +00:00
|
|
|
|
2016-03-21 17:03:36 +00:00
|
|
|
StoreCommand::StoreCommand()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2017-04-25 09:20:37 +00:00
|
|
|
ref<Store> StoreCommand::getStore()
|
|
|
|
{
|
|
|
|
if (!_store)
|
|
|
|
_store = createStore();
|
|
|
|
return ref<Store>(_store);
|
|
|
|
}
|
|
|
|
|
2017-03-16 13:25:54 +00:00
|
|
|
ref<Store> StoreCommand::createStore()
|
|
|
|
{
|
2017-10-23 17:34:49 +00:00
|
|
|
return openStore();
|
2017-03-16 13:25:54 +00:00
|
|
|
}
|
|
|
|
|
2016-02-09 20:28:29 +00:00
|
|
|
void StoreCommand::run()
|
|
|
|
{
|
2017-09-08 12:46:55 +00:00
|
|
|
run(getStore());
|
2016-02-09 20:28:29 +00:00
|
|
|
}
|
|
|
|
|
2017-09-27 16:28:54 +00:00
|
|
|
StorePathsCommand::StorePathsCommand(bool recursive)
|
|
|
|
: recursive(recursive)
|
2016-03-29 12:29:50 +00:00
|
|
|
{
|
2017-09-27 16:28:54 +00:00
|
|
|
if (recursive)
|
|
|
|
mkFlag()
|
|
|
|
.longName("no-recursive")
|
|
|
|
.description("apply operation to specified paths only")
|
|
|
|
.set(&this->recursive, false);
|
|
|
|
else
|
|
|
|
mkFlag()
|
|
|
|
.longName("recursive")
|
|
|
|
.shortName('r')
|
|
|
|
.description("apply operation to closure of the specified paths")
|
|
|
|
.set(&this->recursive, true);
|
|
|
|
|
2016-04-14 19:14:29 +00:00
|
|
|
mkFlag(0, "all", "apply operation to the entire store", &all);
|
2016-03-29 12:29:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void StorePathsCommand::run(ref<Store> store)
|
|
|
|
{
|
2019-12-05 18:11:09 +00:00
|
|
|
StorePaths storePaths;
|
2017-04-25 11:20:26 +00:00
|
|
|
|
2016-04-14 19:14:29 +00:00
|
|
|
if (all) {
|
2017-04-25 11:20:26 +00:00
|
|
|
if (installables.size())
|
2017-07-30 11:27:57 +00:00
|
|
|
throw UsageError("'--all' does not expect arguments");
|
2016-04-14 19:14:29 +00:00
|
|
|
for (auto & p : store->queryAllValidPaths())
|
2019-12-05 18:11:09 +00:00
|
|
|
storePaths.push_back(p.clone());
|
2016-04-14 19:14:29 +00:00
|
|
|
}
|
2016-03-29 12:29:50 +00:00
|
|
|
|
2016-04-14 19:14:29 +00:00
|
|
|
else {
|
2018-03-29 22:56:13 +00:00
|
|
|
for (auto & p : toStorePaths(store, realiseMode, installables))
|
2019-12-05 18:11:09 +00:00
|
|
|
storePaths.push_back(p.clone());
|
2016-04-14 19:14:29 +00:00
|
|
|
|
|
|
|
if (recursive) {
|
2019-12-05 18:11:09 +00:00
|
|
|
StorePathSet closure;
|
|
|
|
store->computeFSClosure(storePathsToSet(storePaths), closure, false, false);
|
|
|
|
storePaths.clear();
|
|
|
|
for (auto & p : closure)
|
|
|
|
storePaths.push_back(p.clone());
|
2016-04-14 19:14:29 +00:00
|
|
|
}
|
2016-03-29 12:29:50 +00:00
|
|
|
}
|
|
|
|
|
2019-12-05 18:11:09 +00:00
|
|
|
run(store, std::move(storePaths));
|
2016-03-29 12:29:50 +00:00
|
|
|
}
|
|
|
|
|
2017-05-04 12:16:26 +00:00
|
|
|
void StorePathCommand::run(ref<Store> store)
|
|
|
|
{
|
2017-09-10 13:58:30 +00:00
|
|
|
auto storePaths = toStorePaths(store, NoBuild, installables);
|
2017-05-04 12:16:26 +00:00
|
|
|
|
|
|
|
if (storePaths.size() != 1)
|
|
|
|
throw UsageError("this command requires exactly one store path");
|
|
|
|
|
|
|
|
run(store, *storePaths.begin());
|
|
|
|
}
|
|
|
|
|
2019-11-08 14:13:32 +00:00
|
|
|
Strings editorFor(const Pos & pos)
|
|
|
|
{
|
2019-11-22 15:06:44 +00:00
|
|
|
auto editor = getEnv("EDITOR").value_or("cat");
|
2019-11-08 14:13:32 +00:00
|
|
|
auto args = tokenizeString<Strings>(editor);
|
|
|
|
if (pos.line > 0 && (
|
|
|
|
editor.find("emacs") != std::string::npos ||
|
|
|
|
editor.find("nano") != std::string::npos ||
|
|
|
|
editor.find("vim") != std::string::npos))
|
|
|
|
args.push_back(fmt("+%d", pos.line));
|
|
|
|
args.push_back(pos.file);
|
|
|
|
return args;
|
|
|
|
}
|
|
|
|
|
2016-02-09 20:28:29 +00:00
|
|
|
}
|