diff --git a/pisi/dependency.py b/pisi/dependency.py index cdce78f6..8c78f84b 100644 --- a/pisi/dependency.py +++ b/pisi/dependency.py @@ -7,23 +7,13 @@ from ui import ui from version import Version def satisfiesDep(pkg_name, depinfo): - """determine if a package satisfies given dependency spec""" - if not installdb.is_installed(pkg_name): - return False + """determine if package satisfies given dependency spec in installdb""" if not installdb.is_installed(depinfo.package): return False else: - (version, release) = installdb.get_version(pkg_name) - ret = True - if depinfo.versionFrom: - ret &= Version(version) >= Version(depinfo.versionFrom) - if depinfo.versionTo: - ret &= Version(version) <= Version(depinfo.versionTo) - if depinfo.releaseFrom: - ret &= Version(release) <= Version(depinfo.releaseFrom) - if depinfo.releaseTo: - ret &= Version(release) <= Version(depinfo.releaseTo) - return ret + pkg = packagedb.get_package(pkg_name) + (version, release) = (pkg.version, pkg.release) + return depinfo.satisfies(pkg_name, version, release) def runtimeDeps(pkg): return packagedb.get_package(pkg).runtimeDeps @@ -33,7 +23,7 @@ def satisfiesRuntimeDeps(pkg): for dep in deps: if not satisfiesDep(pkg, dep): ui.error('Package %s does not satisfy dependency %s\n' % - (pkg,dep.package)) + (pkg,dep)) return False return True diff --git a/pisi/pgraph.py b/pisi/pgraph.py index 0bef13e5..50f809a0 100644 --- a/pisi/pgraph.py +++ b/pisi/pgraph.py @@ -11,30 +11,34 @@ class PGraph(digraph): def __init__(self): super(PGraph, self).__init__() + def add_package(self, pkg): + pkg1 = packagedb.get_package(pkg) + self.add_vertex(str(pkg), (pkg1.version, pkg1.release)) + def add_dep(self, pkg, depinfo): pkg1data = None if not pkg in self.vertices(): pkg1 = packagedb.get_package(pkg) + pkg1data = (pkg1.version, pkg1.release) pkg2data = None - if not pkg in self.vertices(): + if not depinfo.package in self.vertices(): pkg2 = packagedb.get_package(depinfo.package) - + pkg2data = (pkg2.version, pkg2.release) self.add_edge(str(pkg), str(depinfo.package), ('d', depinfo), - (pkg1.version, pkg1.release), - (pkg2.version, pkg2.release) ) + pkg1data, pkg2data ) def add_conflict(self, pkg, conflinfo): pkg1data = None if not pkg in self.vertices(): pkg1 = packagedb.get_package(pkg) + pkg1data = (pkg1.version, pkg1.release) pkg2data = None if not pkg in self.vertices(): pkg2 = packagedb.get_package(depinfo.package) + pkg2data = (pkg2.version, pkg2.release) self.add_biedge(str(pkg), str(conflinfo.package), ('c', conflinfo) - (pkg1.version, pkg1.release), - (pkg2.version, pkg2.release) ) - + , pkg1data, pkg2data ) def write_graphviz_vlabel(self, f, u): (v, r) = self.vertex_data(u) diff --git a/pisi/specfile.py b/pisi/specfile.py index 41db431f..3503c346 100644 --- a/pisi/specfile.py +++ b/pisi/specfile.py @@ -111,6 +111,32 @@ class DepInfo: if not self.package: return False return True + def satisfies(self, pkg_name, version, release): + """determine if a package ver. satisfies given dependency spec""" + ret = True + from version import Version + if self.versionFrom: + ret &= Version(version) >= Version(depinfo.versionFrom) + if self.versionTo: + ret &= Version(version) <= Version(depinfo.versionTo) + if self.releaseFrom: + ret &= Version(release) <= Version(depinfo.releaseFrom) + if self.releaseTo: + ret &= Version(release) <= Version(depinfo.releaseTo) + return ret + + def __str__(self): + s = self.package + if self.versionFrom: + s += 'ver >= ' + self.versionFrom + if self.versionTo: + s += 'ver <= ' + self.versionTo + if self.releaseFrom: + s += 'rel >= ' + self.releaseFrom + if self.releaseTo: + s += 'rel <= ' + self.releaseTo + return s + class UpdateInfo: def __init__(self, node = None): if node: diff --git a/pisi/toplevel.py b/pisi/toplevel.py index 2c6e3a4c..305bfade 100644 --- a/pisi/toplevel.py +++ b/pisi/toplevel.py @@ -64,16 +64,19 @@ def install_pkg_names(A): # find the "install closure" graph of G_f by package # set A using packagedb print A + for x in A: + G_f.add_package(x) B = A - state = {} + #state = {} while len(B) > 0: Bp = set() for x in B: pkg = packagedb.get_package(x) - #print pkg + print pkg for dep in pkg.runtimeDeps: + print 'checking ', dep # we don't deal with satisfied dependencies - if not dependency.satisfiesDep(pkg, dep): + if not dependency.satisfiesDep(x, dep): if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) G_f.add_dep(x, dep)