68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
#!/usr/bin/env python
|
|
import sys
|
|
|
|
from bisect_common import *
|
|
|
|
# TODO: detect missing file
|
|
def run(cppcheck_path, options):
|
|
cmd = options.split()
|
|
cmd.insert(0, cppcheck_path)
|
|
print('running {}'.format(cppcheck_path))
|
|
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
|
|
stdout, stderr = p.communicate()
|
|
# only 0 and 1 are well-defined in this case
|
|
if p.returncode > 1:
|
|
print('error')
|
|
return None, None, None
|
|
# signals are reported as negative exitcode (e.g. SIGSEGV -> -11)
|
|
if p.returncode < 0:
|
|
print('crash')
|
|
return p.returncode, stderr, stdout
|
|
print('done')
|
|
return p.returncode, stderr, stdout
|
|
|
|
|
|
# TODO: check arguments
|
|
bisect_path = sys.argv[1]
|
|
options = sys.argv[2]
|
|
expected = None
|
|
if len(sys.argv) == 4:
|
|
expected = sys.argv[3]
|
|
if len(expected) == 0:
|
|
expected = None
|
|
if expected is None:
|
|
if '--error-exitcode=1' not in options:
|
|
options += ' --error-exitcode=1'
|
|
else:
|
|
if '--error-exitcode=0' not in options:
|
|
options += ' --error-exitcode=0'
|
|
|
|
try:
|
|
cppcheck_path = build_cppcheck(bisect_path)
|
|
except Exception as e:
|
|
# TODO: how to persist this so we don't keep compiling these
|
|
print(e)
|
|
sys.exit(EC_SKIP)
|
|
|
|
run_ec, run_stderr, run_stdout = run(cppcheck_path, options)
|
|
|
|
if expected is None:
|
|
print(run_ec)
|
|
print(run_stdout)
|
|
print(run_stderr)
|
|
|
|
# if no ec is set we encountered an unexpected error
|
|
if run_ec is None:
|
|
sys.exit(EC_SKIP) # error occurred
|
|
elif run_ec < 0:
|
|
sys.exit(EC_BAD) # crash occurred
|
|
|
|
# check output for expected string
|
|
if expected is not None:
|
|
if (expected not in run_stderr) and (expected not in run_stdout):
|
|
sys.exit(EC_BAD) # output not found occurred
|
|
|
|
sys.exit(EC_GOOD) # output found
|
|
|
|
sys.exit(run_ec) # return the elapsed time - not a result for bisect
|