From 7a76b6ff1ce5e651d99e7d8b0d8fdd77f2ee5754 Mon Sep 17 00:00:00 2001 From: Faik Uygur Date: Thu, 20 Aug 2009 12:32:51 +0000 Subject: [PATCH] This should make AnyDependency work Now pisi it installs the first dependency of AnyDependency if none of them is installed pisi rm package removes the reverse dependency of any other package in AnyDependency, in other words, AnyDependency siblings of the to be removed package, is installed and satisfies AnyDependency, then rev dep is not removed. --- pisi/db/installdb.py | 28 ++++++++++++++++++++++------ pisi/dependency.py | 4 ++++ pisi/operations/remove.py | 3 ++- pisi/specfile.py | 6 ++++++ 4 files changed, 34 insertions(+), 7 deletions(-) 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():