54 lines
2.3 KiB
Python
54 lines
2.3 KiB
Python
|
"""FindBugsExcluder.py
|
||
|
Creates a filter file from the xml and text output of FindBugs
|
||
|
To prepare, you must run
|
||
|
findbugs -textui . > findbugs.txt
|
||
|
findbugs -textui -xml . > findbugs.xml
|
||
|
Once you've run this program you can then run
|
||
|
findbugs -textui -exclude FindBugsFilter-auto.xml .
|
||
|
To exclude the bugs that have been discovered.
|
||
|
|
||
|
The program includes the suggested changes with each exclusion,
|
||
|
so you can go through FindBugsFilter-auto.xml and decide
|
||
|
to fix things and remove their "Match" nodes.
|
||
|
"""
|
||
|
from xml.dom.minidom import parse
|
||
|
import xml.dom
|
||
|
import os, sys, re, pprint
|
||
|
|
||
|
xml_buglist = 'findbugs.xml' #'D:\\aaa-TIJ4\\code\\findbugs.xml'
|
||
|
text_buglist = 'findbugs.txt' # 'D:\\aaa-TIJ4\\code\\findbugs.txt'
|
||
|
findbugs_filter = 'FindBugsFilter-auto.xml' # 'D:\\aaa-TIJ4\\code\\FindBugsFilter-auto.xml'
|
||
|
|
||
|
def main():
|
||
|
textbugs = [bug.split(':', 1) for bug in file(text_buglist)
|
||
|
if bug.startswith("M ") or bug.startswith("H ")]
|
||
|
textbugs = [(bug[0].split()[2], bug[1].strip()) for bug in textbugs]
|
||
|
dom1 = parse(xml_buglist)
|
||
|
dom2 = xml.dom.getDOMImplementation().createDocument(
|
||
|
None, "FindBugsFilter", None)
|
||
|
bugsDone = []
|
||
|
for bugNode in [bug for bug in dom1.firstChild.childNodes
|
||
|
if bug.nodeName == "BugInstance"]:
|
||
|
for child in bugNode.childNodes:
|
||
|
if child.nodeName == "Class":
|
||
|
classname = child.attributes.item(0).value
|
||
|
bugtype = bugNode.attributes.item(2).value
|
||
|
if (bugtype, classname) in bugsDone:
|
||
|
continue
|
||
|
else:
|
||
|
bugsDone.append((bugtype, classname))
|
||
|
match = dom2.createElement("Match")
|
||
|
match.setAttribute("class", classname)
|
||
|
bugCode = dom2.createElement("BugCode")
|
||
|
bugCode.setAttribute("name", bugtype)
|
||
|
match.appendChild(bugCode)
|
||
|
for textbug in textbugs:
|
||
|
if textbug[0] == bugtype and classname in textbug[1]:
|
||
|
match.appendChild(dom2.createComment(textbug[1]))
|
||
|
dom2.documentElement.appendChild(match)
|
||
|
break # out of inner for loop
|
||
|
file(findbugs_filter, 'w').write(dom2.toprettyxml(' ', '\n'))
|
||
|
|
||
|
if __name__ == "__main__": main()
|
||
|
|