diff options
author | Karel Klic <kklic@redhat.com> | 2009-12-18 20:33:02 +0100 |
---|---|---|
committer | Karel Klic <kklic@redhat.com> | 2009-12-18 20:33:02 +0100 |
commit | 2cfddd54ec87cb5d4056ec1ea553b4bcbc1a369a (patch) | |
tree | 681c266a32d8b1a1611f096389bd8aad38d1fc7c /src/Backtrace | |
parent | 0f38e4bb86bbece5e1aeda3a805ea8d577ac1c88 (diff) | |
download | abrt-2cfddd54ec87cb5d4056ec1ea553b4bcbc1a369a.tar.gz abrt-2cfddd54ec87cb5d4056ec1ea553b4bcbc1a369a.tar.xz abrt-2cfddd54ec87cb5d4056ec1ea553b4bcbc1a369a.zip |
Bugzilla duplication checker script
Diffstat (limited to 'src/Backtrace')
-rwxr-xr-x | src/Backtrace/abrt-bz-dupchecker | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/Backtrace/abrt-bz-dupchecker b/src/Backtrace/abrt-bz-dupchecker new file mode 100755 index 00000000..f9caeed8 --- /dev/null +++ b/src/Backtrace/abrt-bz-dupchecker @@ -0,0 +1,108 @@ +#!/usr/bin/python +# -*- mode:python -*- + +from bugzilla import RHBugzilla +from optparse import OptionParser +import sys +import os.path +import subprocess + +parser = OptionParser(version="%prog 1.0") +parser.add_option("-u", "--user", dest="user", + help="Bugzilla user name (REQUIRED)", metavar="USERNAME") +parser.add_option("-p", "--password", dest="password", + help="Bugzilla password (REQUIRED)", metavar="PASSWORD") +parser.add_option("-b", "--bugzilla", dest="bugzilla", + help="Bugzilla URL (defaults to Red Hat Bugzilla)", metavar="URL") +parser.add_option("-v", "--verbose", dest="verbose", + help="Detailed output") + +(options, args) = parser.parse_args() + +if not options.user or len(options.user) == 0: + parser.error("User name is required.\nTry {0} --help".format(sys.argv[0])) + +if not options.password or len(options.password) == 0: + parser.error("Password is required.\nTry {0} --help".format(sys.argv[0])) + +if not options.bugzilla or len(options.bugzilla) == 0: + options.bugzilla = "https://bugzilla.redhat.com/xmlrpc.cgi" + +bz = RHBugzilla() +bz.connect(options.bugzilla) +bz.login(options.user, options.password) + +buginfos = bz.query({'status_whiteboard_type':'allwordssubstr','status_whiteboard':'abrt_hash'}) + +print "{0} bugs found.".format(len(buginfos)) + +database = {} + +for buginfo in buginfos: + if not buginfo.bug_status in ["NEW", "ASSIGNED", "MODIFIED", "VERIFIED"]: + if options.verbose: + print "Bug {0} has status {1}, skipping.".format(buginfo.bug_id, buginfo.bug_status) + continue + + # Skip bugs with already downloaded backtraces. + filename = "{0}.bt".format(buginfo.bug_id) + if os.path.isfile(filename): + if options.verbose: + print "Skipping {0} (already exists).".format(filename) + else: + # Get backtrace from bug and store it as a file. + bug = bz.getbug(buginfo.bug_id) + for attachment in bug.attachments: + if attachment['filename'] == 'backtrace': + data = bz.openattachment(attachment['id']) + f = open(filename, 'w') + f.write(data.read()) + f.close() + if options.verbose: + print "Attachment {0} downloaded.".format(filename) + + command = ["/usr/bin/abrt-backtrace"] + command.append(filename) + command.append("--single-thread") + command.append("--frame-depth=5") + command.append("--remove-exit-handlers") + command.append("--remove-noncrash-frames") + + helper = subprocess.Popen(command, stdout=subprocess.PIPE) + out, err = helper.communicate() + helper.wait() + + if helper.returncode != 0: + print "Problems parsing {0}".format(filename) + continue + + # Empty backtrace is provided by Python apps. + if len(out) == 0: + continue + + if out in database: + database[out].append(buginfo.bug_id) + if options.verbose: + print "Duplicate found: {0}".format(database[out]) + print "Backtrace: {0}".format(out) + else: + database[out] = [ buginfo.bug_id ] + +bz.logout() + +print "SUMMARY" +print "==========================================================================" + +# The number of duplicates. +dupcount = 0 +for key, value in database.items(): + if len(value) > 1: + dupcount += len(value) - 1 + +print "Total number of duplicate bugs detected: {0}".format(dupcount) +print "------------------------------" + +for key, value in database.items(): + if len(value) > 1: + print "Duplicates: {0}".format(value) + print "Backtrace: {0}".format(key) |