CmdLineParser: made some options exclusive (#5704)
This commit is contained in:
parent
7e8ea5bcf9
commit
237bed8a91
|
@ -282,6 +282,62 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[])
|
||||||
// TODO: error out on all missing given files/paths
|
// TODO: error out on all missing given files/paths
|
||||||
CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const argv[])
|
CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const argv[])
|
||||||
{
|
{
|
||||||
|
if (argc <= 1) {
|
||||||
|
printHelp();
|
||||||
|
return Result::Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for exclusive options
|
||||||
|
for (int i = 1; i < argc; i++) {
|
||||||
|
// documentation..
|
||||||
|
if (std::strcmp(argv[i], "--doc") == 0) {
|
||||||
|
std::ostringstream doc;
|
||||||
|
// Get documentation..
|
||||||
|
for (const Check * it : Check::instances()) {
|
||||||
|
const std::string& name(it->name());
|
||||||
|
const std::string info(it->classInfo());
|
||||||
|
if (!name.empty() && !info.empty())
|
||||||
|
doc << "## " << name << " ##\n"
|
||||||
|
<< info << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
mLogger.printRaw(doc.str());
|
||||||
|
return Result::Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// print all possible error messages..
|
||||||
|
if (std::strcmp(argv[i], "--errorlist") == 0) {
|
||||||
|
mSettings.loadCppcheckCfg();
|
||||||
|
{
|
||||||
|
XMLErrorMessagesLogger xmlLogger;
|
||||||
|
std::cout << ErrorMessage::getXMLHeader(mSettings.cppcheckCfgProductName);
|
||||||
|
CppCheck::getErrorMessages(xmlLogger);
|
||||||
|
std::cout << ErrorMessage::getXMLFooter() << std::endl;
|
||||||
|
}
|
||||||
|
return Result::Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print help
|
||||||
|
if (std::strcmp(argv[i], "-h") == 0 || std::strcmp(argv[i], "--help") == 0) {
|
||||||
|
printHelp();
|
||||||
|
return Result::Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::strcmp(argv[i], "--version") == 0) {
|
||||||
|
mSettings.loadCppcheckCfg();
|
||||||
|
if (!mSettings.cppcheckCfgProductName.empty()) {
|
||||||
|
mLogger.printRaw(mSettings.cppcheckCfgProductName);
|
||||||
|
} else {
|
||||||
|
const char * const extraVersion = CppCheck::extraVersion();
|
||||||
|
if (*extraVersion != '\0')
|
||||||
|
mLogger.printRaw(std::string("Cppcheck ") + CppCheck::version() + " ("+ extraVersion + ')');
|
||||||
|
else
|
||||||
|
mLogger.printRaw(std::string("Cppcheck ") + CppCheck::version());
|
||||||
|
}
|
||||||
|
return Result::Exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool def = false;
|
bool def = false;
|
||||||
bool maxconfigs = false;
|
bool maxconfigs = false;
|
||||||
|
|
||||||
|
@ -466,23 +522,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// documentation..
|
|
||||||
else if (std::strcmp(argv[i], "--doc") == 0) {
|
|
||||||
// TODO: make an exclusive option
|
|
||||||
std::ostringstream doc;
|
|
||||||
// Get documentation..
|
|
||||||
for (const Check * it : Check::instances()) {
|
|
||||||
const std::string& name(it->name());
|
|
||||||
const std::string info(it->classInfo());
|
|
||||||
if (!name.empty() && !info.empty())
|
|
||||||
doc << "## " << name << " ##\n"
|
|
||||||
<< info << "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
mLogger.printRaw(doc.str());
|
|
||||||
return Result::Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// dump cppcheck data
|
// dump cppcheck data
|
||||||
else if (std::strcmp(argv[i], "--dump") == 0)
|
else if (std::strcmp(argv[i], "--dump") == 0)
|
||||||
mSettings.dump = true;
|
mSettings.dump = true;
|
||||||
|
@ -506,19 +545,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// print all possible error messages..
|
|
||||||
else if (std::strcmp(argv[i], "--errorlist") == 0) {
|
|
||||||
// TODO: make this an exclusive option
|
|
||||||
mSettings.loadCppcheckCfg();
|
|
||||||
{
|
|
||||||
XMLErrorMessagesLogger xmlLogger;
|
|
||||||
std::cout << ErrorMessage::getXMLHeader(mSettings.cppcheckCfgProductName);
|
|
||||||
CppCheck::getErrorMessages(xmlLogger);
|
|
||||||
std::cout << ErrorMessage::getXMLFooter() << std::endl;
|
|
||||||
}
|
|
||||||
return Result::Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --error-exitcode=1
|
// --error-exitcode=1
|
||||||
else if (std::strncmp(argv[i], "--error-exitcode=", 17) == 0) {
|
else if (std::strncmp(argv[i], "--error-exitcode=", 17) == 0) {
|
||||||
if (!parseNumberArg(argv[i], 17, mSettings.exitCode))
|
if (!parseNumberArg(argv[i], 17, mSettings.exitCode))
|
||||||
|
@ -592,13 +618,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
|
||||||
else if (std::strcmp(argv[i], "--funsigned-char") == 0)
|
else if (std::strcmp(argv[i], "--funsigned-char") == 0)
|
||||||
mSettings.platform.defaultSign = 'u';
|
mSettings.platform.defaultSign = 'u';
|
||||||
|
|
||||||
// Print help
|
|
||||||
else if (std::strcmp(argv[i], "-h") == 0 || std::strcmp(argv[i], "--help") == 0) {
|
|
||||||
// TODO: make this an exclusive option
|
|
||||||
printHelp();
|
|
||||||
return Result::Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignored paths
|
// Ignored paths
|
||||||
else if (std::strncmp(argv[i], "-i", 2) == 0) {
|
else if (std::strncmp(argv[i], "-i", 2) == 0) {
|
||||||
std::string path;
|
std::string path;
|
||||||
|
@ -1150,21 +1169,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
|
||||||
else if (std::strcmp(argv[i], "-v") == 0 || std::strcmp(argv[i], "--verbose") == 0)
|
else if (std::strcmp(argv[i], "-v") == 0 || std::strcmp(argv[i], "--verbose") == 0)
|
||||||
mSettings.verbose = true;
|
mSettings.verbose = true;
|
||||||
|
|
||||||
else if (std::strcmp(argv[i], "--version") == 0) {
|
|
||||||
// TODO: make this an exclusive parameter
|
|
||||||
mSettings.loadCppcheckCfg();
|
|
||||||
if (!mSettings.cppcheckCfgProductName.empty()) {
|
|
||||||
mLogger.printRaw(mSettings.cppcheckCfgProductName);
|
|
||||||
} else {
|
|
||||||
const char * const extraVersion = CppCheck::extraVersion();
|
|
||||||
if (*extraVersion != '\0')
|
|
||||||
mLogger.printRaw(std::string("Cppcheck ") + CppCheck::version() + " ("+ extraVersion + ')');
|
|
||||||
else
|
|
||||||
mLogger.printRaw(std::string("Cppcheck ") + CppCheck::version());
|
|
||||||
}
|
|
||||||
return Result::Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write results in results.xml
|
// Write results in results.xml
|
||||||
else if (std::strcmp(argv[i], "--xml") == 0)
|
else if (std::strcmp(argv[i], "--xml") == 0)
|
||||||
mSettings.xml = true;
|
mSettings.xml = true;
|
||||||
|
@ -1226,11 +1230,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
|
||||||
mLogger.printMessage("unusedFunction check can't be used with '-j' option. Disabling unusedFunction check.");
|
mLogger.printMessage("unusedFunction check can't be used with '-j' option. Disabling unusedFunction check.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (argc <= 1) {
|
|
||||||
printHelp();
|
|
||||||
return Result::Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mPathNames.empty() && project.projectType != ImportProject::Type::NONE) {
|
if (!mPathNames.empty() && project.projectType != ImportProject::Type::NONE) {
|
||||||
mLogger.printError("--project cannot be used in conjunction with source files.");
|
mLogger.printError("--project cannot be used in conjunction with source files.");
|
||||||
return Result::Fail;
|
return Result::Fail;
|
||||||
|
|
|
@ -119,9 +119,12 @@ private:
|
||||||
void run() override {
|
void run() override {
|
||||||
TEST_CASE(nooptions);
|
TEST_CASE(nooptions);
|
||||||
TEST_CASE(helpshort);
|
TEST_CASE(helpshort);
|
||||||
|
TEST_CASE(helpshortExclusive);
|
||||||
TEST_CASE(helplong);
|
TEST_CASE(helplong);
|
||||||
|
TEST_CASE(helplongExclusive);
|
||||||
TEST_CASE(version);
|
TEST_CASE(version);
|
||||||
TEST_CASE(versionWithCfg);
|
TEST_CASE(versionWithCfg);
|
||||||
|
TEST_CASE(versionExclusive);
|
||||||
TEST_CASE(onefile);
|
TEST_CASE(onefile);
|
||||||
TEST_CASE(onepath);
|
TEST_CASE(onepath);
|
||||||
TEST_CASE(optionwithoutfile);
|
TEST_CASE(optionwithoutfile);
|
||||||
|
@ -255,6 +258,7 @@ private:
|
||||||
TEST_CASE(xmlverunknown);
|
TEST_CASE(xmlverunknown);
|
||||||
TEST_CASE(xmlverinvalid);
|
TEST_CASE(xmlverinvalid);
|
||||||
TEST_CASE(doc);
|
TEST_CASE(doc);
|
||||||
|
TEST_CASE(docExclusive);
|
||||||
TEST_CASE(showtimeFile);
|
TEST_CASE(showtimeFile);
|
||||||
TEST_CASE(showtimeFileTotal);
|
TEST_CASE(showtimeFileTotal);
|
||||||
TEST_CASE(showtimeTop5);
|
TEST_CASE(showtimeTop5);
|
||||||
|
@ -264,6 +268,7 @@ private:
|
||||||
TEST_CASE(showtimeEmpty);
|
TEST_CASE(showtimeEmpty);
|
||||||
TEST_CASE(showtimeInvalid);
|
TEST_CASE(showtimeInvalid);
|
||||||
TEST_CASE(errorlist);
|
TEST_CASE(errorlist);
|
||||||
|
TEST_CASE(errorlistExclusive);
|
||||||
TEST_CASE(ignorepathsnopath);
|
TEST_CASE(ignorepathsnopath);
|
||||||
#if defined(USE_WINDOWS_SEH) || defined(USE_UNIX_SIGNAL_HANDLING)
|
#if defined(USE_WINDOWS_SEH) || defined(USE_UNIX_SIGNAL_HANDLING)
|
||||||
TEST_CASE(exceptionhandling);
|
TEST_CASE(exceptionhandling);
|
||||||
|
@ -373,6 +378,14 @@ private:
|
||||||
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void helpshortExclusive() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--library=missing", "-h"};
|
||||||
|
ASSERT_EQUALS(CmdLineParser::Result::Exit, parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT(startsWith(logger->str(), "Cppcheck - A tool for static C/C++ code analysis"));
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
void helplong() {
|
void helplong() {
|
||||||
REDIRECT;
|
REDIRECT;
|
||||||
const char * const argv[] = {"cppcheck", "--help"};
|
const char * const argv[] = {"cppcheck", "--help"};
|
||||||
|
@ -381,6 +394,14 @@ private:
|
||||||
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void helplongExclusive() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--library=missing", "--help"};
|
||||||
|
ASSERT_EQUALS(CmdLineParser::Result::Exit, parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT(startsWith(logger->str(), "Cppcheck - A tool for static C/C++ code analysis"));
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
void version() {
|
void version() {
|
||||||
REDIRECT;
|
REDIRECT;
|
||||||
const char * const argv[] = {"cppcheck", "--version"};
|
const char * const argv[] = {"cppcheck", "--version"};
|
||||||
|
@ -402,7 +423,15 @@ private:
|
||||||
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: test extraVersion
|
// TODO: test --version with extraVersion
|
||||||
|
|
||||||
|
void versionExclusive() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--library=missing", "--version"};
|
||||||
|
ASSERT_EQUALS(CmdLineParser::Result::Exit, parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("Cppcheck 2.13 dev\n", logger->str());
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
void onefile() {
|
void onefile() {
|
||||||
REDIRECT;
|
REDIRECT;
|
||||||
|
@ -1577,6 +1606,14 @@ private:
|
||||||
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void docExclusive() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--library=missing", "--doc"};
|
||||||
|
ASSERT_EQUALS(CmdLineParser::Result::Exit, parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT(startsWith(logger->str(), "## "));
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
void showtimeSummary() {
|
void showtimeSummary() {
|
||||||
REDIRECT;
|
REDIRECT;
|
||||||
const char * const argv[] = {"cppcheck", "--showtime=summary", "file.cpp"};
|
const char * const argv[] = {"cppcheck", "--showtime=summary", "file.cpp"};
|
||||||
|
@ -1659,6 +1696,15 @@ private:
|
||||||
|
|
||||||
// TODO: test --errorlist with product name
|
// TODO: test --errorlist with product name
|
||||||
|
|
||||||
|
void errorlistExclusive() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--library=missing", "--errorlist"};
|
||||||
|
ASSERT_EQUALS(CmdLineParser::Result::Exit, parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("", logger->str()); // empty since it is logged via ErrorLogger
|
||||||
|
ASSERT(startsWith(GET_REDIRECT_OUTPUT, "<?xml"));
|
||||||
|
ASSERT(endsWith(GET_REDIRECT_OUTPUT, "</results>\n"));
|
||||||
|
}
|
||||||
|
|
||||||
void ignorepathsnopath() {
|
void ignorepathsnopath() {
|
||||||
REDIRECT;
|
REDIRECT;
|
||||||
const char * const argv[] = {"cppcheck", "-i"};
|
const char * const argv[] = {"cppcheck", "-i"};
|
||||||
|
|
Loading…
Reference in New Issue