]> git.ipfire.org Git - pakfire.git/commitdiff
Fasten dependency resultion (a bit).
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 5 Apr 2011 18:20:37 +0000 (20:20 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 5 Apr 2011 18:20:37 +0000 (20:20 +0200)
pakfire/depsolve.py
pakfire/packages/base.py
pakfire/packages/binary.py
pakfire/packages/installed.py

index 7b9550bc88d3b175390b0aede19e9afa4cc0ee55..7dbc4ef8be9081112abbbb1595fedc2ec9cc8e75 100644 (file)
@@ -29,6 +29,9 @@ class Requires(object):
        def __cmp__(self, other):
                return cmp(self.requires, other.requires)
 
+       def __hash__(self):
+               return hash(self.requires)
+
        @property
        def type(self):
                if self.requires.startswith("/"):
@@ -57,6 +60,9 @@ class Conflicts(object):
        def __str__(self):
                return self.conflicts
 
+       def __hash__(self):
+               return hash(self.conflicts)
+
 
 class Obsoletes(object):
        def __init__(self, pkg, obsoletes):
@@ -69,6 +75,9 @@ class Obsoletes(object):
        def __str__(self):
                return self.obsoletes
 
+       def __hash__(self):
+               return hash(self.obsoletes)
+
 
 class DependencySet(object):
        def __init__(self, pakfire):
@@ -76,12 +85,12 @@ class DependencySet(object):
                self.repos = pakfire.repos #repository.Repositories()
 
                # List of packages in this set
-               self.__packages = []
+               self.__packages = set()
 
                # Helper lists
-               self.__conflicts = []
-               self.__requires = []
-               self.__obsoletes = []
+               self.__conflicts = set()
+               self.__requires = set()
+               self.__obsoletes = set()
 
                # Create a new transaction set.
                self.ts = transaction.TransactionSet()
@@ -104,12 +113,12 @@ class DependencySet(object):
                                return
 
                #logging.debug("Adding requires: %s" % requires)
-               self.__requires.append(requires)
+               self.__requires.add(requires)
 
        def add_obsoletes(self, obsoletes, pkg=None):
                obsoletes = Obsoletes(pkg, obsoletes)
 
-               self.__obsoletes.append(obsoletes)
+               self.__obsoletes.add(obsoletes)
 
        def add_package(self, pkg, dep=False, transaction=True):
                #print pkg, sorted(self.__packages)
@@ -135,7 +144,7 @@ class DependencySet(object):
 
                #if not isinstance(pkg, packages.DatabasePackage):
                #       logging.info(" --> Adding package to dependency set: %s" % pkg.friendly_name)
-               self.__packages.append(pkg)
+               self.__packages.add(pkg)
 
                # Add the requirements of the newly added package.
                for req in pkg.requires:
@@ -162,7 +171,7 @@ class DependencySet(object):
                unresolveable_reqs = []
 
                while self.__requires:
-                       requires = self.__requires.pop(0)
+                       requires = self.__requires.pop()
                        logging.debug("Resolving requirement \"%s\"" % requires)
 
                        # Fetch all candidates from the repositories and save the
index f2c5ad9b12be28c4e3558bb7cc2a5d2a5a5e2770..777bc9989e4b27a6c31d2e9ec48a6dbdacad3c25 100644 (file)
@@ -57,6 +57,12 @@ class Package(object):
 
                return ret
 
+       def __hash__(self):
+               hashstr = ["%s" % s for s in (self.name, self.epoch, self.version,
+                       self.release, self.arch,)]
+
+               return hash("-".join(hashstr))
+
        def dump(self, short=False, long=False):
                if short:
                        return "%s.%s : %s" % (self.name, self.arch, self.summary)
@@ -297,7 +303,7 @@ class Package(object):
                        if ret:
                                break
 
-               return ret.split()
+               return set(ret.split())
 
        @property
        def _provides(self):
@@ -308,7 +314,7 @@ class Package(object):
                        "%s=%s:%s-%s" % (self.name, self.epoch, self.version, self.release),
                ]
 
-               return provides
+               return set(provides)
 
        ### methods ###
 
index 89d41049f8cc561b8a19d1105df61e96e4e4562c..06c6bbf841fa8d21aa12887c0b81dae814fcdd9b 100644 (file)
@@ -17,8 +17,7 @@ class BinaryPackage(FilePackage):
 
                        # Add other provides
                        for prov in self.metadata.get("PKG_PROVIDES", "").split():
-                               if not prov in provides:
-                                       provides.append(prov)
+                               provides.add(prov)
 
                        self.__provides = provides
 
@@ -26,9 +25,13 @@ class BinaryPackage(FilePackage):
 
        @property
        def conflicts(self):
-               return self.metadata.get("PKG_CONFLICTS", "").split()
+               conflicts = self.metadata.get("PKG_CONFLICTS", "").split()
+
+               return set(conflicts)
 
        @property
        def obsoletes(self):
-               return self.metadata.get("PKG_OBSOLETES", "").split()
+               obsoletes = self.metadata.get("PKG_OBSOLETES", "").split()
+
+               return set(obsoletes)
 
index 2713fb8a8f18ef4ababaa56087ec6102e0ccefdb..5b6943ed882576dbeb98a02a2c05d2a7eb8b2183 100644 (file)
@@ -116,8 +116,7 @@ class DatabasePackage(Package):
 
                        # Add other provides
                        for prov in self.metadata.get("provides", "").split():
-                               if not prov in provides:
-                                       provides.append(prov)
+                               provides.add(prov)
 
                        self.__provides = provides