From 6fb91c85a30dfc441b69161c062ca4bb58e01f91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fatih=20A=C5=9F=C4=B1c=C4=B1?= Date: Sun, 21 Mar 2010 18:59:21 +0000 Subject: [PATCH] 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. --- pisi/operations/upgrade.py | 100 ++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/pisi/operations/upgrade.py b/pisi/operations/upgrade.py index 85a39798..22b64368 100644 --- a/pisi/operations/upgrade.py +++ b/pisi/operations/upgrade.py @@ -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