From a72777775f9f3d091f286895d63c5e82e96be2d0 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 5 Apr 2011 20:20:37 +0200 Subject: [PATCH] Fasten dependency resultion (a bit). --- pakfire/depsolve.py | 25 +++++++++++++++++-------- pakfire/packages/base.py | 10 ++++++++-- pakfire/packages/binary.py | 11 +++++++---- pakfire/packages/installed.py | 3 +-- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/pakfire/depsolve.py b/pakfire/depsolve.py index 7b9550bc8..7dbc4ef8b 100644 --- a/pakfire/depsolve.py +++ b/pakfire/depsolve.py @@ -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 diff --git a/pakfire/packages/base.py b/pakfire/packages/base.py index f2c5ad9b1..777bc9989 100644 --- a/pakfire/packages/base.py +++ b/pakfire/packages/base.py @@ -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 ### diff --git a/pakfire/packages/binary.py b/pakfire/packages/binary.py index 89d41049f..06c6bbf84 100644 --- a/pakfire/packages/binary.py +++ b/pakfire/packages/binary.py @@ -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) diff --git a/pakfire/packages/installed.py b/pakfire/packages/installed.py index 2713fb8a8..5b6943ed8 100644 --- a/pakfire/packages/installed.py +++ b/pakfire/packages/installed.py @@ -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 -- 2.39.5