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:
Fatih Aşıcı
2010-03-21 18:59:21 +00:00
parent 1ba2c793f5
commit 6fb91c85a3
+26 -26
View File
@@ -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