From b159d23800eec55412621a0b3e6c926a1dbb1755 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 25 Jan 2021 14:38:15 +0100 Subject: Make '--help' do the same as 'help' (i.e. show a manpage) --- src/nix/main.cc | 61 ++++++++++++++++----------------------------------------- 1 file changed, 17 insertions(+), 44 deletions(-) (limited to 'src/nix/main.cc') diff --git a/src/nix/main.cc b/src/nix/main.cc index 80422bd24..77a13c913 100644 --- a/src/nix/main.cc +++ b/src/nix/main.cc @@ -54,6 +54,8 @@ static bool haveInternet() std::string programPath; char * * savedArgv; +struct HelpRequested { }; + struct NixArgs : virtual MultiCommand, virtual MixCommonArgs { bool printBuildLogs = false; @@ -71,22 +73,7 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs addFlag({ .longName = "help", .description = "Show usage information.", - .handler = {[&]() { if (!completions) showHelpAndExit(); }}, - }); - - addFlag({ - .longName = "help-config", - .description = "Show configuration settings.", - .handler = {[&]() { - std::cout << "The following configuration settings are available:\n\n"; - Table2 tbl; - std::map settings; - globalConfig.getSettings(settings); - for (const auto & s : settings) - tbl.emplace_back(s.first, s.second.description); - printTable(std::cout, tbl); - throw Exit(); - }}, + .handler = {[&]() { throw HelpRequested(); }}, }); addFlag({ @@ -154,33 +141,6 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs return pos; } - void printFlags(std::ostream & out) override - { - Args::printFlags(out); - std::cout << - "\n" - "In addition, most configuration settings can be overriden using '--" ANSI_ITALIC "name value" ANSI_NORMAL "'.\n" - "Boolean settings can be overriden using '--" ANSI_ITALIC "name" ANSI_NORMAL "' or '--no-" ANSI_ITALIC "name" ANSI_NORMAL "'. See 'nix\n" - "--help-config' for a list of configuration settings.\n"; - } - - void printHelp(const string & programName, std::ostream & out) override - { - MultiCommand::printHelp(programName, out); - -#if 0 - out << "\nFor full documentation, run 'man " << programName << "' or 'man " << programName << "-" ANSI_ITALIC "COMMAND" ANSI_NORMAL "'.\n"; -#endif - - std::cout << "\nNote: this program is " ANSI_RED "EXPERIMENTAL" ANSI_NORMAL " and subject to change.\n"; - } - - void showHelpAndExit() - { - printHelp(programName, std::cout); - throw Exit(); - } - std::string description() override { return "a tool for reproducible and declarative configuration management"; @@ -298,6 +258,18 @@ void mainWrapped(int argc, char * * argv) try { args.parseCmdline(argvToStrings(argc, argv)); + } catch (HelpRequested &) { + std::vector subcommand; + MultiCommand * command = &args; + while (command) { + if (command && command->command) { + subcommand.push_back(command->command->first); + command = dynamic_cast(&*command->command->second); + } else + break; + } + showHelp(subcommand); + return; } catch (UsageError &) { if (!completions) throw; } @@ -306,7 +278,8 @@ void mainWrapped(int argc, char * * argv) initPlugins(); - if (!args.command) args.showHelpAndExit(); + if (!args.command) + throw UsageError("no subcommand specified"); if (args.command->first != "repl" && args.command->first != "doctor" -- cgit v1.2.3