[Piuparts-commits] [SCM] piuparts git repository branch, develop, updated. 0.44-589-g4af4863
Holger Levsen
holger at layer-acht.org
Fri May 25 13:03:43 UTC 2012
The following commit has been merged in the develop branch:
commit b0d27c8578a0b60d4159372430d3070cdf7f1509
Author: David Steele <dsteele at gmail.com>
Date: Sun May 20 07:50:10 2012 -0400
Optionally calculate recursive reverse dependency counts in PackagesDB
diff --git a/debian/changelog b/debian/changelog
index b334483..17e081b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -8,6 +8,8 @@ piuparts (0.45) UNRELEASED; urgency=low
* piuparts-report.py:
- Release Section object when section processing is complete.
(Closes: #673919)
+ * packagesdb.py
+ - Calculate recursive reverse dependency count, and store in Package
[ Andreas Beckmann ]
* piuparts.py:
diff --git a/piupartslib/packagesdb.py b/piupartslib/packagesdb.py
index d4baa67..9df675e 100644
--- a/piupartslib/packagesdb.py
+++ b/piupartslib/packagesdb.py
@@ -57,6 +57,7 @@ class Package(UserDict.UserDict):
self[name.strip()] = value.strip()
self._parsed_deps = {}
self._parsed_alt_deps = {}
+ self._rrdep_count = None
def _parse_dependencies(self, header_name):
if header_name in self._parsed_deps:
@@ -115,6 +116,15 @@ class Package(UserDict.UserDict):
"""Are we testable at all? Required aren't."""
return self.get("Priority", "") != "required"
+ def rrdep_count(self):
+ """Get the recursive dependency count, if it has been calculated"""
+ if self._rrdep_count == None:
+ raise Exception('Reverse dependency count has not been calculated')
+ return(self._rrdep_count)
+
+ def set_rrdep_count(self, val):
+ self._rrdep_count = val
+
def dump(self, output_file):
output_file.write("".join(self.headers))
@@ -581,4 +591,41 @@ class PackagesDB:
raise Exception("Log file exists already: %s (%s)" %
(package, version))
+ def calc_rrdep_counts(self):
+ """Calculate recursive reverse dependency counts for Packages"""
+
+ self._find_all_packages() # populate _packages
+
+ # create a reverse dependency dictionary.
+ # entries consist of a one-level list of reverse dependency package names,
+ # by package name
+ rdeps = {}
+ for pkg_name in self._packages.keys():
+ # use the Packages dependencies() method for a conservative count
+ for dep in self._packages[pkg_name].dependencies():
+ if dep in rdeps:
+ rdeps[dep].append( pkg_name )
+ else:
+ rdeps[dep] = [pkg_name]
+
+ def recurse_rdeps( pkg_name, rdeps, rrdep_dict ):
+ """ Recurse through the reverse dep arrays to determine the recursive
+ dependency count for a package. rrdep_dict.keys() contains the
+ accumulation of rdeps encountered"""
+
+ # are there any rdeps for this package?
+ if pkg_name in rdeps:
+ for rdep in rdeps[pkg_name]:
+ # break circular dependency loops
+ if not rdep in rrdep_dict:
+ rrdep_dict[rdep] = 1
+ rrdep_dict = recurse_rdeps( rdep, rdeps, rrdep_dict )
+
+ return rrdep_dict
+
+ # calculate all of the rrdeps
+ for pkg_name in self._packages.keys():
+ pkg_dep_count = len( recurse_rdeps( pkg_name, rdeps, {} ).keys() )
+ self._packages[pkg_name].set_rrdep_count( pkg_dep_count )
+
# vi:set et ts=4 sw=4 :
--
piuparts git repository
More information about the Piuparts-commits
mailing list