summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xrepoclosure-bz61
1 files 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. <http://bugzilla.redhat.com/bugzilla>"]:
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")