diff options
author | Pawel Hajdan, Jr <phajdan.jr@gentoo.org> | 2011-11-23 09:57:03 +0100 |
---|---|---|
committer | Pawel Hajdan, Jr <phajdan.jr@gentoo.org> | 2011-11-23 09:57:03 +0100 |
commit | 5a195bce432416b7486ec481d7dbb241c80fc412 (patch) | |
tree | cd7543030807155d4bf4a826ad2685c4cb8f6ebc | |
parent | Automated finding candidates for stabilization. (diff) | |
download | arch-tools-5a195bce432416b7486ec481d7dbb241c80fc412.tar.gz arch-tools-5a195bce432416b7486ec481d7dbb241c80fc412.tar.bz2 arch-tools-5a195bce432416b7486ec481d7dbb241c80fc412.zip |
Automatically file stabilization bugs.
-rwxr-xr-x | stabilization-candidates.py | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/stabilization-candidates.py b/stabilization-candidates.py index 5d0c3f8..696ad9c 100755 --- a/stabilization-candidates.py +++ b/stabilization-candidates.py @@ -5,8 +5,10 @@ import datetime import optparse import os.path +import random import re import subprocess +import urllib import bugz.bugzilla from portage.package.ebuild.getmaskingstatus import getmaskingstatus @@ -21,6 +23,7 @@ if __name__ == "__main__": parser = optparse.OptionParser() parser.add_option("--arch", dest="arch", action="append", help="Gentoo arch to use, e.g. x86, amd64, ... Can be passed multiple times.") parser.add_option("--days", dest="days", type=int, default=30, help="Number of days in the tree after stabilization is possible.") + parser.add_option("-l", "--limit", dest="limit", type="int", default=-1, help="Limit of filed bugs. Default is no limit.") parser.add_option("--repo", dest="repo", help="Path to portage CVS repository") parser.add_option("--category", dest="category", help="Portage category filter (default is all categories)") @@ -37,6 +40,7 @@ if __name__ == "__main__": bugzilla = MyBugz(url) bugzilla.auth() + final_candidates = [] now = datetime.datetime.now() for cp in portage.portdb.cp_all(): if options.category and not cp.startswith(options.category + "/"): @@ -44,6 +48,7 @@ if __name__ == "__main__": best_stable = portage.versions.best(portage.portdb.match(cp)) if not best_stable: continue + print 'Working on %s...' % cp candidates = [] for cpv in portage.portdb.cp_list(cp): # Only consider higher versions than best stable. @@ -58,6 +63,12 @@ if __name__ == "__main__": break if is_unstable: continue + + # Eliminate 'live' packages. Obviously have some false positives, + # but it'd be much worse to miss something. There are variations + # like -r9999 or .9999 in the tree. + if '99' in cpv: + continue # Eliminate hard masked packages among others. if getmaskingstatus(cpv) not in [[u'~%s keyword' % arch] for arch in options.arch]: @@ -77,7 +88,6 @@ if __name__ == "__main__": if not candidates: continue candidates.sort(key=portage.versions.cpv_sort_key()) - print '\t\tWorking on %s. Candidates: %s' % (cp, ', '.join(candidates)) candidates.reverse() best_candidate = None cvs_path = os.path.join(options.repo, cp) @@ -115,8 +125,31 @@ if __name__ == "__main__": continue metadata = MetaDataXML(os.path.join(cvs_path, 'metadata.xml'), '/usr/portage/metadata/herds.xml') + maintainer_split = metadata.format_maintainer_string().split(' ', 1) + maintainer = maintainer_split[0] + if len(maintainer_split) > 1: + other_maintainers = maintainer_split[1].split(',') + else: + other_maintainers = [] + url = 'http://packages.gentoo.org/package/%s?arches=linux' % urllib.quote(cp) + final_candidates.append((best_candidate, url, maintainer, other_maintainers)) - # Spam protection (strip @ and domain name). - maintainer_string = re.sub('@[^\s]*', '', metadata.format_maintainer_string()) - - print (cp, best_stable, best_candidate, maintainer_string) + if options.limit != -1: + final_candidates = random.sample(final_candidates, min(options.limit, len(final_candidates))) + for x in final_candidates: + best_candidate, url, maintainer, other_maintainers = x + description = ('Is it OK to stabilize =%s ?\n\n' % best_candidate + + 'If so, please CC arches and add STABLEREQ keyword.\n\n' + + 'Stabilization of this package has been repoman-checked on the following arches: %s' % ', '.join(options.arch)) + bug_id = bugzilla.post('Gentoo Linux', + 'Keywording and Stabilization', + 'Please stabilize =%s' % best_candidate, + description, + url=url, + assigned_to=maintainer, + cc=other_maintainers, + severity='enhancement') + if bug_id == 0: + print 'Submitting bug for %s failed. :-(' % best_candidate + else: + print 'Submitted bug #%d for %s. ;-)' % (bug_id, best_candidate) |