[releng] find_unblocked_orphans: Cache complete pkgdb info
Till Maas
till at fedoraproject.org
Sat Oct 18 10:28:33 UTC 2014
commit e6f7b5f47d4019b095d23781fe251d618385544b
Author: Till Maas <opensource at till.name>
Date: Sat Oct 18 10:49:24 2014 +0200
find_unblocked_orphans: Cache complete pkgdb info
scripts/find_unblocked_orphans.py | 111 ++++++++++++++++++++-----------------
1 files changed, 61 insertions(+), 50 deletions(-)
---
diff --git a/scripts/find_unblocked_orphans.py b/scripts/find_unblocked_orphans.py
index d485d6d..bf94aea 100755
--- a/scripts/find_unblocked_orphans.py
+++ b/scripts/find_unblocked_orphans.py
@@ -179,35 +179,46 @@ def write_cache(data, filename, cachedir='~/.cache'):
pickle.dump(data, pickle_file)
-def get_people(package, branch=RAWHIDE_RELEASE["branch"]):
- def associated(pkginfo, exclude=None):
- """
-
- :param exclude: People to exclude, e.g. the point of contact.
- :type exclude: list
- """
- other_people = set()
- for acl in pkginfo.get("acls", []):
- if acl["status"] == "Approved":
- fas_name = acl["fas_name"]
- if fas_name != "group::provenpackager" and \
- fas_name not in exclude:
- other_people.add(fas_name)
- return sorted(other_people)
+class PKGDBInfo(object):
+ def __init__(self, package, branch=RAWHIDE_RELEASE["branch"]):
+ self.package = package
+ self.branch = branch
- try:
- pkginfo = pkgdb.get_package(package, branches=branch)
- except Exception as e:
- sys.stderr.write(
- "Error getting maintainer of package {} on branch {}\n".format(
- package, branch))
- # FIXME: Write proper traceback
- sys.stderr.write(str(e))
- return []
- pkginfo = pkginfo["packages"][0]
- people_ = [pkginfo["point_of_contact"]]
- people_.extend(associated(pkginfo, exclude=people_))
- return people_
+ try:
+ pkginfo = pkgdb.get_package(package, branches=branch)
+ except Exception as e:
+ sys.stderr.write(
+ "Error getting pkgdb info for {} on {}\n".format(
+ package, branch))
+ # FIXME: Write proper traceback
+ sys.stderr.write(str(e))
+ self.pkginfo = None
+ return
+
+ self.pkginfo = pkginfo["packages"][0]
+
+ def get_people(self):
+ def associated(pkginfo, exclude=None):
+ """
+
+ :param exclude: People to exclude, e.g. the point of contact.
+ :type exclude: list
+ """
+ other_people = set()
+ for acl in pkginfo.get("acls", []):
+ if acl["status"] == "Approved":
+ fas_name = acl["fas_name"]
+ if fas_name != "group::provenpackager" and \
+ fas_name not in exclude:
+ other_people.add(fas_name)
+ return sorted(other_people)
+
+ if self.pkginfo is not None:
+ people_ = [self.pkginfo["point_of_contact"]]
+ people_.extend(associated(self.pkginfo, exclude=people_))
+ return people_
+ else:
+ return []
def setup_yum(repo=RAWHIDE_RELEASE["repo"],
@@ -285,9 +296,9 @@ class DepChecker(object):
yumbase = setup_yum(repo=RELEASES[release]["repo"],
source_repo=RELEASES[release]["source_repo"])
self.yumbase = yumbase
- self.people_queue = Queue()
- self.people_cache = "orphans-people-{}.pickle".format(release)
- self.people_dict = get_cache(self.people_cache, default={})
+ self.pkgdbinfo_queue = Queue()
+ self.pkgdb_cache = "orphans-pkgdb-{}.pickle".format(release)
+ self.pkgdb_dict = get_cache(self.pkgdb_cache, default={})
def create_mapping(self):
src_by_bin = {} # Dict of source pkg objects by binary package objects
@@ -394,19 +405,19 @@ class DepChecker(object):
prov)
return OrderedDict(sorted(dependent_packages.items()))
- def people_worker(self):
+ def pkgdb_worker(self):
branch = RELEASES[self.release]["branch"]
while True:
- package = self.people_queue.get()
- if package not in self.people_dict:
- people_ = get_people(package, branch)
- self.people_dict[package] = people_
- self.people_queue.task_done()
+ package = self.pkgdbinfo_queue.get()
+ if package not in self.pkgdb_dict:
+ pkginfo = PKGDBInfo(package, branch)
+ self.pkgdb_dict[package] = pkginfo
+ self.pkgdbinfo_queue.task_done()
def recursive_deps(self, packages, max_deps=20):
# Start threads to get information about (co)maintainers for packages
for i in range(0, 2):
- people_thread = Thread(target=self.people_worker)
+ people_thread = Thread(target=self.pkgdb_worker)
people_thread.daemon = True
people_thread.start()
# keep pylint silent
@@ -414,7 +425,7 @@ class DepChecker(object):
# get a list of all rpm_pkgs that are to be removed
rpm_pkg_names = []
for name in packages:
- self.people_queue.put(name)
+ self.pkgdbinfo_queue.put(name)
# Empty list if pkg is only for a different arch
bin_pkgs = self.by_src.get(name, [])
rpm_pkg_names.extend([p.name for p in bin_pkgs])
@@ -456,7 +467,7 @@ class DepChecker(object):
).setdefault(pkg, set()).add(dep)
for srpm_name in new_srpm_names:
- self.people_queue.put(srpm_name)
+ self.pkgdbinfo_queue.put(srpm_name)
ignore.extend(new_names)
if allow_more:
@@ -473,9 +484,9 @@ class DepChecker(object):
" completed\n".format(max_deps, name))
sys.stderr.write("Waiting for (co)maintainer information...")
- self.people_queue.join()
+ self.pkgdbinfo_queue.join()
sys.stderr.write("done\n")
- write_cache(self.people_dict, self.people_cache)
+ write_cache(self.pkgdb_dict, self.pkgdb_cache)
return dep_map
# This function was stolen from pungi
@@ -497,7 +508,7 @@ class DepChecker(object):
sys.exit(1)
-def maintainer_table(packages, people_dict):
+def maintainer_table(packages, pkgdb_dict):
affected_people = {}
if with_texttable:
@@ -509,7 +520,7 @@ def maintainer_table(packages, people_dict):
table = ""
for package_name in packages:
- people = people_dict[package_name]
+ people = pkgdb_dict[package_name].get_people()
for p in people:
affected_people.setdefault(p, set()).add(package_name)
p = ', '.join(people)
@@ -524,14 +535,14 @@ def maintainer_table(packages, people_dict):
return table, affected_people
-def dependency_info(dep_map, affected_people, people_dict):
+def dependency_info(dep_map, affected_people, pkgdb_dict):
info = ""
for package_name, subdict in dep_map.items():
if subdict:
info += "Depending on: {} ({})\n".format(package_name,
len(subdict.keys()))
for fedora_package, dependent_packages in subdict.items():
- people = people_dict[fedora_package]
+ people = pkgdb_dict[fedora_package].get_people()
for p in people:
affected_people.setdefault(p, set()).add(package_name)
p = ", ".join(people)
@@ -555,13 +566,13 @@ def maintainer_info(affected_people):
return info
-def package_info(packages, dep_map, people_dict, orphans=None, failed=None):
+def package_info(packages, dep_map, pkgdb_dict, orphans=None, failed=None):
info = ""
- table, affected_people = maintainer_table(packages, people_dict)
+ table, affected_people = maintainer_table(packages, pkgdb_dict)
info += table
info += "\n\nThe following packages require above mentioned packages:\n"
- info += dependency_info(dep_map, affected_people, people_dict)
+ info += dependency_info(dep_map, affected_people, pkgdb_dict)
info += "Affected (co)maintainers\n"
info += maintainer_info(affected_people)
@@ -656,7 +667,7 @@ def main():
# TODO: add app args to either depsolve or not
dep_map = depchecker.recursive_deps(unblocked)
sys.stderr.write('done\n')
- info, addresses = package_info(unblocked, dep_map, depchecker.people_dict,
+ info, addresses = package_info(unblocked, dep_map, depchecker.pkgdb_dict,
orphans=orphans, failed=failed)
text += "\n"
text += info
More information about the rel-eng
mailing list