diff options
author | dimdim11 <dimdim11@yandex-team.com> | 2023-06-07 00:12:42 +0300 |
---|---|---|
committer | dimdim11 <dimdim11@yandex-team.com> | 2023-06-07 00:12:42 +0300 |
commit | 5dfc708d4bbd53d9fbd627d7753f4c3a27cda532 (patch) | |
tree | e65fa658724da936a59524753686404c0682654d /library/cpp/getopt | |
parent | d7618ef587053f2eb7d20f0b2d89709e69009c1b (diff) | |
download | ydb-5dfc708d4bbd53d9fbd627d7753f4c3a27cda532.tar.gz |
getopt: print help either to Cerr or Cout, configuring by option
Fix arc help output
Diffstat (limited to 'library/cpp/getopt')
-rw-r--r-- | library/cpp/getopt/small/modchooser.cpp | 37 | ||||
-rw-r--r-- | library/cpp/getopt/small/modchooser.h | 17 |
2 files changed, 36 insertions, 18 deletions
diff --git a/library/cpp/getopt/small/modchooser.cpp b/library/cpp/getopt/small/modchooser.cpp index c232857713..bc319089b7 100644 --- a/library/cpp/getopt/small/modchooser.cpp +++ b/library/cpp/getopt/small/modchooser.cpp @@ -5,6 +5,7 @@ #include <library/cpp/colorizer/colors.h> +#include <util/folder/path.h> #include <util/stream/output.h> #include <util/generic/yexception.h> #include <util/generic/ptr.h> @@ -167,7 +168,7 @@ int TModChooser::Run(const int argc, const char** argv) const { TString modeName; if (argc == 1) { if (DefaultMode.empty()) { - PrintHelp(argv[0]); + PrintHelp(argv[0], HelpAlwaysToStdErr); return 0; } else { modeName = DefaultMode; @@ -178,7 +179,7 @@ int TModChooser::Run(const int argc, const char** argv) const { } if (modeName == "-h" || modeName == "--help" || modeName == "-?") { - PrintHelp(argv[0]); + PrintHelp(argv[0], HelpAlwaysToStdErr); return 0; } if (VersionHandler && (modeName == "-v" || modeName == "--version")) { @@ -197,7 +198,7 @@ int TModChooser::Run(const int argc, const char** argv) const { if (modeIter == Modes.end()) { Cerr << "Unknown mode " << modeName.Quote() << "." << Endl; - PrintHelp(argv[0]); + PrintHelp(argv[0], true); return 1; } @@ -274,11 +275,14 @@ TString TModChooser::TMode::FormatFullName(size_t pad) const { return name; } -void TModChooser::PrintHelp(const TString& progName) const { - Cerr << Description << Endl << Endl; - Cerr << NColorizer::StdErr().BoldColor() << "Usage" << NColorizer::StdErr().OldColor() << ": " << progName << " MODE [MODE_OPTIONS]" << Endl; - Cerr << Endl; - Cerr << NColorizer::StdErr().BoldColor() << "Modes" << NColorizer::StdErr().OldColor() << ":" << Endl; +void TModChooser::PrintHelp(const TString& progName, bool toStdErr) const { + auto baseName = TFsPath(progName).Basename(); + auto& out = toStdErr ? Cerr : Cout; + const auto& colors = toStdErr ? NColorizer::StdErr() : NColorizer::StdOut(); + out << Description << Endl << Endl; + out << colors.BoldColor() << "Usage" << colors.OldColor() << ": " << baseName << " MODE [MODE_OPTIONS]" << Endl; + out << Endl; + out << colors.BoldColor() << "Modes" << colors.OldColor() << ":" << Endl; size_t maxModeLen = 0; for (const auto& [name, mode] : Modes) { if (name != mode->Name) @@ -290,10 +294,10 @@ void TModChooser::PrintHelp(const TString& progName) const { for (const auto& unsortedMode : UnsortedModes) if (!unsortedMode->Hidden) { if (unsortedMode->Name.size()) { - Cerr << " " << unsortedMode->FormatFullName(maxModeLen + 4) << unsortedMode->Description << Endl; + out << " " << unsortedMode->FormatFullName(maxModeLen + 4) << unsortedMode->Description << Endl; } else { - Cerr << SeparationString << Endl; - Cerr << unsortedMode->Description << Endl; + out << SeparationString << Endl; + out << unsortedMode->Description << Endl; } } } else { @@ -302,19 +306,18 @@ void TModChooser::PrintHelp(const TString& progName) const { continue; // this is an alias if (!mode.second->Hidden) { - Cerr << " " << mode.second->FormatFullName(maxModeLen + 4) << mode.second->Description << Endl; + out << " " << mode.second->FormatFullName(maxModeLen + 4) << mode.second->Description << Endl; } } } - Cerr << Endl; - Cerr << "To get help for specific mode type '" << progName << " MODE " << ModesHelpOption << "'" << Endl; + out << Endl; + out << "To get help for specific mode type '" << baseName << " MODE " << ModesHelpOption << "'" << Endl; if (VersionHandler) - Cerr << "To print program version type '" << progName << " --version'" << Endl; + out << "To print program version type '" << baseName << " --version'" << Endl; if (!SvnRevisionOptionDisabled) { - Cerr << "To print svn revision type --svnrevision" << Endl; + out << "To print svn revision type '" << baseName << " --svnrevision'" << Endl; } - return; } TVersionHandlerPtr TModChooser::GetVersionHandler() const { diff --git a/library/cpp/getopt/small/modchooser.h b/library/cpp/getopt/small/modchooser.h index 987353e3d1..5ed64310c5 100644 --- a/library/cpp/getopt/small/modchooser.h +++ b/library/cpp/getopt/small/modchooser.h @@ -80,6 +80,11 @@ public: //! Set short command representation in Usage block void SetPrintShortCommandInUsage(bool printShortCommandInUsage); + //! Help can be printed either to stdout and stderr. If set to false, then "--help" will be printed to stdout + void SetHelpAlwaysToStdErr(bool helpAlwaysToStdErr) { + HelpAlwaysToStdErr = helpAlwaysToStdErr; + } + void DisableSvnRevisionOption(); void AddCompletions(TString progName, const TString& name = "completion", bool hidden = false, bool noCompletion = false); @@ -100,7 +105,7 @@ public: //! Run appropriate mode. Same as Run(const int, const char**) int Run(const TVector<TString>& argv) const; - void PrintHelp(const TString& progName) const; + void PrintHelp(const TString& progName, bool toStdErr = false) const; struct TMode { TString Name; @@ -169,6 +174,16 @@ private: //! Mode that generates completions THolder<TMainClass> CompletionsGenerator; + + /*! Help message always output to StdErr + * + * If an error occurs, the help information will be printed to stderr regardless of the settings. + * Setting below for success cases (return code == 0) like "./bin --help". + * In this case by default help will be printed to stderr, + * but it can be overridden by setting "HelpAlwaysToStdErr" to false see SetHelpAlwaysToStdErr() above, + * then help message will be printed to stdout + */ + bool HelpAlwaysToStdErr{true}; }; //! Mode class that allows introspecting its console arguments. |