refs #3450 (CLI --report-progress is currently useless) - added `--report-progress=<val>` to specify interval (#5353)
This commit is contained in:
parent
73b9442edd
commit
0901e496ed
|
@ -764,7 +764,14 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
|
||||||
|
|
||||||
// Report progress
|
// Report progress
|
||||||
else if (std::strcmp(argv[i], "--report-progress") == 0) {
|
else if (std::strcmp(argv[i], "--report-progress") == 0) {
|
||||||
mSettings.reportProgress = true;
|
mSettings.reportProgress = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (std::strncmp(argv[i], "--report-progress=", 18) == 0) {
|
||||||
|
int tmp;
|
||||||
|
if (!parseNumberArg(argv[i], 18, tmp, true))
|
||||||
|
return false;
|
||||||
|
mSettings.reportProgress = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_RULES
|
#ifdef HAVE_RULES
|
||||||
|
@ -1299,7 +1306,7 @@ void CmdLineParser::printHelp()
|
||||||
" using e.g. ~ for home folder does not work. It is\n"
|
" using e.g. ~ for home folder does not work. It is\n"
|
||||||
" currently only possible to apply the base paths to\n"
|
" currently only possible to apply the base paths to\n"
|
||||||
" files that are on a lower level in the directory tree.\n"
|
" files that are on a lower level in the directory tree.\n"
|
||||||
" --report-progress Report progress messages while checking a file.\n"
|
" --report-progress Report progress messages while checking a file (single job only).\n"
|
||||||
#ifdef HAVE_RULES
|
#ifdef HAVE_RULES
|
||||||
" --rule=<rule> Match regular expression.\n"
|
" --rule=<rule> Match regular expression.\n"
|
||||||
" --rule-file=<file> Use given rule file. For more information, see:\n"
|
" --rule-file=<file> Use given rule file. For more information, see:\n"
|
||||||
|
|
|
@ -276,7 +276,7 @@ int CppCheckExecutor::check_internal(CppCheck& cppcheck)
|
||||||
{
|
{
|
||||||
Settings& settings = cppcheck.settings();
|
Settings& settings = cppcheck.settings();
|
||||||
|
|
||||||
if (settings.reportProgress)
|
if (settings.reportProgress >= 0)
|
||||||
mLatestProgressOutputTime = std::time(nullptr);
|
mLatestProgressOutputTime = std::time(nullptr);
|
||||||
|
|
||||||
if (!settings.outputFile.empty()) {
|
if (!settings.outputFile.empty()) {
|
||||||
|
@ -399,6 +399,7 @@ void CppCheckExecutor::reportOut(const std::string &outmsg, Color c)
|
||||||
std::cout << c << ansiToOEM(outmsg, true) << Color::Reset << std::endl;
|
std::cout << c << ansiToOEM(outmsg, true) << Color::Reset << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove filename parameter?
|
||||||
void CppCheckExecutor::reportProgress(const std::string &filename, const char stage[], const std::size_t value)
|
void CppCheckExecutor::reportProgress(const std::string &filename, const char stage[], const std::size_t value)
|
||||||
{
|
{
|
||||||
(void)filename;
|
(void)filename;
|
||||||
|
@ -406,9 +407,10 @@ void CppCheckExecutor::reportProgress(const std::string &filename, const char st
|
||||||
if (!mLatestProgressOutputTime)
|
if (!mLatestProgressOutputTime)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Report progress messages every 10 seconds
|
// Report progress messages every x seconds
|
||||||
const std::time_t currentTime = std::time(nullptr);
|
const std::time_t currentTime = std::time(nullptr);
|
||||||
if (currentTime >= (mLatestProgressOutputTime + 10)) {
|
if (currentTime >= (mLatestProgressOutputTime + mSettings->reportProgress))
|
||||||
|
{
|
||||||
mLatestProgressOutputTime = currentTime;
|
mLatestProgressOutputTime = currentTime;
|
||||||
|
|
||||||
// format a progress message
|
// format a progress message
|
||||||
|
|
|
@ -267,7 +267,7 @@ public:
|
||||||
bool relativePaths{};
|
bool relativePaths{};
|
||||||
|
|
||||||
/** @brief --report-progress */
|
/** @brief --report-progress */
|
||||||
bool reportProgress{};
|
int reportProgress{-1};
|
||||||
|
|
||||||
/** Rule */
|
/** Rule */
|
||||||
struct CPPCHECKLIB Rule {
|
struct CPPCHECKLIB Rule {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import pytest
|
||||||
|
|
||||||
from testutils import cppcheck
|
from testutils import cppcheck
|
||||||
|
|
||||||
|
|
||||||
def __test_missing_include(tmpdir, use_j):
|
def __test_missing_include(tmpdir, use_j):
|
||||||
test_file = os.path.join(tmpdir, 'test.c')
|
test_file = os.path.join(tmpdir, 'test.c')
|
||||||
with open(test_file, 'wt') as f:
|
with open(test_file, 'wt') as f:
|
||||||
|
@ -20,12 +21,15 @@ def __test_missing_include(tmpdir, use_j):
|
||||||
_, _, stderr = cppcheck(args)
|
_, _, stderr = cppcheck(args)
|
||||||
assert stderr == '{}:2:0: information: Include file: "test.h" not found. [missingInclude]\n'.format(test_file)
|
assert stderr == '{}:2:0: information: Include file: "test.h" not found. [missingInclude]\n'.format(test_file)
|
||||||
|
|
||||||
|
|
||||||
def test_missing_include(tmpdir):
|
def test_missing_include(tmpdir):
|
||||||
__test_missing_include(tmpdir, False)
|
__test_missing_include(tmpdir, False)
|
||||||
|
|
||||||
|
|
||||||
def test_missing_include_j(tmpdir): #11283
|
def test_missing_include_j(tmpdir): #11283
|
||||||
__test_missing_include(tmpdir, True)
|
__test_missing_include(tmpdir, True)
|
||||||
|
|
||||||
|
|
||||||
def __test_missing_include_check_config(tmpdir, use_j):
|
def __test_missing_include_check_config(tmpdir, use_j):
|
||||||
test_file = os.path.join(tmpdir, 'test.c')
|
test_file = os.path.join(tmpdir, 'test.c')
|
||||||
with open(test_file, 'wt') as f:
|
with open(test_file, 'wt') as f:
|
||||||
|
@ -41,12 +45,15 @@ def __test_missing_include_check_config(tmpdir, use_j):
|
||||||
_, _, stderr = cppcheck(args.split())
|
_, _, stderr = cppcheck(args.split())
|
||||||
assert stderr == '' # --check-config no longer reports the missing includes
|
assert stderr == '' # --check-config no longer reports the missing includes
|
||||||
|
|
||||||
|
|
||||||
def test_missing_include_check_config(tmpdir):
|
def test_missing_include_check_config(tmpdir):
|
||||||
__test_missing_include_check_config(tmpdir, False)
|
__test_missing_include_check_config(tmpdir, False)
|
||||||
|
|
||||||
|
|
||||||
def test_missing_include_check_config_j(tmpdir):
|
def test_missing_include_check_config_j(tmpdir):
|
||||||
__test_missing_include_check_config(tmpdir, True)
|
__test_missing_include_check_config(tmpdir, True)
|
||||||
|
|
||||||
|
|
||||||
def test_missing_include_inline_suppr(tmpdir):
|
def test_missing_include_inline_suppr(tmpdir):
|
||||||
test_file = os.path.join(tmpdir, 'test.c')
|
test_file = os.path.join(tmpdir, 'test.c')
|
||||||
with open(test_file, 'wt') as f:
|
with open(test_file, 'wt') as f:
|
||||||
|
@ -62,6 +69,7 @@ def test_missing_include_inline_suppr(tmpdir):
|
||||||
_, _, stderr = cppcheck(args)
|
_, _, stderr = cppcheck(args)
|
||||||
assert stderr == ''
|
assert stderr == ''
|
||||||
|
|
||||||
|
|
||||||
def test_invalid_library(tmpdir):
|
def test_invalid_library(tmpdir):
|
||||||
args = ['--library=none', '--library=posix', '--library=none2', '--platform=native', 'file.c']
|
args = ['--library=none', '--library=posix', '--library=none2', '--platform=native', 'file.c']
|
||||||
|
|
||||||
|
@ -83,3 +91,53 @@ def test_message_j(tmpdir):
|
||||||
assert stdout == "Checking {} ...\n".format(test_file) # we were adding stray \0 characters at the end
|
assert stdout == "Checking {} ...\n".format(test_file) # we were adding stray \0 characters at the end
|
||||||
|
|
||||||
# TODO: test missing std.cfg
|
# TODO: test missing std.cfg
|
||||||
|
|
||||||
|
|
||||||
|
def test_progress(tmpdir):
|
||||||
|
test_file = os.path.join(tmpdir, 'test.c')
|
||||||
|
with open(test_file, 'wt') as f:
|
||||||
|
f.write("""
|
||||||
|
int main(int argc)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
args = ['--report-progress=0', '--enable=all', '--inconclusive', '--platform=native', test_file]
|
||||||
|
|
||||||
|
exitcode, stdout, stderr = cppcheck(args)
|
||||||
|
assert exitcode == 0
|
||||||
|
pos = stdout.find('\n')
|
||||||
|
assert(pos != -1)
|
||||||
|
pos += 1
|
||||||
|
assert stdout[:pos] == "Checking {} ...\n".format(test_file)
|
||||||
|
assert (stdout[pos:] ==
|
||||||
|
"progress: Tokenize (typedef) 0%\n"
|
||||||
|
"progress: Tokenize (typedef) 12%\n"
|
||||||
|
"progress: Tokenize (typedef) 25%\n"
|
||||||
|
"progress: Tokenize (typedef) 37%\n"
|
||||||
|
"progress: Tokenize (typedef) 50%\n"
|
||||||
|
"progress: Tokenize (typedef) 62%\n"
|
||||||
|
"progress: Tokenize (typedef) 75%\n"
|
||||||
|
"progress: Tokenize (typedef) 87%\n"
|
||||||
|
"progress: SymbolDatabase 0%\n"
|
||||||
|
"progress: SymbolDatabase 12%\n"
|
||||||
|
"progress: SymbolDatabase 87%\n"
|
||||||
|
)
|
||||||
|
assert stderr == ""
|
||||||
|
|
||||||
|
|
||||||
|
def test_progress_j(tmpdir):
|
||||||
|
test_file = os.path.join(tmpdir, 'test.c')
|
||||||
|
with open(test_file, 'wt') as f:
|
||||||
|
f.write("""
|
||||||
|
int main(int argc)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
args = ['--report-progress=0', '--enable=all', '--inconclusive', '-j2', '--disable=unusedFunction', '--platform=native', test_file]
|
||||||
|
|
||||||
|
exitcode, stdout, stderr = cppcheck(args)
|
||||||
|
assert exitcode == 0
|
||||||
|
assert stdout == "Checking {} ...\n".format(test_file)
|
||||||
|
assert stderr == ""
|
||||||
|
|
|
@ -148,7 +148,11 @@ private:
|
||||||
TEST_CASE(maxConfigsMissingCount);
|
TEST_CASE(maxConfigsMissingCount);
|
||||||
TEST_CASE(maxConfigsInvalid);
|
TEST_CASE(maxConfigsInvalid);
|
||||||
TEST_CASE(maxConfigsTooSmall);
|
TEST_CASE(maxConfigsTooSmall);
|
||||||
TEST_CASE(reportProgressTest); // "Test" suffix to avoid hiding the parent's reportProgress
|
TEST_CASE(reportProgress1);
|
||||||
|
TEST_CASE(reportProgress2);
|
||||||
|
TEST_CASE(reportProgress3);
|
||||||
|
TEST_CASE(reportProgress4);
|
||||||
|
TEST_CASE(reportProgress5);
|
||||||
TEST_CASE(stdc99);
|
TEST_CASE(stdc99);
|
||||||
TEST_CASE(stdcpp11);
|
TEST_CASE(stdcpp11);
|
||||||
TEST_CASE(stdunknown1);
|
TEST_CASE(stdunknown1);
|
||||||
|
@ -1060,12 +1064,46 @@ private:
|
||||||
ASSERT_EQUALS("cppcheck: error: argument to '--max-configs=' must be greater than 0.\n", GET_REDIRECT_OUTPUT);
|
ASSERT_EQUALS("cppcheck: error: argument to '--max-configs=' must be greater than 0.\n", GET_REDIRECT_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void reportProgressTest() {
|
void reportProgress1() {
|
||||||
REDIRECT;
|
REDIRECT;
|
||||||
const char * const argv[] = {"cppcheck", "--report-progress", "file.cpp"};
|
const char * const argv[] = {"cppcheck", "--report-progress", "file.cpp"};
|
||||||
settings->reportProgress = false;
|
settings->reportProgress = -1;
|
||||||
ASSERT(parser->parseFromArgs(3, argv));
|
ASSERT(parser->parseFromArgs(3, argv));
|
||||||
ASSERT(settings->reportProgress);
|
ASSERT_EQUALS(10, settings->reportProgress);
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void reportProgress2() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--report-progress=", "file.cpp"};
|
||||||
|
settings->reportProgress = -1;
|
||||||
|
ASSERT(!parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("cppcheck: error: argument to '--report-progress=' is not valid - not an integer.\n", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void reportProgress3() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--report-progress=-1", "file.cpp"};
|
||||||
|
settings->reportProgress = -1;
|
||||||
|
ASSERT(!parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("cppcheck: error: argument to '--report-progress=' needs to be a positive integer.\n", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void reportProgress4() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--report-progress=0", "file.cpp"};
|
||||||
|
settings->reportProgress = -1;
|
||||||
|
ASSERT(parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS(0, settings->reportProgress);
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void reportProgress5() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--report-progress=1", "file.cpp"};
|
||||||
|
settings->reportProgress = -1;
|
||||||
|
ASSERT(parser->parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS(1, settings->reportProgress);
|
||||||
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue