From b36f7469533e25e871d618ac1d3434e9c5019424 Mon Sep 17 00:00:00 2001 From: James Laska Date: Fri, 10 Feb 2012 12:33:59 -0500 Subject: Add support to ignore conflicts in specified repos * Accept --repoid and --repofrompath options and pass them directly to repoclosure command. * Specify the bugzilla component to file bugs against * Improve broken, and ignored, dep conflict reporting --- repoclosure-bz | 61 ++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/repoclosure-bz b/repoclosure-bz index 2b50441..6dae4f6 100755 --- a/repoclosure-bz +++ b/repoclosure-bz @@ -14,10 +14,12 @@ import bugzilla # Initial simple logging stuff logging.basicConfig() -log = logging.getLogger("bugzilla") +log = logging.getLogger() if '--debug' in sys.argv: + logging.getLogger("bugzilla").setLevel(logging.DEBUG) log.setLevel(logging.DEBUG) elif '--verbose' in sys.argv: + logging.getLogger("bugzilla").setLevel(logging.INFO) log.setLevel(logging.INFO) default_bz = 'https://bugzilla.redhat.com/xmlrpc.cgi' @@ -214,9 +216,17 @@ def parse_args(): help="URL for existing repoclosure results. When provided, it will" + \ "just process existing results and not re-run repoclosure (useful" + \ "when running multiple times)") - optgrp.add_option('-r', '--repo', action='append', default=[], dest="repos", - help="Repository URL; can be used multiple times (default: use system " + \ - "repos)") + optgrp.add_option('--repoid', action='append', default=[], dest="repoids", + help="specify repo ids to query, can be specified multiple" \ + " times (default is all enabled) ") + optgrp.add_option('--repofrompath', action='append', default=[], dest="repos", + help="specify repoid & paths of additional repositories - " \ + "unique repoid and path required, can be specified " \ + "multiple times. Example. " \ + " --repofrompath=myrepo,/path/to/repo") + optgrp.add_option('--ignoreid', action='append', default=[], dest="ignoreids", + help="specify repo ids to ignore any dependency conflicts (may be used more than once).") + parser.add_option_group(optgrp) # Bugzilla options @@ -225,6 +235,8 @@ def parse_args(): default=[], help="Set blocks field when filing bugs") optgrp.add_option('--product', dest='bz_product', action='store', default='Fedora', help='Bugzilla product (default: %default)') + optgrp.add_option('--component', dest='bz_component', action='store', + default=None, help='Bugzilla component (optional)') optgrp.add_option('--version', dest='bz_version', action='store', default='rawhide', help='Bugzilla version (default: %default)') parser.add_option_group(optgrp) @@ -270,11 +282,10 @@ if __name__ == "__main__": # Build shared repoclosure and repoquery argument string repo_opts = "--tempcache " - count = 1 - for url in opts.repos: - repo_opts += " --repofrompath=repo-%s,%s --repoid=repo-%s" % (count, - url, count) - count += 1 + for repoid in opts.repoids: + repo_opts += " --repoid=%s" % (repoid,) + for rpath in opts.repos: + repo_opts += " --repofrompath=%s" % (rpath,) # Has repoclosure already been run? if opts.logurl: @@ -301,20 +312,33 @@ if __name__ == "__main__": problems = dict() package = "" src = "" + broken_dep_count = 0 + ignore_dep_count = 0 for line in data.split('\n'): log.debug("Parsing line '%s'" % line) - if line.startswith("package:"): - package = re.search("^package: ([^ ]*) from.*", line).group(1) + match = re.search("^package: ([^ ]*) from ([^ ]*)$", line) + if match: + broken_dep_count += 1 + package = match.group(1) + repo = match.group(2) + + # Were we asked to skip packages + if repo in opts.ignoreids: + ignore_dep_count += 1 + log.warn("Ignoring package %s from repo %s" % (package, repo)) + src = "" + continue # Keep track of problems by src-rpm name (not binary) cmd = "repoquery -q --qf %%{sourcerpm},%%{PACKAGER} %s %s" % (repo_opts, package) result = subprocess.Popen(cmd.split(' '), stdout=subprocess.PIPE, stderr=open('/dev/null', 'w')).communicate()[0].strip() + log.debug(cmd) (src, packager) = result.split(',',1) # Ignore anything that isn't packaged by Fedora (e.g. rpmfusion) - if packager != "Fedora Project": + if packager not in ["Fedora Project", "Red Hat, Inc. "]: log.warn("Unsupported packager (%s), skipping '%s'" % (packager, package)) src = "" continue @@ -342,8 +366,8 @@ if __name__ == "__main__": problems[src]['output'].append(line) # Print summary - print "%d dependency problems affecting %s source packages" % \ - (data.count("unresolved deps:"), len(problems.keys())) + print "Found %d dependency problems (ignoring %s) affecting %s source packages" % \ + (broken_dep_count, ignore_dep_count, len(problems.keys())) # Hash the dependency data for (src,problem) in problems.items(): @@ -355,7 +379,10 @@ if __name__ == "__main__": problem['hashes'] = hashes # Strip off the %{version}-%{release}, leaving just %{name} - component = get_package_name(src) + if opts.bz_component is None: + component = get_package_name(src) + else: + component = opts.bz_component # Create a description that consists of the error, and stdout leading up to # it (not full repoclosure stdout) @@ -399,9 +426,9 @@ if __name__ == "__main__": yesno = raw_input("File a new bug (y|n): ").lower() == 'y' if yesno: # File a new bug - b = bz_file_bug(product=opts.product, version=opts.version, + b = bz_file_bug(product=opts.bz_product, version=opts.bz_version, component=component, summary=summary, hashes=hashes, description=description, blocked=opts.blocks) print "Filed new bug: http://%s/%s" % (urlparse.urlparse(default_bz).netloc, str(b.bug_id)) else: - log.warn("Not filing a bug at user request") + log.warn("Not filing bug at user request") -- cgit