[Piuparts-commits] [SCM] piuparts git repository branch, piatti, updated. 0.44-598-gace668e

Holger Levsen holger at layer-acht.org
Sun May 27 13:47:42 UTC 2012


The following commit has been merged in the piatti 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