diff options
author | Shea Levy <shea@shealevy.com> | 2021-01-26 06:22:24 -0500 |
---|---|---|
committer | Shea Levy <shea@shealevy.com> | 2021-01-26 06:22:24 -0500 |
commit | 6af6e41df06f0a8a3b919b4052b41d09f0a97678 (patch) | |
tree | 2b2a3a8c199151b3ffc21599a9a0f06adeea1ff3 /src/nix/command.cc | |
parent | 36c4d6f59247826dde32ad2e6b5a9471a9a1c911 (diff) |
Move command plugin interface to libnixcmd
Diffstat (limited to 'src/nix/command.cc')
-rw-r--r-- | src/nix/command.cc | 237 |
1 files changed, 0 insertions, 237 deletions
diff --git a/src/nix/command.cc b/src/nix/command.cc deleted file mode 100644 index 614dee788..000000000 --- a/src/nix/command.cc +++ /dev/null @@ -1,237 +0,0 @@ -#include "command.hh" -#include "store-api.hh" -#include "local-fs-store.hh" -#include "derivations.hh" -#include "nixexpr.hh" -#include "profiles.hh" - -#include <nlohmann/json.hpp> - -extern char * * environ __attribute__((weak)); - -namespace nix { - -RegisterCommand::Commands * RegisterCommand::commands = nullptr; - -nix::Commands RegisterCommand::getCommandsFor(const std::vector<std::string> & prefix) -{ - nix::Commands res; - for (auto & [name, command] : *RegisterCommand::commands) - if (name.size() == prefix.size() + 1) { - bool equal = true; - for (size_t i = 0; i < prefix.size(); ++i) - if (name[i] != prefix[i]) equal = false; - if (equal) - res.insert_or_assign(name[prefix.size()], command); - } - return res; -} - -nlohmann::json NixMultiCommand::toJSON() -{ - // FIXME: use Command::toJSON() as well. - return MultiCommand::toJSON(); -} - -StoreCommand::StoreCommand() -{ -} - -ref<Store> StoreCommand::getStore() -{ - if (!_store) - _store = createStore(); - return ref<Store>(_store); -} - -ref<Store> StoreCommand::createStore() -{ - return openStore(); -} - -void StoreCommand::run() -{ - run(getStore()); -} - -StorePathsCommand::StorePathsCommand(bool recursive) - : recursive(recursive) -{ - if (recursive) - addFlag({ - .longName = "no-recursive", - .description = "Apply operation to specified paths only.", - .category = installablesCategory, - .handler = {&this->recursive, false}, - }); - else - addFlag({ - .longName = "recursive", - .shortName = 'r', - .description = "Apply operation to closure of the specified paths.", - .category = installablesCategory, - .handler = {&this->recursive, true}, - }); - - addFlag({ - .longName = "all", - .description = "Apply the operation to every store path.", - .category = installablesCategory, - .handler = {&all, true}, - }); -} - -void StorePathsCommand::run(ref<Store> store) -{ - StorePaths storePaths; - - if (all) { - if (installables.size()) - throw UsageError("'--all' does not expect arguments"); - for (auto & p : store->queryAllValidPaths()) - storePaths.push_back(p); - } - - else { - for (auto & p : toStorePaths(store, realiseMode, operateOn, installables)) - storePaths.push_back(p); - - if (recursive) { - StorePathSet closure; - store->computeFSClosure(StorePathSet(storePaths.begin(), storePaths.end()), closure, false, false); - storePaths.clear(); - for (auto & p : closure) - storePaths.push_back(p); - } - } - - run(store, std::move(storePaths)); -} - -void StorePathCommand::run(ref<Store> store) -{ - auto storePaths = toStorePaths(store, Realise::Nothing, operateOn, installables); - - if (storePaths.size() != 1) - throw UsageError("this command requires exactly one store path"); - - run(store, *storePaths.begin()); -} - -Strings editorFor(const Pos & pos) -{ - auto editor = getEnv("EDITOR").value_or("cat"); - 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; -} - -MixProfile::MixProfile() -{ - addFlag({ - .longName = "profile", - .description = "The profile to update.", - .labels = {"path"}, - .handler = {&profile}, - .completer = completePath - }); -} - -void MixProfile::updateProfile(const StorePath & storePath) -{ - if (!profile) return; - auto store = getStore().dynamic_pointer_cast<LocalFSStore>(); - if (!store) throw Error("'--profile' is not supported for this Nix store"); - auto profile2 = absPath(*profile); - switchLink(profile2, - createGeneration( - ref<LocalFSStore>(store), - profile2, storePath)); -} - -void MixProfile::updateProfile(const Buildables & buildables) -{ - if (!profile) return; - - std::vector<StorePath> result; - - for (auto & buildable : buildables) { - std::visit(overloaded { - [&](BuildableOpaque bo) { - result.push_back(bo.path); - }, - [&](BuildableFromDrv bfd) { - for (auto & output : bfd.outputs) { - /* Output path should be known because we just tried to - build it. */ - assert(output.second); - result.push_back(*output.second); - } - }, - }, buildable); - } - - if (result.size() != 1) - throw Error("'--profile' requires that the arguments produce a single store path, but there are %d", result.size()); - - updateProfile(result[0]); -} - -MixDefaultProfile::MixDefaultProfile() -{ - profile = getDefaultProfile(); -} - -MixEnvironment::MixEnvironment() : ignoreEnvironment(false) -{ - addFlag({ - .longName = "ignore-environment", - .shortName = 'i', - .description = "Clear the entire environment (except those specified with `--keep`).", - .handler = {&ignoreEnvironment, true}, - }); - - addFlag({ - .longName = "keep", - .shortName = 'k', - .description = "Keep the environment variable *name*.", - .labels = {"name"}, - .handler = {[&](std::string s) { keep.insert(s); }}, - }); - - addFlag({ - .longName = "unset", - .shortName = 'u', - .description = "Unset the environment variable *name*.", - .labels = {"name"}, - .handler = {[&](std::string s) { unset.insert(s); }}, - }); -} - -void MixEnvironment::setEnviron() { - if (ignoreEnvironment) { - if (!unset.empty()) - throw UsageError("--unset does not make sense with --ignore-environment"); - - for (const auto & var : keep) { - auto val = getenv(var.c_str()); - if (val) stringsEnv.emplace_back(fmt("%s=%s", var.c_str(), val)); - } - - vectorEnv = stringsToCharPtrs(stringsEnv); - environ = vectorEnv.data(); - } else { - if (!keep.empty()) - throw UsageError("--keep does not make sense without --ignore-environment"); - - for (const auto & var : unset) - unsetenv(var.c_str()); - } -} - -} |