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
+50 -50
View File
@@ -202,68 +202,68 @@ def plan_upgrade(A, force_replaced=True, replaces=None):
B = A
installdb = pisi.db.installdb.InstallDB()
while len(B) > 0:
Bp = set()
for x in B:
pkg = packagedb.get_package(x)
for dep in pkg.runtimeDependencies():
# add packages that can be upgraded
if installdb.has_package(dep.package) and dep.satisfied_by_installed():
continue
if dep.satisfied_by_repo():
if not dep.package in G_f.vertices():
Bp.add(str(dep.package))
G_f.add_dep(x, dep)
else:
ctx.ui.error(_('Dependency %s of %s cannot be satisfied') % (dep, x))
raise Exception(_("Upgrade is not possible."))
B = Bp
# now, search reverse dependencies to see if anything
# should be upgraded
B = filter(lambda x:installdb.has_package(x), G_f.vertices())
while len(B) > 0:
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
if (installdb.has_package(rev_dep) and
not depinfo.satisfied_by_installed() and is_upgradable(rev_dep)):
if not depinfo.satisfied_by_repo():
raise Exception(_('Reverse dependency %s of %s cannot be satisfied') % (rev_dep, x))
if not rev_dep in G_f.vertices():
Bp.add(rev_dep)
G_f.add_plain_dep(rev_dep, x)
B = Bp
# now, search for reverse dependency update needs of to be upgraded packages
# check only the installed ones.
B = filter(lambda x:installdb.has_package(x), G_f.vertices())
def add_runtime_deps(pkg, Bp):
for dep in pkg.runtimeDependencies():
# add packages that can be upgraded
if installdb.has_package(dep.package) and dep.satisfied_by_installed():
continue
if dep.satisfied_by_repo():
if not dep.package in G_f.vertices():
Bp.add(str(dep.package))
G_f.add_dep(pkg.name, dep)
else:
ctx.ui.error(_('Dependency %s of %s cannot be satisfied') % (dep, pkg.name))
raise Exception(_("Upgrade is not possible."))
def add_broken_revdeps(pkg, Bp):
# Search reverse dependencies to see if anything
# should be upgraded
rev_deps = packagedb.get_rev_deps(pkg.name)
for rev_dep, depinfo in rev_deps:
# add only installed but unsatisfied reverse dependencies
if (installdb.has_package(rev_dep) and
not depinfo.satisfied_by_installed() and is_upgradable(rev_dep)):
if not depinfo.satisfied_by_repo():
raise Exception(_('Reverse dependency %s of %s cannot be satisfied') % (rev_dep, pkg.name))
if not rev_dep in G_f.vertices():
Bp.add(rev_dep)
G_f.add_plain_dep(rev_dep, pkg.name)
def add_needed_revdeps(pkg, Bp):
# Search for reverse dependency update needs of to be upgraded packages
# check only the installed ones.
version, release, build = installdb.get_version(pkg.name)
actions = pkg.get_update_actions(release)
for action_name, action_package in actions:
if action_name == "reverseDependencyUpdate":
target_package = action_package or pkg.name
for name, dep in packagedb.get_rev_deps(target_package):
if name in G_f.vertices() or not is_upgradable(name):
continue
Bp.add(name)
G_f.add_plain_dep(name, target_package)
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)
for action_name, action_package in actions:
if action_name == "reverseDependencyUpdate":
target_package = action_package or x
for name, dep in packagedb.get_rev_deps(target_package):
if name in G_f.vertices() or not is_upgradable(name):
continue
add_runtime_deps(pkg, Bp)
Bp.add(name)
G_f.add_plain_dep(name, target_package)
if installdb.has_package(x):
add_broken_revdeps(pkg, Bp)
add_needed_revdeps(pkg, Bp)
B = Bp
if ctx.config.get_option('debug'):
G_f.write_graphviz(sys.stdout)
order = G_f.topological_sort()
order.reverse()
return G_f, order