From be6c09e94a806b1b92e280fbdc67dc26ccc013fb Mon Sep 17 00:00:00 2001 From: firewave Date: Sun, 20 Oct 2024 16:13:15 +0200 Subject: [PATCH] added (undocumented) `--no-cppcheck-build-dir` command-line option to clear previously specified build-dir --- cli/cmdlineparser.cpp | 22 ++++++++++++++++------ test/testcmdlineparser.cpp | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index c5e3946775d..17a56276279 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -530,14 +530,14 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a } else if (std::strncmp(argv[i], "--cppcheck-build-dir=", 21) == 0) { - mSettings.buildDir = Path::fromNativeSeparators(argv[i] + 21); - if (endsWith(mSettings.buildDir, '/')) - mSettings.buildDir.pop_back(); - - if (!Path::isDirectory(mSettings.buildDir)) { - mLogger.printError("Directory '" + mSettings.buildDir + "' specified by --cppcheck-build-dir argument has to be existent."); + std::string path = Path::fromNativeSeparators(argv[i] + 21); + if (path.empty()) { + mLogger.printError("no path has been specified for --cppcheck-build-dir"); return Result::Fail; } + mSettings.buildDir = std::move(path); + if (endsWith(mSettings.buildDir, '/')) + mSettings.buildDir.pop_back(); } else if (std::strcmp(argv[i], "--cpp-header-probe") == 0) { @@ -913,6 +913,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a mSettings.maxCtuDepth = temp; } + // undocumented option for usage in Python tests to indicate that no build dir should be injected + else if (std::strcmp(argv[i], "--no-cppcheck-build-dir") == 0) { + mSettings.buildDir.clear(); + } + else if (std::strcmp(argv[i], "--no-cpp-header-probe") == 0) { mSettings.cppHeaderProbe = false; } @@ -1457,6 +1462,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a return Result::Fail; } + if (!mSettings.buildDir.empty() && !Path::isDirectory(mSettings.buildDir)) { + mLogger.printError("Directory '" + mSettings.buildDir + "' specified by --cppcheck-build-dir argument has to be existent."); + return Result::Fail; + } + // Print error only if we have "real" command and expect files if (mPathNames.empty() && project.guiProject.pathNames.empty() && project.fileSettings.empty()) { // TODO: this message differs from the one reported in fillSettingsFromArgs() diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 96fa60e0954..02d2bbcb5c4 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -436,6 +436,9 @@ class TestCmdlineParser : public TestFixture { TEST_CASE(cppcheckBuildDirExistent); TEST_CASE(cppcheckBuildDirNonExistent); TEST_CASE(cppcheckBuildDirEmpty); + TEST_CASE(cppcheckBuildDirMultiple); + TEST_CASE(noCppcheckBuildDir); + TEST_CASE(noCppcheckBuildDir2); TEST_CASE(invalidCppcheckCfg); } @@ -2962,20 +2965,44 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=.", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS(".", settings->buildDir); } void cppcheckBuildDirNonExistent() { REDIRECT; - const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path"}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(2, argv)); + const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv)); ASSERT_EQUALS("cppcheck: error: Directory 'non-existent-path' specified by --cppcheck-build-dir argument has to be existent.\n", logger->str()); } void cppcheckBuildDirEmpty() { REDIRECT; - const char * const argv[] = {"cppcheck", "--cppcheck-build-dir="}; - ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(2, argv)); - ASSERT_EQUALS("cppcheck: error: Directory '' specified by --cppcheck-build-dir argument has to be existent.\n", logger->str()); + const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS("cppcheck: error: no path has been specified for --cppcheck-build-dir\n", logger->str()); + } + + void cppcheckBuildDirMultiple() { + REDIRECT; + const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path", "--cppcheck-build-dir=.", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); + ASSERT_EQUALS(".", settings->buildDir); + } + + void noCppcheckBuildDir() + { + REDIRECT; + const char * const argv[] = {"cppcheck", "--no-cppcheck-build-dir", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT(settings->buildDir.empty()); + } + + void noCppcheckBuildDir2() + { + REDIRECT; + const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=b1", "--no-cppcheck-build-dir", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); + ASSERT(settings->buildDir.empty()); } void invalidCppcheckCfg() {