2016-02-09 20:28:29 +00:00
|
|
|
#include <algorithm>
|
|
|
|
|
|
|
|
#include "command.hh"
|
|
|
|
#include "common-args.hh"
|
|
|
|
#include "eval.hh"
|
|
|
|
#include "globals.hh"
|
|
|
|
#include "legacy.hh"
|
|
|
|
#include "shared.hh"
|
|
|
|
#include "store-api.hh"
|
2016-04-25 13:26:07 +00:00
|
|
|
#include "progress-bar.hh"
|
2016-02-09 20:28:29 +00:00
|
|
|
|
2017-08-29 11:21:07 +00:00
|
|
|
extern std::string chrootHelperName;
|
|
|
|
|
|
|
|
void chrootHelper(int argc, char * * argv);
|
|
|
|
|
2016-02-09 20:28:29 +00:00
|
|
|
namespace nix {
|
|
|
|
|
|
|
|
struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
|
|
|
{
|
|
|
|
NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix")
|
|
|
|
{
|
2017-07-14 11:44:45 +00:00
|
|
|
mkFlag('h', "help", "show usage information", [&]() { showHelpAndExit(); });
|
2016-02-09 20:28:29 +00:00
|
|
|
|
2017-06-07 14:49:54 +00:00
|
|
|
mkFlag(0, "help-config", "show configuration options", [=]() {
|
|
|
|
std::cout << "The following configuration options are available:\n\n";
|
|
|
|
Table2 tbl;
|
|
|
|
for (const auto & s : settings._getSettings())
|
|
|
|
if (!s.second.isAlias)
|
|
|
|
tbl.emplace_back(s.first, s.second.setting->description);
|
|
|
|
printTable(std::cout, tbl);
|
|
|
|
throw Exit();
|
|
|
|
});
|
|
|
|
|
2016-02-09 20:28:29 +00:00
|
|
|
mkFlag(0, "version", "show version information", std::bind(printVersion, programName));
|
2017-06-07 14:17:17 +00:00
|
|
|
|
2017-06-07 16:41:20 +00:00
|
|
|
std::string cat = "config";
|
|
|
|
settings.convertToArgs(*this, cat);
|
|
|
|
hiddenCategories.insert(cat);
|
2016-02-09 20:28:29 +00:00
|
|
|
}
|
2017-06-07 14:49:54 +00:00
|
|
|
|
|
|
|
void printFlags(std::ostream & out) override
|
|
|
|
{
|
|
|
|
Args::printFlags(out);
|
|
|
|
std::cout <<
|
|
|
|
"\n"
|
2017-07-30 11:27:57 +00:00
|
|
|
"In addition, most configuration settings can be overriden using '--<name> <value>'.\n"
|
|
|
|
"Boolean settings can be overriden using '--<name>' or '--no-<name>'. See 'nix\n"
|
|
|
|
"--help-config' for a list of configuration settings.\n";
|
2017-06-07 14:49:54 +00:00
|
|
|
}
|
2017-07-14 11:44:45 +00:00
|
|
|
|
|
|
|
void showHelpAndExit()
|
|
|
|
{
|
|
|
|
printHelp(programName, std::cout);
|
|
|
|
std::cout << "\nNote: this program is EXPERIMENTAL and subject to change.\n";
|
|
|
|
throw Exit();
|
|
|
|
}
|
2016-02-09 20:28:29 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
void mainWrapped(int argc, char * * argv)
|
|
|
|
{
|
2017-05-16 14:09:57 +00:00
|
|
|
verbosity = lvlError;
|
2016-04-25 16:17:32 +00:00
|
|
|
settings.verboseBuild = false;
|
|
|
|
|
2017-08-29 11:21:07 +00:00
|
|
|
/* The chroot helper needs to be run before any threads have been
|
|
|
|
started. */
|
|
|
|
if (argc > 0 && argv[0] == chrootHelperName) {
|
|
|
|
chrootHelper(argc, argv);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-02-09 20:28:29 +00:00
|
|
|
initNix();
|
|
|
|
initGC();
|
|
|
|
|
|
|
|
string programName = baseNameOf(argv[0]);
|
|
|
|
|
|
|
|
{
|
|
|
|
auto legacy = (*RegisterLegacyCommand::commands)[programName];
|
|
|
|
if (legacy) return legacy(argc, argv);
|
|
|
|
}
|
|
|
|
|
|
|
|
NixArgs args;
|
|
|
|
|
|
|
|
args.parseCmdline(argvToStrings(argc, argv));
|
|
|
|
|
2017-07-14 11:44:45 +00:00
|
|
|
if (!args.command) args.showHelpAndExit();
|
2016-02-09 20:28:29 +00:00
|
|
|
|
2016-04-25 13:26:07 +00:00
|
|
|
StartProgressBar bar;
|
|
|
|
|
2016-02-09 20:28:29 +00:00
|
|
|
args.command->prepare();
|
|
|
|
args.command->run();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char * * argv)
|
|
|
|
{
|
|
|
|
return nix::handleExceptions(argv[0], [&]() {
|
|
|
|
nix::mainWrapped(argc, argv);
|
|
|
|
});
|
|
|
|
}
|