def install_pkg_names(A): """This is the real thing. It installs packages from the repository, trying to perform a minimum number of installs""" A = set(A) # A was a list, remove duplicates ctx.ui.debug('A = %s' % str(A)) if len(A)==0: ctx.ui.info(_('No packages to install.')) return True # try to construct a pisi graph of packages to # install / reinstall G_f = pgraph.PGraph(packagedb) # construct G_f # find the "install closure" graph of G_f by package # set A using packagedb #print A for x in A: G_f.add_package(x) B = A #state = {} while len(B) > 0: Bp = set() for x in B: pkg = packagedb.get_package(x) #print pkg for dep in pkg.runtimeDeps: ctx.ui.debug('checking %s' % str(dep)) # we don't deal with already *satisfied* dependencies if not dependency.installed_satisfies_dep(dep): if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) G_f.add_dep(x, dep) B = Bp if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() #print order for x in order: operations.install_single_name(x) return True # everything went OK :)
def upgrade_pkg_names(A): """Re-installs packages from the repository, trying to perform a maximum number of upgrades.""" ignore_build = ctx.config.options and ctx.config.options.ignore_build_no # filter packages that are not upgradable Ap = [] for x in A: if not ctx.installdb.is_installed(x): ctx.ui.info('Package %s is not installed.' % x) continue (version, release, build) = ctx.installdb.get_version(x) pkg = packagedb.get_package(x) if ignore_build or (not build): if release < pkg.release: Ap.append(x) elif build < pkg.build: Ap.append(x) else: #ctx.ui.info('Package %s cannot be upgraded. ' % x) ctx.ui.info('Package %s is already at its latest version %s,\ release %s, build %s.' % (x, pkg.version, pkg.release, pkg.build)) A = Ap if len(A)==0: ctx.ui.info('No packages to upgrade.') return True ctx.ui.debug('A = %s' % str(A)) # try to construct a pisi graph of packages to # install / reinstall G_f = pgraph.PGraph(packagedb) # construct G_f # find the "install closure" graph of G_f by package # set A using packagedb for x in A: G_f.add_package(x) B = A #state = {} while len(B) > 0: Bp = set() for x in B: pkg = packagedb.get_package(x) print pkg for dep in pkg.runtimeDeps: print 'checking ', dep # add packages that can be upgraded if dependency.repo_satisfies_dep(dep): if ctx.installdb.is_installed(dep.package): (v,r,b) = ctx.installdb.get_version(dep.package) rep_pkg = packagedb.get_package(dep.package) (vp,rp,bp) = (rep_pkg.version, rep_pkg.release, rep_pkg.build) if ignore_build or (not b) or (not bp): # if we can't look at build if r >= rp: # installed already new continue elif b and bp and b >= bp: continue if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) G_f.add_dep(x, dep) B = Bp G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() print order for x in order: operations.install_single_name(x, True) return True # everything went OK :)