void verboseHelp() { QString m_verbose = verboseString.trimmed(); m_verbose.replace(QRegExp(" "), ","); m_verbose.remove(QRegExp("^,")); cerr << "Verbose debug levels.\n" "Accepts any combination (separated by comma) of:\n\n"; for (VerboseMap::Iterator vit = verboseMap.begin(); vit != verboseMap.end(); ++vit ) { VerboseDef *item = vit.value(); QString name = QString(" %1").arg(item->name, -15, ' '); cerr << name.toLocal8Bit().constData() << " - " << item->helpText.toLocal8Bit().constData() << endl; } cerr << endl << "The default for this program appears to be: '-v " << m_verbose.toLocal8Bit().constData() << "'\n\n" "Most options are additive except for 'none' and 'all'.\n" "These two are semi-exclusive and take precedence over any\n" "other options. However, you may use something like\n" "'-v none,jobqueue' to receive only JobQueue related messages\n" "and override the default verbosity level.\n\n" "Additive options may also be subtracted from 'all' by\n" "prefixing them with 'no', so you may use '-v all,nodatabase'\n" "to view all but database debug messages.\n\n" "Some debug levels may not apply to this program.\n\n"; }
/// \brief Outputs the Verbose levels and their descriptions /// (for --verbose help) void verboseHelp(void) { QString m_verbose = userDefaultValueStr.trimmed(); m_verbose.replace(QRegExp(" "), ","); m_verbose.remove(QRegExp("^,")); cerr << "Verbose debug levels.\n" "Accepts any combination (separated by comma) of:\n\n"; for (VerboseMap::Iterator vit = verboseMap.begin(); vit != verboseMap.end(); ++vit ) { VerboseDef *item = vit.value(); QString name = QString(" %1").arg(item->name, -15, ' '); if (item->helpText.isEmpty()) continue; cerr << name.toLocal8Bit().constData() << " - " << item->helpText.toLocal8Bit().constData() << endl; } cerr << endl << "The default for this program appears to be: '-v " << m_verbose.toLocal8Bit().constData() << "'\n\n" "Most options are additive except for 'none' and 'all'.\n" "These two are semi-exclusive and take precedence over any\n" "other options. However, you may use something like\n" "'-v none,jobqueue' to receive only JobQueue related messages\n" "and override the default verbosity level.\n\n" "Additive options may also be subtracted from 'all' by\n" "prefixing them with 'no', so you may use '-v all,nodatabase'\n" "to view all but database debug messages.\n\n"; cerr << "The 'global' loglevel is specified with --loglevel, but can be\n" << "overridden on a component by component basis by appending " << "':level'\n" << "to the component.\n" << " For example: -v gui:debug,channel:notice,record\n\n"; cerr << "Some debug levels may not apply to this program.\n" << endl; }
/// \brief Add a verbose level to the verboseMap. Done at initialization. /// \param mask verbose mask (VB_*) /// \param name name of the verbosity level /// \param additive true if this is to be ORed with other masks. false if /// is will clear the other bits. /// \param helptext Descriptive text for --verbose help output void verboseAdd(uint64_t mask, QString name, bool additive, QString helptext) { VerboseDef *item = new VerboseDef; item->mask = mask; name.detach(); // VB_GENERAL -> general name.remove(0, 3); name = name.toLower(); item->name = name; item->additive = additive; helptext.detach(); item->helpText = helptext; verboseMap.insert(name, item); }
/// \brief Initialize the logging levels and verbose levels. void verboseInit(void) { QMutexLocker locker(&verboseMapMutex); QMutexLocker locker2(&loglevelMapMutex); verboseMap.clear(); loglevelMap.clear(); // This looks funky, so I'll put some explanation here. The verbosedefs.h // file gets included as part of the mythlogging.h include, and at that // time, the normal (without _IMPLEMENT_VERBOSE defined) code case will // define the VerboseMask enum. At this point, we force it to allow us // to include the file again, but with _IMPLEMENT_VERBOSE set so that the // single definition of the VB_* values can be shared to define also the // contents of verboseMap, via repeated calls to verboseAdd() #undef VERBOSEDEFS_H_ #define _IMPLEMENT_VERBOSE #include "verbosedefs.h" verboseInitialized = true; }
/// \brief Parse the --verbose commandline argument and set the verbose level /// \param arg the commandline argument following "--verbose" /// \return an exit code. GENERIC_EXIT_OK if all is well. int verboseArgParse(QString arg) { QString option; int idx; if (!verboseInitialized) verboseInit(); QMutexLocker locker(&verboseMapMutex); verboseMask = verboseDefaultInt; verboseString = QString(verboseDefaultStr); if (arg.startsWith('-')) { cerr << "Invalid or missing argument to -v/--verbose option\n"; return GENERIC_EXIT_INVALID_CMDLINE; } QStringList verboseOpts = arg.split(QRegExp("[^\\w:]+", Qt::CaseInsensitive, QRegExp::RegExp2)); for (QStringList::Iterator it = verboseOpts.begin(); it != verboseOpts.end(); ++it ) { option = (*it).toLower(); bool reverseOption = false; QString optionLevel; if (option != "none" && option.startsWith("no")) { reverseOption = true; option = option.right(option.length() - 2); } if (option == "help") { verboseHelp(); return GENERIC_EXIT_INVALID_CMDLINE; } else if (option == "important") { cerr << "The \"important\" log mask is no longer valid.\n"; } else if (option == "extra") { cerr << "The \"extra\" log mask is no longer valid. Please try " "--loglevel debug instead.\n"; } else if (option == "default") { if (haveUserDefaultValues) { verboseMask = userDefaultValueInt; verboseString = userDefaultValueStr; } else { verboseMask = verboseDefaultInt; verboseString = QString(verboseDefaultStr); } } else { if ((idx = option.indexOf(':')) != -1) { optionLevel = option.mid(idx + 1); option = option.left(idx); } VerboseDef *item = verboseMap.value(option); if (item) { if (reverseOption) { verboseMask &= ~(item->mask); verboseString = verboseString.remove(' ' + item->name); verboseString += " no" + item->name; } else { if (item->additive) { if (!(verboseMask & item->mask)) { verboseMask |= item->mask; verboseString += ' ' + item->name; } } else { verboseMask = item->mask; verboseString = item->name; } if (!optionLevel.isEmpty()) { LogLevel_t level = logLevelGet(optionLevel); if (level != LOG_UNKNOWN) componentLogLevel[item->mask] = level; } } } else { cerr << "Unknown argument for -v/--verbose: " << option.toLocal8Bit().constData() << endl;; return GENERIC_EXIT_INVALID_CMDLINE; } } } if (!haveUserDefaultValues) { haveUserDefaultValues = true; userDefaultValueInt = verboseMask; userDefaultValueStr = verboseString; } return GENERIC_EXIT_OK; }
int verboseArgParse(QString arg) { QString option; if (!verboseInitialized) verboseInit(); QMutexLocker locker(&verboseMapMutex); verboseMask = verboseDefaultInt; verboseString = QString(verboseDefaultStr); if (arg.startsWith('-')) { cerr << "Invalid or missing argument to -v/--verbose option\n"; return GENERIC_EXIT_INVALID_CMDLINE; } QStringList verboseOpts = arg.split(QRegExp("\\W+")); for (QStringList::Iterator it = verboseOpts.begin(); it != verboseOpts.end(); ++it ) { option = (*it).toLower(); bool reverseOption = false; if (option != "none" && option.left(2) == "no") { reverseOption = true; option = option.right(option.length() - 2); } if (option == "help") { verboseHelp(); return GENERIC_EXIT_INVALID_CMDLINE; } else if (option == "important") { cerr << "The \"important\" log mask is no longer valid.\n"; } else if (option == "extra") { cerr << "The \"extra\" log mask is no longer valid. Please try --loglevel debug instead.\n"; } else if (option == "default") { if (haveUserDefaultValues) { verboseMask = userDefaultValueInt; verboseString = userDefaultValueStr; } else { verboseMask = verboseDefaultInt; verboseString = QString(verboseDefaultStr); } } else { VerboseDef *item = verboseMap.value(option); if (item) { if (reverseOption) { verboseMask &= ~(item->mask); verboseString = verboseString.remove(' ' + item->name); verboseString += " no" + item->name; } else { if (item->additive) { if (!(verboseMask & item->mask)) { verboseMask |= item->mask; verboseString += ' ' + item->name; } } else { verboseMask = item->mask; verboseString = item->name; } } } else { cerr << "Unknown argument for -v/--verbose: " << option.toLocal8Bit().constData() << endl;; return GENERIC_EXIT_INVALID_CMDLINE; } } } if (!haveUserDefaultValues) { haveUserDefaultValues = true; userDefaultValueInt = verboseMask; userDefaultValueStr = verboseString; } return GENERIC_EXIT_OK; }