Skip to content

Commit 0a8ec90

Browse files
authored
added (undocumented) --no-cppcheck-build-dir command-line option to clear previously specified build-dir (danmar#6942)
1 parent cd0022b commit 0a8ec90

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

cli/cmdlineparser.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -530,14 +530,14 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
530530
}
531531

532532
else if (std::strncmp(argv[i], "--cppcheck-build-dir=", 21) == 0) {
533-
mSettings.buildDir = Path::fromNativeSeparators(argv[i] + 21);
534-
if (endsWith(mSettings.buildDir, '/'))
535-
mSettings.buildDir.pop_back();
536-
537-
if (!Path::isDirectory(mSettings.buildDir)) {
538-
mLogger.printError("Directory '" + mSettings.buildDir + "' specified by --cppcheck-build-dir argument has to be existent.");
533+
std::string path = Path::fromNativeSeparators(argv[i] + 21);
534+
if (path.empty()) {
535+
mLogger.printError("no path has been specified for --cppcheck-build-dir");
539536
return Result::Fail;
540537
}
538+
mSettings.buildDir = std::move(path);
539+
if (endsWith(mSettings.buildDir, '/'))
540+
mSettings.buildDir.pop_back();
541541
}
542542

543543
else if (std::strcmp(argv[i], "--cpp-header-probe") == 0) {
@@ -913,6 +913,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
913913
mSettings.maxCtuDepth = temp;
914914
}
915915

916+
// undocumented option for usage in Python tests to indicate that no build dir should be injected
917+
else if (std::strcmp(argv[i], "--no-cppcheck-build-dir") == 0) {
918+
mSettings.buildDir.clear();
919+
}
920+
916921
else if (std::strcmp(argv[i], "--no-cpp-header-probe") == 0) {
917922
mSettings.cppHeaderProbe = false;
918923
}
@@ -1458,6 +1463,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
14581463
return Result::Fail;
14591464
}
14601465

1466+
if (!mSettings.buildDir.empty() && !Path::isDirectory(mSettings.buildDir)) {
1467+
mLogger.printError("Directory '" + mSettings.buildDir + "' specified by --cppcheck-build-dir argument has to be existent.");
1468+
return Result::Fail;
1469+
}
1470+
14611471
// Print error only if we have "real" command and expect files
14621472
if (mPathNames.empty() && project.guiProject.pathNames.empty() && project.fileSettings.empty()) {
14631473
// TODO: this message differs from the one reported in fillSettingsFromArgs()

test/testcmdlineparser.cpp

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,9 @@ class TestCmdlineParser : public TestFixture {
440440
TEST_CASE(cppcheckBuildDirExistent);
441441
TEST_CASE(cppcheckBuildDirNonExistent);
442442
TEST_CASE(cppcheckBuildDirEmpty);
443+
TEST_CASE(cppcheckBuildDirMultiple);
444+
TEST_CASE(noCppcheckBuildDir);
445+
TEST_CASE(noCppcheckBuildDir2);
443446

444447
TEST_CASE(invalidCppcheckCfg);
445448
}
@@ -2995,20 +2998,44 @@ class TestCmdlineParser : public TestFixture {
29952998
REDIRECT;
29962999
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=.", "file.cpp"};
29973000
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv));
3001+
ASSERT_EQUALS(".", settings->buildDir);
29983002
}
29993003

30003004
void cppcheckBuildDirNonExistent() {
30013005
REDIRECT;
3002-
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path"};
3003-
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(2, argv));
3006+
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path", "file.cpp"};
3007+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv));
30043008
ASSERT_EQUALS("cppcheck: error: Directory 'non-existent-path' specified by --cppcheck-build-dir argument has to be existent.\n", logger->str());
30053009
}
30063010

30073011
void cppcheckBuildDirEmpty() {
30083012
REDIRECT;
3009-
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir="};
3010-
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(2, argv));
3011-
ASSERT_EQUALS("cppcheck: error: Directory '' specified by --cppcheck-build-dir argument has to be existent.\n", logger->str());
3013+
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=", "file.cpp"};
3014+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv));
3015+
ASSERT_EQUALS("cppcheck: error: no path has been specified for --cppcheck-build-dir\n", logger->str());
3016+
}
3017+
3018+
void cppcheckBuildDirMultiple() {
3019+
REDIRECT;
3020+
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=non-existent-path", "--cppcheck-build-dir=.", "file.cpp"};
3021+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
3022+
ASSERT_EQUALS(".", settings->buildDir);
3023+
}
3024+
3025+
void noCppcheckBuildDir()
3026+
{
3027+
REDIRECT;
3028+
const char * const argv[] = {"cppcheck", "--no-cppcheck-build-dir", "file.cpp"};
3029+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv));
3030+
ASSERT(settings->buildDir.empty());
3031+
}
3032+
3033+
void noCppcheckBuildDir2()
3034+
{
3035+
REDIRECT;
3036+
const char * const argv[] = {"cppcheck", "--cppcheck-build-dir=b1", "--no-cppcheck-build-dir", "file.cpp"};
3037+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
3038+
ASSERT(settings->buildDir.empty());
30123039
}
30133040

30143041
void invalidCppcheckCfg() {

0 commit comments

Comments
 (0)