diff options
author | Karel Klic <kklic@redhat.com> | 2010-02-15 15:07:24 +0100 |
---|---|---|
committer | Karel Klic <kklic@redhat.com> | 2010-02-15 15:07:24 +0100 |
commit | ba32bbb864eec78e0d17f5a75fc3a58d5762d04a (patch) | |
tree | 529f7b142d1c727eeff82494ba0c04796cf9b30e | |
parent | 55ef6d8102047344f170dcb1202a117302ae3768 (diff) | |
download | abrt-ba32bbb864eec78e0d17f5a75fc3a58d5762d04a.tar.gz abrt-ba32bbb864eec78e0d17f5a75fc3a58d5762d04a.tar.xz abrt-ba32bbb864eec78e0d17f5a75fc3a58d5762d04a.zip |
Added option to close bugs recognized as a duplicate: --close
-rwxr-xr-x | src/Backtrace/abrt-bz-dupchecker | 79 |
1 files changed, 59 insertions, 20 deletions
diff --git a/src/Backtrace/abrt-bz-dupchecker b/src/Backtrace/abrt-bz-dupchecker index d7798ac..dc2ef8e 100755 --- a/src/Backtrace/abrt-bz-dupchecker +++ b/src/Backtrace/abrt-bz-dupchecker @@ -33,10 +33,12 @@ 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", +parser.add_option("-b", "--bugzilla", dest="bugzilla", default="https://bugzilla.redhat.com/xmlrpc.cgi", help="Bugzilla URL (defaults to Red Hat Bugzilla)", metavar="URL") parser.add_option("-v", "--verbose", dest="verbose", help="Detailed output") +parser.add_option("-c", "--close", help="Close some of the bugs in Bugzilla (DANGEROUS)", + action="store_true", default=False, dest="close") parser.add_option("-i", "--wiki", help="Generate output in wiki syntax", action="store_true", default=False, dest="wiki") @@ -48,9 +50,6 @@ if not options.user or len(options.user) == 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) @@ -155,8 +154,6 @@ for buginfo in buginfos: else: database[backtrace] = { buginfo.component: [ bugitem ] } -bz.logout() - # The number of duplicates. dupcount = 0 # The number of duplicates that can be closed. @@ -168,26 +165,67 @@ for backtrace, components in database.items(): map(lambda x: x["comments"], bugitems))), len(bugitems) - 1) - + +# Get the component owner. # Sort the duplicates by the component owner, and # filter out those which should not be printed. dups = [] for backtrace, components in database.items(): for component, bugitems in components.items(): - if len(bugitems) > 1: - # Get the component owner - owner = "Failed to get component owner" - try: - component_info = json.load(urllib.urlopen("https://admin.fedoraproject.org/pkgdb/packages/name/{0}?tg_format=json".format(component))) - component_packages = component_info['packageListings'] - component_f12 = filter(lambda x:x["collection"]["version"]=="12", component_packages) - if len(component_f12) == 1: - owner = component_f12[0]["owner"] - except KeyError: - pass + if len(bugitems) <= 1: + continue + + # Get the component owner + owner = "Failed to get component owner" + try: + component_info = json.load(urllib.urlopen("https://admin.fedoraproject.org/pkgdb/packages/name/{0}?tg_format=json".format(component))) + component_packages = component_info['packageListings'] + component_f12 = filter(lambda x:x["collection"]["version"]=="12", component_packages) + if len(component_f12) == 1: + owner = component_f12[0]["owner"] + except KeyError: + pass - dups.append((component, owner, bugitems, backtrace)) - print ".", + dups.append((component, owner, bugitems, backtrace)) + print "." + +# Close all bugs where it is appropriate. +if options.close: + for (component, owner, bugitems, backtrace) in dups: + # Find the master bug item + # Its the one with the most comments. + + # Sort function sorting by comment count. + def commentCmp(x, y): + if x['comments'] < y['comments']: + return 1 + elif x['comments'] == y['comments']: + # Sort by bug id, older bugs should became the master bug + if x['id'] > y['id']: + return 1 + elif x['id'] == y['id']: + return 0 + else: + return -1 + else: + return -1 + + sorteditems = sorted(bugitems, commentCmp) + + master = sorteditems[0] + for item in sorteditems[1:]: + if item['comments'] > 2: + continue + + print "Closing bug #{0} with {1} comments as a duplicate of #{2}.".format(item['id'], item['comments'], master['id']) + bug = bz.getbug(int(item['id'])) + bug.close("DUPLICATE", int(master['id']), "", + "This bug appears to have been filled using a buggy version of ABRT, because\n" + + "it contains a backtrace which is considered as a duplicate of the backtrace in #{0}." + + "Sorry for the inconvenience.\n\n" + + "Closing as a duplicate of #{0}.".format(master['id'])) + +bz.logout() print print "SUMMARY" @@ -204,6 +242,7 @@ def cmp(x, y): return 0 else: return 1 + for (component, owner, bugitems, backtrace) in sorted(dups, cmp): if options.wiki: print "----" |