[Piuparts-commits] [SCM] piuparts git repository branch, master, updated. eda668423fa87898c59d1075118693714aa5a053

Andreas Beckmann debian at abeckmann.de
Fri Dec 23 10:27:55 UTC 2011


The following commit has been merged in the master branch:
commit 673e16464e2396ba9e0beff7741d50bbd16855ff
Author: Andreas Beckmann <debian at abeckmann.de>
Date:   Fri Dec 2 10:49:25 2011 +0100

    track virtual packages separately from binary packages
    
    Mixing them into self._packages does no longer work after the
    set-conversion and unique-removal as it messes up counts and
    creates non-unique package lists.
    
    get_package_state() by default now resolves a purely virtual
    package to its first provider.  This can be disabled via
    resolve_virtual=False and the string "virtual" will be returned
    in that case.  If a package is both real and virtual, the virtual
    incarnations are ignored.
    
    Add get_provider(virtual) method the returns a list of
    packages that provide 'virtual' (excluding 'virtual' itself).
    
    Signed-off-by: Andreas Beckmann <debian at abeckmann.de>

diff --git a/piupartslib/packagesdb.py b/piupartslib/packagesdb.py
index 454b643..36c5231 100644
--- a/piupartslib/packagesdb.py
+++ b/piupartslib/packagesdb.py
@@ -271,13 +271,16 @@ class PackagesDB:
     def _find_all_packages(self):
         if self._packages is None:
             self._packages = {}
+            self._virtual_packages = {}
             for pf in self._packages_files:
                 for p in pf.values():
                     self._packages[p["Package"]] = p
             for p in self._packages.values():
                 for provided in p.provides():
-                    if provided not in self._packages:
-                        self._packages[provided] = p
+                    if provided != p["Package"]:
+                        if provided not in self._virtual_packages:
+                            self._virtual_packages[provided] = []
+                        self._virtual_packages[provided].append(p["Package"])
 
     def _get_recursive_dependencies(self, package, break_circles=True):
         assert self._packages is not None
@@ -290,6 +293,8 @@ class PackagesDB:
                 deps.append(dep)
                 if dep in self._packages:
                     more += self._packages[dep].dependencies()
+                elif dep in self._virtual_packages:
+                    more += self._packages[self._virtual_packages[dep][0]].dependencies()
 
         # Break circular dependencies
         if break_circles and package["Package"] in deps:
@@ -474,6 +479,11 @@ class PackagesDB:
     def get_package(self, name):
         return self._packages[name]
 
+    def get_providers(self, name):
+        if name in self._virtual_packages:
+            return self._virtual_packages[name]
+        return []
+
     def get_all_packages(self):
         self._find_all_packages()
         return self._packages
@@ -504,9 +514,15 @@ class PackagesDB:
         else:
           return self._packages[package_name][header]
 
-    def get_package_state(self, package_name):
+    def get_package_state(self, package_name, resolve_virtual=True):
         if package_name in self._package_state:
             return self._package_state[package_name]
+        if package_name in self._virtual_packages:
+            if resolve_virtual:
+                provider = self._virtual_packages[package_name][0]
+                return self._package_state[provider]
+            else:
+                return "virtual"
         return "does-not-exist"
 
     def _find_packages_ready_for_testing(self):

-- 
piuparts git repository



More information about the Piuparts-commits mailing list