diff --git a/pisi/db/installdb.py b/pisi/db/installdb.py index 00f1653f..b835ff85 100644 --- a/pisi/db/installdb.py +++ b/pisi/db/installdb.py @@ -88,6 +88,9 @@ class InstallDB(lazydb.LazyDB): if deps: for dep in deps.tags("Dependency"): revdeps.setdefault(dep.firstChild().data(), set()).add((name, dep.toString())) + for anydep in deps.tags("AnyDependency"): + for dep in anydep.tags("Dependency"): + revdeps.setdefault(dep.firstChild().data(), set()).add((name, anydep.toString())) def __generate_revdeps(self): revdeps = {} @@ -197,18 +200,31 @@ class InstallDB(lazydb.LazyDB): ctime) return info + def __make_dependency(self, depStr): + node = piksemel.parseString(depStr) + dependency = pisi.dependency.Dependency() + dependency.package = node.firstChild().data() + if node.attributes(): + attr = node.attributes()[0] + dependency.__dict__[attr] = node.getAttribute(attr) + return dependency + + def __create_dependency(self, depStr): + if "" in depStr: + anydependency = pisi.specfile.AnyDependency() + for dep in re.compile('(.*?)').findall(depStr): + anydependency.dependencies.append(self.__make_dependency(dep)) + return anydependency + else: + return self.__make_dependency(depStr) + def get_rev_deps(self, name): rev_deps = [] if self.rev_deps_db.has_key(name): for pkg, dep in self.rev_deps_db[name]: - node = piksemel.parseString(dep) - dependency = pisi.dependency.Dependency() - dependency.package = node.firstChild().data() - if node.attributes(): - attr = node.attributes()[0] - dependency.__dict__[attr] = node.getAttribute(attr) + dependency = self.__create_dependency(dep) rev_deps.append((pkg, dependency)) return rev_deps diff --git a/pisi/dependency.py b/pisi/dependency.py index 1265ad2e..95956984 100644 --- a/pisi/dependency.py +++ b/pisi/dependency.py @@ -56,3 +56,7 @@ class Dependency(pisi.relation.Relation): else: pkg = packagedb.get_package(self.package) return self.satisfies_relation(pkg.version, pkg.release) + + # Added for AnyDependency, single Dependency always returns False + def satisfied_by_any_installed_other_than(self, package): + return False diff --git a/pisi/operations/remove.py b/pisi/operations/remove.py index bdbb875b..e7356dd2 100644 --- a/pisi/operations/remove.py +++ b/pisi/operations/remove.py @@ -104,7 +104,8 @@ def plan_remove(A): for (rev_dep, depinfo) in rev_deps: # we don't deal with uninstalled rev deps # and unsatisfied dependencies (this is important, too) - if installdb.has_package(rev_dep) and depinfo.satisfied_by_installed(): + # satisfied_by_any_installed_other_than is for AnyDependency + if installdb.has_package(rev_dep) and depinfo.satisfied_by_installed() and not depinfo.satisfied_by_any_installed_other_than(x): if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) diff --git a/pisi/specfile.py b/pisi/specfile.py index 25d982f7..4dcbe126 100644 --- a/pisi/specfile.py +++ b/pisi/specfile.py @@ -197,6 +197,12 @@ class AnyDependency: return True return False + def satisfied_by_any_installed_other_than(self, package): + for dependency in self.dependencies: + if dependency.package != package and dependency.satisfied_by_installed(): + return True + return False + def satisfied_by_installed(self): for dependency in self.dependencies: if dependency.satisfied_by_installed():