Skip to content

Commit ec64fd9

Browse files
committed
fixed #14208 - read custom manual URL from cppcheck.cfg
1 parent b933258 commit ec64fd9

File tree

6 files changed

+37
-12
lines changed

6 files changed

+37
-12
lines changed

cli/cmdlineparser.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1702,11 +1702,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
17021702

17031703
void CmdLineParser::printHelp(bool premium) const
17041704
{
1705-
// TODO: fetch URL from config like product name?
1706-
const std::string manualUrl(premium ?
1707-
"https://files.cppchecksolutions.com/manual.pdf" :
1708-
"https://cppcheck.sourceforge.io/manual.pdf");
1709-
17101705
std::ostringstream oss;
17111706
// TODO: display product name
17121707
oss << "Cppcheck - A tool for static C/C++ code analysis\n"
@@ -2077,7 +2072,7 @@ void CmdLineParser::printHelp(bool premium) const
20772072
" cppcheck -I inc1/ -I inc2/ f.cpp\n"
20782073
"\n"
20792074
"For more information:\n"
2080-
" " << manualUrl << "\n"
2075+
" " << mSettings.manualUrl << "\n"
20812076
"\n"
20822077
"Many thanks to the 3rd party libraries we use:\n"
20832078
" * tinyxml2 -- loading project/library/ctu files.\n"

lib/settings.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,15 @@ std::string Settings::loadCppcheckCfg(Settings& settings, Suppressions& suppress
117117
settings.cppcheckCfgProductName = v.get<std::string>();
118118
}
119119
}
120+
{
121+
const auto it = utils::as_const(obj).find("manualUrl");
122+
if (it != obj.cend()) {
123+
const auto& v = it->second;
124+
if (!v.is<std::string>())
125+
return "'manualUrl' is not a string";
126+
settings.manualUrl = v.get<std::string>();
127+
}
128+
}
120129
{
121130
const auto it = utils::as_const(obj).find("about");
122131
if (it != obj.cend()) {

lib/settings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ class CPPCHECKLIB WARN_UNUSED Settings {
291291
int loadAverage{};
292292
#endif
293293

294+
std::string manualUrl{"https://cppcheck.sourceforge.io/manual.pdf"};
295+
294296
/** --max-configs value */
295297
int maxConfigsOption = 0; // "Not Assigned" value
296298

test/cli/premium_test.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ def __copy_cppcheck_premium(tmpdir):
2929
"addons": [],
3030
"productName": "NAME",
3131
"about": "NAME",
32+
"manualUrl" : "https://files.cppchecksolutions.com/manual.pdf",
3233
"safety": true
3334
}
3435
""".replace('NAME', __PRODUCT_NAME))

test/testcmdlineparser.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -551,15 +551,16 @@ class TestCmdlineParser : public TestFixture {
551551
REDIRECT;
552552
ScopedFile file(Path::join(Path::getPathFromFilename(Path::getCurrentExecutablePath("")), "cppcheck.cfg"),
553553
"{\n"
554-
"\"productName\": \"Cppcheck Premium\""
554+
"\"productName\": \"Cppcheck Premium\","
555+
"\"manualUrl\": \"https://docs.notcppcheck.com/manual.pdf\""
555556
"}\n");
556557
const char * const argv[] = {"cppcheck"};
557558
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Exit, parseFromArgs(argv));
558559
ASSERT_EQUALS(1, settings->settingsFiles.size());
559560
ASSERT_EQUALS(file.path(), *settings->settingsFiles.cbegin());
560561
const std::string log_str = logger->str();
561562
ASSERT_MSG(startsWith(log_str, "Cppcheck - A tool for static C/C++ code analysis"), "header");
562-
ASSERT_MSG(log_str.find("https://files.cppchecksolutions.com/manual.pdf") != std::string::npos, "help url");
563+
ASSERT_MSG(log_str.find("https://docs.notcppcheck.com/manual.pdf") != std::string::npos, "help url");
563564
}
564565

565566
void nooptionsWithInvalidCfg() {
@@ -589,15 +590,16 @@ class TestCmdlineParser : public TestFixture {
589590
REDIRECT;
590591
ScopedFile file(Path::join(Path::getPathFromFilename(Path::getCurrentExecutablePath("")), "cppcheck.cfg"),
591592
"{\n"
592-
"\"productName\": \"Cppcheck Premium\""
593+
"\"productName\": \"Cppcheck Premium\","
594+
"\"manualUrl\": \"https://docs.notcppcheck.com/manual.pdf\""
593595
"}\n");
594596
const char * const argv[] = {"cppcheck", "-h"};
595597
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Exit, parseFromArgs(argv));
596598
ASSERT_EQUALS(1, settings->settingsFiles.size());
597599
ASSERT_EQUALS(file.path(), *settings->settingsFiles.cbegin());
598600
const std::string log_str = logger->str();
599601
ASSERT_MSG(startsWith(log_str, "Cppcheck - A tool for static C/C++ code analysis"), "header");
600-
ASSERT_MSG(log_str.find("https://files.cppchecksolutions.com/manual.pdf") != std::string::npos, "help url");
602+
ASSERT_MSG(log_str.find("https://docs.notcppcheck.com/manual.pdf") != std::string::npos, "help url");
601603
}
602604

603605
void helplong() {
@@ -618,15 +620,16 @@ class TestCmdlineParser : public TestFixture {
618620
REDIRECT;
619621
ScopedFile file(Path::join(Path::getPathFromFilename(Path::getCurrentExecutablePath("")), "cppcheck.cfg"),
620622
"{\n"
621-
"\"productName\": \"Cppcheck Premium\""
623+
"\"productName\": \"Cppcheck Premium\","
624+
"\"manualUrl\": \"https://docs.notcppcheck.com/manual.pdf\""
622625
"}\n");
623626
const char * const argv[] = {"cppcheck", "--help"};
624627
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Exit, parseFromArgs(argv));
625628
ASSERT_EQUALS(1, settings->settingsFiles.size());
626629
ASSERT_EQUALS(file.path(), *settings->settingsFiles.cbegin());
627630
const std::string log_str = logger->str();
628631
ASSERT_MSG(startsWith(log_str, "Cppcheck - A tool for static C/C++ code analysis"), "header");
629-
ASSERT_MSG(log_str.find("https://files.cppchecksolutions.com/manual.pdf") != std::string::npos, "help url");
632+
ASSERT_MSG(log_str.find("https://docs.notcppcheck.com/manual.pdf") != std::string::npos, "help url");
630633
}
631634

632635
void version() {

test/testsettings.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,21 @@ class TestSettings : public TestFixture {
236236
R"({"suppressions": [1]}\n)");
237237
ASSERT_EQUALS("'suppressions' array entry is not a string", Settings::loadCppcheckCfg(s, supprs));
238238
}
239+
{
240+
Settings s;
241+
Suppressions supprs;
242+
ScopedFile file("cppcheck.cfg",
243+
R"({"manualUrl": "https://docs.notcppcheck.com/manual.pdf"})");
244+
ASSERT_EQUALS("", Settings::loadCppcheckCfg(s, supprs));
245+
ASSERT_EQUALS("https://docs.notcppcheck.com/manual.pdf", s.manualUrl);
246+
}
247+
{
248+
Settings s;
249+
Suppressions supprs;
250+
ScopedFile file("cppcheck.cfg",
251+
R"({"manualUrl": 0}\n)");
252+
ASSERT_EQUALS("'manualUrl' is not a string", Settings::loadCppcheckCfg(s, supprs));
253+
}
239254

240255
// TODO: test with FILESDIR
241256
}

0 commit comments

Comments
 (0)