upgrade: Use a single loop for finding packages to be upgraded
If a package is added to the upgrade list because of a reverseDependencyUpdate action (e.g. google-gadgets because of libproxy), runtime dependencies of that package are not examined (e.g. webkit-gtk not installed although it is a dep of google-earth). This commit also fixes this issue.
This commit is contained in:
+26
-26
@@ -203,10 +203,7 @@ def plan_upgrade(A, force_replaced=True, replaces=None):
|
|||||||
|
|
||||||
installdb = pisi.db.installdb.InstallDB()
|
installdb = pisi.db.installdb.InstallDB()
|
||||||
|
|
||||||
while len(B) > 0:
|
def add_runtime_deps(pkg, Bp):
|
||||||
Bp = set()
|
|
||||||
for x in B:
|
|
||||||
pkg = packagedb.get_package(x)
|
|
||||||
for dep in pkg.runtimeDependencies():
|
for dep in pkg.runtimeDependencies():
|
||||||
# add packages that can be upgraded
|
# add packages that can be upgraded
|
||||||
if installdb.has_package(dep.package) and dep.satisfied_by_installed():
|
if installdb.has_package(dep.package) and dep.satisfied_by_installed():
|
||||||
@@ -215,44 +212,34 @@ def plan_upgrade(A, force_replaced=True, replaces=None):
|
|||||||
if dep.satisfied_by_repo():
|
if dep.satisfied_by_repo():
|
||||||
if not dep.package in G_f.vertices():
|
if not dep.package in G_f.vertices():
|
||||||
Bp.add(str(dep.package))
|
Bp.add(str(dep.package))
|
||||||
G_f.add_dep(x, dep)
|
G_f.add_dep(pkg.name, dep)
|
||||||
else:
|
else:
|
||||||
ctx.ui.error(_('Dependency %s of %s cannot be satisfied') % (dep, x))
|
ctx.ui.error(_('Dependency %s of %s cannot be satisfied') % (dep, pkg.name))
|
||||||
raise Exception(_("Upgrade is not possible."))
|
raise Exception(_("Upgrade is not possible."))
|
||||||
|
|
||||||
B = Bp
|
def add_broken_revdeps(pkg, Bp):
|
||||||
# now, search reverse dependencies to see if anything
|
# Search reverse dependencies to see if anything
|
||||||
# should be upgraded
|
# should be upgraded
|
||||||
B = filter(lambda x:installdb.has_package(x), G_f.vertices())
|
rev_deps = packagedb.get_rev_deps(pkg.name)
|
||||||
while len(B) > 0:
|
for rev_dep, depinfo in rev_deps:
|
||||||
Bp = set()
|
|
||||||
for x in B:
|
|
||||||
pkg = packagedb.get_package(x)
|
|
||||||
rev_deps = packagedb.get_rev_deps(x)
|
|
||||||
for (rev_dep, depinfo) in rev_deps:
|
|
||||||
# add only installed but unsatisfied reverse dependencies
|
# add only installed but unsatisfied reverse dependencies
|
||||||
if (installdb.has_package(rev_dep) and
|
if (installdb.has_package(rev_dep) and
|
||||||
not depinfo.satisfied_by_installed() and is_upgradable(rev_dep)):
|
not depinfo.satisfied_by_installed() and is_upgradable(rev_dep)):
|
||||||
if not depinfo.satisfied_by_repo():
|
if not depinfo.satisfied_by_repo():
|
||||||
raise Exception(_('Reverse dependency %s of %s cannot be satisfied') % (rev_dep, x))
|
raise Exception(_('Reverse dependency %s of %s cannot be satisfied') % (rev_dep, pkg.name))
|
||||||
if not rev_dep in G_f.vertices():
|
if not rev_dep in G_f.vertices():
|
||||||
Bp.add(rev_dep)
|
Bp.add(rev_dep)
|
||||||
G_f.add_plain_dep(rev_dep, x)
|
G_f.add_plain_dep(rev_dep, pkg.name)
|
||||||
B = Bp
|
|
||||||
|
|
||||||
# now, search for reverse dependency update needs of to be upgraded packages
|
def add_needed_revdeps(pkg, Bp):
|
||||||
|
# Search for reverse dependency update needs of to be upgraded packages
|
||||||
# check only the installed ones.
|
# check only the installed ones.
|
||||||
B = filter(lambda x:installdb.has_package(x), G_f.vertices())
|
version, release, build = installdb.get_version(pkg.name)
|
||||||
while B:
|
|
||||||
Bp = set()
|
|
||||||
for x in B:
|
|
||||||
pkg = packagedb.get_package(x)
|
|
||||||
(version, release, build) = installdb.get_version(x)
|
|
||||||
actions = pkg.get_update_actions(release)
|
actions = pkg.get_update_actions(release)
|
||||||
|
|
||||||
for action_name, action_package in actions:
|
for action_name, action_package in actions:
|
||||||
if action_name == "reverseDependencyUpdate":
|
if action_name == "reverseDependencyUpdate":
|
||||||
target_package = action_package or x
|
target_package = action_package or pkg.name
|
||||||
for name, dep in packagedb.get_rev_deps(target_package):
|
for name, dep in packagedb.get_rev_deps(target_package):
|
||||||
if name in G_f.vertices() or not is_upgradable(name):
|
if name in G_f.vertices() or not is_upgradable(name):
|
||||||
continue
|
continue
|
||||||
@@ -260,10 +247,23 @@ def plan_upgrade(A, force_replaced=True, replaces=None):
|
|||||||
Bp.add(name)
|
Bp.add(name)
|
||||||
G_f.add_plain_dep(name, target_package)
|
G_f.add_plain_dep(name, target_package)
|
||||||
|
|
||||||
|
while B:
|
||||||
|
Bp = set()
|
||||||
|
|
||||||
|
for x in B:
|
||||||
|
pkg = packagedb.get_package(x)
|
||||||
|
|
||||||
|
add_runtime_deps(pkg, Bp)
|
||||||
|
|
||||||
|
if installdb.has_package(x):
|
||||||
|
add_broken_revdeps(pkg, Bp)
|
||||||
|
add_needed_revdeps(pkg, Bp)
|
||||||
|
|
||||||
B = Bp
|
B = Bp
|
||||||
|
|
||||||
if ctx.config.get_option('debug'):
|
if ctx.config.get_option('debug'):
|
||||||
G_f.write_graphviz(sys.stdout)
|
G_f.write_graphviz(sys.stdout)
|
||||||
|
|
||||||
order = G_f.topological_sort()
|
order = G_f.topological_sort()
|
||||||
order.reverse()
|
order.reverse()
|
||||||
return G_f, order
|
return G_f, order
|
||||||
|
|||||||
Reference in New Issue
Block a user