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.
This commit is contained in:
+22
-6
@@ -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 "<AnyDependency>" in depStr:
|
||||
anydependency = pisi.specfile.AnyDependency()
|
||||
for dep in re.compile('(<Dependency>.*?</Dependency>)').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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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():
|
||||
|
||||
Reference in New Issue
Block a user