Merge pull request #173 from myint/master
Handle "--xml-version=2" in cppcheck-htmlreport
This commit is contained in:
commit
f5593d5dd9
|
@ -6,6 +6,9 @@ script:
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- make test SRCDIR=build VERIFY=1
|
- make test SRCDIR=build VERIFY=1
|
||||||
- ./cppcheck --error-exitcode=1 -Ilib --enable=style --suppress=duplicateBranch -q cli gui lib -igui/test
|
- ./cppcheck --error-exitcode=1 -Ilib --enable=style --suppress=duplicateBranch -q cli gui lib -igui/test
|
||||||
|
- sudo apt-get update
|
||||||
|
- sudo apt-get install python-pygments
|
||||||
|
- ./htmlreport/test_htmlreport.py
|
||||||
notifications:
|
notifications:
|
||||||
irc:
|
irc:
|
||||||
channels:
|
channels:
|
||||||
|
|
|
@ -166,30 +166,46 @@ class AnnotateCodeFormatter(HtmlFormatter):
|
||||||
|
|
||||||
class CppCheckHandler(XmlContentHandler):
|
class CppCheckHandler(XmlContentHandler):
|
||||||
"""Parses the cppcheck xml file and produces a list of all its errors."""
|
"""Parses the cppcheck xml file and produces a list of all its errors."""
|
||||||
errors = []
|
|
||||||
|
def __init__(self):
|
||||||
|
XmlContentHandler.__init__(self)
|
||||||
|
self.errors = []
|
||||||
|
self.version = "1"
|
||||||
|
|
||||||
def startElement(self, name, attributes):
|
def startElement(self, name, attributes):
|
||||||
|
if name == "results":
|
||||||
|
self.version = attributes.get("version", self.version)
|
||||||
|
|
||||||
|
if self.version == '1':
|
||||||
|
self.handleVersion1(name, attributes)
|
||||||
|
else:
|
||||||
|
self.handleVersion2(name, attributes)
|
||||||
|
|
||||||
|
def handleVersion1(self, name, attributes):
|
||||||
if name != "error":
|
if name != "error":
|
||||||
return
|
return
|
||||||
|
|
||||||
try:
|
self.errors.append({
|
||||||
file = attributes["file"]
|
"file" : attributes.get("file", ""),
|
||||||
line = int(attributes["line"])
|
"line" : int(attributes.get("line"), 0),
|
||||||
except:
|
|
||||||
file = ""
|
|
||||||
line = 0
|
|
||||||
if attributes["id"] != "missingInclude" and attributes["id"] != "toomanyconfigs":
|
|
||||||
sys.stderr.write("ERROR: cppcheck error reported without a file name.\n")
|
|
||||||
|
|
||||||
self.errors.append(
|
|
||||||
{
|
|
||||||
"file" : file,
|
|
||||||
"line" : line,
|
|
||||||
"id" : attributes["id"],
|
"id" : attributes["id"],
|
||||||
"severity" : attributes["severity"],
|
"severity" : attributes["severity"],
|
||||||
"msg" : attributes["msg"]
|
"msg" : attributes["msg"]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
def handleVersion2(self, name, attributes):
|
||||||
|
if name == "error":
|
||||||
|
self.errors.append({
|
||||||
|
"id" : attributes["id"],
|
||||||
|
"severity" : attributes["severity"],
|
||||||
|
"msg" : attributes["msg"]
|
||||||
|
})
|
||||||
|
elif name == "location":
|
||||||
|
assert self.errors
|
||||||
|
self.errors[-1]["file"] = attributes["file"]
|
||||||
|
self.errors[-1]["line"] = int(attributes["line"])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# Configure all the options this little utility is using.
|
# Configure all the options this little utility is using.
|
||||||
parser = optparse.OptionParser()
|
parser = optparse.OptionParser()
|
||||||
|
@ -212,7 +228,7 @@ if __name__ == '__main__':
|
||||||
# Get the stream that we read cppcheck errors from.
|
# Get the stream that we read cppcheck errors from.
|
||||||
stream = sys.stdin
|
stream = sys.stdin
|
||||||
if options.file:
|
if options.file:
|
||||||
if os.path.exists(options.file) == False:
|
if not os.path.exists(options.file):
|
||||||
parser.error("cppcheck xml file: %s not found." % options.file)
|
parser.error("cppcheck xml file: %s not found." % options.file)
|
||||||
stream = open(options.file, "r")
|
stream = open(options.file, "r")
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,14 @@ HTML_REPORT_BIN = os.path.join(os.path.abspath(os.path.dirname(__file__)),
|
||||||
class TestHTMLReport(unittest.TestCase):
|
class TestHTMLReport(unittest.TestCase):
|
||||||
|
|
||||||
def testReportError(self):
|
def testReportError(self):
|
||||||
with runCheck(os.path.join(
|
for xml_version in ['1', '2']:
|
||||||
ROOT_DIR,
|
self.checkReportError(xml_version)
|
||||||
'samples', 'memleak', 'bad.c')) as (report, output_directory):
|
|
||||||
|
def checkReportError(self, xml_version):
|
||||||
|
with runCheck(
|
||||||
|
os.path.join(ROOT_DIR, 'samples', 'memleak', 'bad.c'),
|
||||||
|
xml_version=xml_version
|
||||||
|
) as (report, output_directory):
|
||||||
self.assertIn('<html', report)
|
self.assertIn('<html', report)
|
||||||
|
|
||||||
self.assertIn('Memory leak:', report)
|
self.assertIn('Memory leak:', report)
|
||||||
|
@ -42,9 +47,14 @@ class TestHTMLReport(unittest.TestCase):
|
||||||
self.assertIn('Memory leak:', detail_contents)
|
self.assertIn('Memory leak:', detail_contents)
|
||||||
|
|
||||||
def testReportNoError(self):
|
def testReportNoError(self):
|
||||||
with runCheck(os.path.join(
|
for xml_version in ['1', '2']:
|
||||||
ROOT_DIR,
|
self.checkReportNoError(xml_version)
|
||||||
'samples', 'memleak', 'good.c')) as (report, output_directory):
|
|
||||||
|
def checkReportNoError(self, xml_version):
|
||||||
|
with runCheck(
|
||||||
|
os.path.join(ROOT_DIR, 'samples', 'memleak', 'good.c'),
|
||||||
|
xml_version=xml_version
|
||||||
|
) as (report, output_directory):
|
||||||
self.assertIn('<html', report)
|
self.assertIn('<html', report)
|
||||||
|
|
||||||
self.assertNotIn('Memory leak:', report)
|
self.assertNotIn('Memory leak:', report)
|
||||||
|
@ -55,7 +65,7 @@ class TestHTMLReport(unittest.TestCase):
|
||||||
|
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def runCheck(source_file):
|
def runCheck(source_file, xml_version):
|
||||||
"""Run cppcheck and cppcheck-htmlreport.
|
"""Run cppcheck and cppcheck-htmlreport.
|
||||||
|
|
||||||
Yield a tuple containing the resulting HTML report index and the directory
|
Yield a tuple containing the resulting HTML report index and the directory
|
||||||
|
@ -67,7 +77,8 @@ def runCheck(source_file):
|
||||||
|
|
||||||
with open(xml_filename, 'w') as output_file:
|
with open(xml_filename, 'w') as output_file:
|
||||||
subprocess.check_call(
|
subprocess.check_call(
|
||||||
[CPPCHECK_BIN, '--xml', source_file],
|
[CPPCHECK_BIN, '--xml', source_file,
|
||||||
|
'--xml-version=' + xml_version],
|
||||||
stderr=output_file)
|
stderr=output_file)
|
||||||
|
|
||||||
assert os.path.exists(xml_filename)
|
assert os.path.exists(xml_filename)
|
||||||
|
|
Loading…
Reference in New Issue