def plan_upgrade(A): # try to construct a pisi graph of packages to # install / reinstall packagedb = pisi.db.packagedb.PackageDB() 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 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 dependency.installed_satisfies_dep(dep): continue if dependency.repo_satisfies_dep(dep): 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 = A 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 dependency.installed_satisfies_dep(depinfo) and is_upgradable(rev_dep)): if not dependency.repo_satisfies_dep(depinfo): 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 if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() return G_f, order
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 was a list, remove duplicates and expand components A_0 = A = expand_components(set(A)) ctx.ui.debug("A = %s" % str(A)) if len(A) == 0: ctx.ui.info(_("No packages to install.")) return if ctx.config.get_option("ignore_dependency"): # simple code path then for x in A: atomicoperations.install_single_name(x) return # short circuit # 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 while len(B) > 0: Bp = set() for x in B: pkg = packagedb.get_package(x) for dep in pkg.runtimeDependencies(): 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() check_conflicts(order) ctx.ui.info( _( """The following minimal list of packages will be installed in the respective order to satisfy dependencies: """ ) + util.strlist(order) ) if len(order) > len(A_0): if not ctx.ui.confirm(_("Do you want to continue?")): return False for x in order: atomicoperations.install_single_name(x)
def plan_remove(A): # try to construct a pisi graph of packages to # install / reinstall G_f = pgraph.PGraph(ctx.packagedb, pisi.itembyrepodb.installed) # 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 while len(B) > 0: Bp = set() for x in B: pkg = ctx.packagedb.get_package(x, pisi.itembyrepodb.installed) rev_deps = ctx.packagedb.get_rev_deps(x, pisi.itembyrepodb.installed) for (rev_dep, depinfo) in rev_deps: # we don't deal with uninstalled rev deps # and unsatisfied dependencies (this is important, too) if ctx.packagedb.has_package(rev_dep, pisi.itembyrepodb.installed) and \ dependency.installed_satisfies_dep(depinfo): if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) B = Bp if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() return G_f, order
def package_graph(A, repo = pisi.itembyrepodb.installed, ignore_installed = False): """Construct a package relations graph, containing all dependencies of packages A, if ignore_installed option is True, then only uninstalled deps will be added.""" ctx.ui.debug('A = %s' % str(A)) # try to construct a pisi graph of packages to # install / reinstall G_f = pgraph.PGraph(ctx.packagedb, repo) # 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 = ctx.packagedb.get_package(x, repo) #print pkg for dep in pkg.runtimeDependencies(): if ignore_installed: if dependency.installed_satisfies_dep(dep): continue if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) G_f.add_dep(x, dep) B = Bp return G_f
def plan_remove(A): # try to construct a pisi graph of packages to # install / reinstall installdb = pisi.db.installdb.InstallDB() G_f = pgraph.PGraph(installdb) # 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 while len(B) > 0: Bp = set() for x in B: rev_deps = installdb.get_rev_deps(x) for (rev_dep, depinfo) in rev_deps: # we don't deal with uninstalled rev deps # and unsatisfied dependencies (this is important, too) if installdb.has_package( rev_dep) and dependency.installed_satisfies_dep( depinfo): if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) B = Bp if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() return G_f, order
def plan_install_pkg_names(A, ignore_package_conflicts=False): # try to construct a pisi graph of packages to # install / reinstall packagedb = pisi.db.packagedb.PackageDB() 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 while len(B) > 0: Bp = set() for x in B: pkg = packagedb.get_package(x) for dep in pkg.runtimeDependencies(): ctx.ui.debug("checking %s" % str(dep)) # we don't deal with already *satisfied* dependencies if not dependency.installed_satisfies_dep(dep): if not dependency.repo_satisfies_dep(dep): raise Exception(_("%s dependency of package %s is not satisfied") % (dep, pkg.name)) 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() return G_f, order
def package_graph(A, packagedb, ignore_installed = False): """Construct a package relations graph. Graph will contain all dependencies of packages A, if ignore_installed option is True, then only uninstalled deps will be added. """ 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.runtimeDependencies(): if ignore_installed: if dependency.installed_satisfies_dep(dep): continue if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) G_f.add_dep(x, dep) B = Bp return G_f
def plan_install_pkg_names(A): # try to construct a pisi graph of packages to # install / reinstall G_f = pgraph.PGraph(ctx.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 while len(B) > 0: Bp = set() for x in B: pkg = ctx.packagedb.get_package(x) for dep in pkg.runtimeDependencies(): 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() if not ctx.get_option('ignore_file_conflicts'): check_conflicts(order, ctx.packagedb) return G_f, order
def prepare_for_build(pspecfile, authInfo=None): # FIXME: there is a function named "build" in this module which # makes it impossible to use build module directly. from build import PisiBuild url = URI(pspecfile) if url.is_remote_file(): from sourcefetcher import SourceFetcher fs = SourceFetcher(url, authInfo) url.uri = fs.fetch_all() pb = PisiBuild(url.uri) # find out the build dependencies that are not satisfied... dep_unsatis = [] for dep in pb.spec.source.buildDeps: if not dependency.installed_satisfies_dep(dep): dep_unsatis.append(dep) # FIXME: take care of the required buildDeps... # For now just report an error! if dep_unsatis: ctx.ui.error(_("Unsatisfied Build Dependencies:")) for dep in dep_unsatis: ctx.ui.warning(dep.package) # FIXME: Don't exit for now! It's annoying to test on a system that # doesn't has all packages made with pisi. # Will be enabled on the full-pisi system. # sys.exit(1) return pb
def remove(A): """remove set A of packages from system (A is a list of package names)""" # filter packages that are not installed A_0 = A = set(A) Ap = [] for x in A: if ctx.installdb.is_installed(x): Ap.append(x) else: ctx.ui.info(_('Package %s does not exist. Cannot remove.') % x) A = set(Ap) if len(A)==0: ctx.ui.info(_('No packages to remove.')) return # 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 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: # we don't deal with unsatisfied dependencies if packagedb.has_package(rev_dep) and \ dependency.installed_satisfies_dep(depinfo): if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) B = Bp if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() ctx.ui.info(_("""The following minimal list of packages will be removed in the respective order to satisfy dependencies: """) + util.strlist(order)) if len(order) > len(A_0): if not ctx.ui.confirm('Do you want to continue?'): ctx.ui.warning(_('Package removal declined')) return False for x in order: if ctx.installdb.is_installed(x): atomicoperations.remove_single(x) else: ctx.ui.info(_('Package %s is not installed. Cannot remove.') % x)
def process_dep(dep): if not dependency.installed_satisfies_dep(dep): if dependency.repo_satisfies_dep(dep): install_list.add(dep.package) return srcdep = pkgtosrc(dep.package) if not srcdep in G_f.vertices(): Bp.add(srcdep) add_src(get_src(srcdep)) if not src.name == srcdep: # firefox - firefox-devel thing G_f.add_edge(src.name, srcdep)
def remove(A): """remove set A of packages from system (A is a list of package names)""" # filter packages that are not installed Ap = [] for x in A: if ctx.installdb.is_installed(x): Ap.append(x) else: ctx.ui.info(_('Package %s does not exist. Cannot remove.') % x) A = Ap if len(A)==0: ctx.ui.info(_('No packages to remove.')) 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 'processing', pkg.name rev_deps = packagedb.get_rev_deps(x) for (rev_dep, depinfo) in rev_deps: #print 'checking ', rev_dep # we don't deal with unsatisfied dependencies if dependency.installed_satisfies_dep(depinfo): if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) B = Bp #G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() #FIXME: do something more informative here #print order for x in order: if ctx.installdb.is_installed(x): operations.remove_single(x) else: ctx.ui.info(_('Package %s is not installed. Cannot remove.') % x) return True # everything went OK :)
def check_build_dependencies(self): """check and try to install build dependencies, otherwise fail.""" build_deps = self.spec.source.buildDependencies if not ctx.get_option('bypass_safety'): if ctx.componentdb.has_component('system.devel'): build_deps_names = set([x.package for x in build_deps]) devel_deps_names = set(ctx.componentdb.get_component('system.devel').packages) extra_names = devel_deps_names - build_deps_names extra_names = filter(lambda x: not ctx.installdb.is_installed(x), extra_names) if extra_names: ctx.ui.warning(_('Safety switch: following extra packages in system.devel will be installed: ') + util.strlist(extra_names)) extra_deps = [dependency.Dependency(package = x) for x in extra_names] build_deps.extend(extra_deps) else: ctx.ui.warning(_('Safety switch: system.devel is already installed')) else: ctx.ui.warning(_('Safety switch: the component system.devel cannot be found')) # find out the build dependencies that are not satisfied... dep_unsatis = [] for dep in build_deps: if not dependency.installed_satisfies_dep(dep): dep_unsatis.append(dep) if dep_unsatis: ctx.ui.info(_("Unsatisfied Build Dependencies:") + ' ' + util.strlist([str(x) for x in dep_unsatis]) ) def fail(): raise Error(_('Cannot build package due to unsatisfied build dependencies')) if ctx.config.get_option('no_install'): fail() if not ctx.config.get_option('ignore_dependency'): for dep in dep_unsatis: if not dependency.repo_satisfies_dep(dep): raise Error(_('Build dependency %s cannot be satisfied') % str(dep)) if ctx.ui.confirm( _('Do you want to install the unsatisfied build dependencies')): ctx.ui.info(_('Installing build dependencies.')) operations.install([dep.package for dep in dep_unsatis]) else: fail() else: ctx.ui.warning(_('Ignoring build dependencies.'))
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 check_build_dependencies(self): """fail if dependencies not satisfied""" # find out the build dependencies that are not satisfied... dep_unsatis = [] for dep in self.spec.source.buildDependencies: if not dependency.installed_satisfies_dep(dep): dep_unsatis.append(dep) if dep_unsatis: ctx.ui.info(_("Unsatisfied Build Dependencies:")) for dep in dep_unsatis: ctx.ui.warning(dep.package) if not ctx.config.get_option("ignore_dependency"): if ctx.ui.confirm(_("Do you want to install the unsatisfied build dependencies")): ctx.ui.info(_("Installing build dependencies.")) operations.install([dep.package for dep in dep_unsatis]) else: raise Error(_("Cannot build package due to unsatisfied build dependencies")) else: ctx.ui.warning(_("Ignoring build dependencies."))
def plan_install_pkg_names(A, ignore_package_conflicts=False): # try to construct a pisi graph of packages to # install / reinstall packagedb = pisi.db.packagedb.PackageDB() 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 while len(B) > 0: Bp = set() for x in B: pkg = packagedb.get_package(x) for dep in pkg.runtimeDependencies(): ctx.ui.debug('checking %s' % str(dep)) # we don't deal with already *satisfied* dependencies if not dependency.installed_satisfies_dep(dep): if not dependency.repo_satisfies_dep(dep): raise Exception( _('%s dependency of package %s is not satisfied') % (dep, pkg.name)) 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() if not ctx.get_option( 'ignore_package_conflicts') and not ignore_package_conflicts: conflicts = operations.helper.check_conflicts(order, packagedb) if conflicts: operations.remove.remove_conflicting_packages(conflicts) return G_f, order
def check_build_dependencies(self): """fail if dependencies not satisfied""" build_deps = set(self.spec.source.buildDependencies) if not ctx.get_option('bypass_safety'): if ctx.componentdb.has_component('system.devel'): build_deps_names = set([x.package for x in build_deps]) devel_deps_names = set(ctx.componentdb.get_component('system.devel').packages) extra_names = devel_deps_names - build_deps_names ctx.ui.warning(_('Safety switch: following extra packages in system.devel will be installed: ') + util.strlist(extra_names)) extra_deps = [dependency.Dependency(package = x) for x in extra_names] build_deps = build_deps.union(extra_deps) else: ctx.ui.warning(_('Safety switch: the component system.devel cannot be found')) # find out the build dependencies that are not satisfied... dep_unsatis = [] for dep in build_deps: if not dependency.installed_satisfies_dep(dep): dep_unsatis.append(dep) if dep_unsatis: ctx.ui.info(_("Unsatisfied Build Dependencies:")) for dep in dep_unsatis: ctx.ui.warning(dep.package) if not ctx.config.get_option('ignore_dependency'): if ctx.ui.confirm( _('Do you want to install the unsatisfied build dependencies')): ctx.ui.info(_('Installing build dependencies.')) operations.install([dep.package for dep in dep_unsatis]) else: raise Error(_('Cannot build package due to unsatisfied build dependencies')) else: ctx.ui.warning(_('Ignoring build dependencies.'))
def check_build_dependencies(self): """check and try to install build dependencies, otherwise fail.""" build_deps = self.spec.source.buildDependencies if not ctx.get_option('bypass_safety'): if ctx.componentdb.has_component('system.devel'): build_deps_names = set([x.package for x in build_deps]) devel_deps_names = set( ctx.componentdb.get_component('system.devel').packages) extra_names = devel_deps_names - build_deps_names extra_names = filter( lambda x: not ctx.installdb.is_installed(x), extra_names) if extra_names: ctx.ui.warning( _('Safety switch: following extra packages in system.devel will be installed: ' ) + util.strlist(extra_names)) extra_deps = [ dependency.Dependency(package=x) for x in extra_names ] build_deps.extend(extra_deps) else: ctx.ui.warning( _('Safety switch: system.devel is already installed')) else: ctx.ui.warning( _('Safety switch: the component system.devel cannot be found' )) # find out the build dependencies that are not satisfied... dep_unsatis = [] for dep in build_deps: if not dependency.installed_satisfies_dep(dep): dep_unsatis.append(dep) if dep_unsatis: ctx.ui.info( _("Unsatisfied Build Dependencies:") + ' ' + util.strlist([str(x) for x in dep_unsatis])) def fail(): raise Error( _('Cannot build package due to unsatisfied build dependencies' )) if ctx.config.get_option('no_install'): fail() if not ctx.config.get_option('ignore_dependency'): for dep in dep_unsatis: if not dependency.repo_satisfies_dep(dep): raise Error( _('Build dependency %s cannot be satisfied') % str(dep)) if ctx.ui.confirm( _('Do you want to install the unsatisfied build dependencies' )): ctx.ui.info(_('Installing build dependencies.')) operations.install([dep.package for dep in dep_unsatis]) else: fail() else: ctx.ui.warning(_('Ignoring build dependencies.'))
def plan_upgrade(A): # try to construct a pisi graph of packages to # install / reinstall packagedb = pisi.db.packagedb.PackageDB() 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 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 dependency.installed_satisfies_dep( dep): continue if dependency.repo_satisfies_dep(dep): 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 = A 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 dependency.installed_satisfies_dep(depinfo) and is_upgradable(rev_dep)): if not dependency.repo_satisfies_dep(depinfo): 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 if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() return G_f, order
def plan_upgrade(A, ignore_build = False): # try to construct a pisi graph of packages to # install / reinstall packagedb = ctx.packagedb 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 # TODO: conflicts 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 dependency.repo_satisfies_dep(dep): if ctx.installdb.is_installed(dep.package): if ctx.get_option('eager'): if not is_upgradable(dep.package): continue else: if dependency.installed_satisfies_dep(dep): continue 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 Error(_("Upgrade is not possible.")) B = Bp # now, search reverse dependencies to see if anything # should be upgraded B = A 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: if ctx.get_option('eager'): # add all upgradable reverse deps if is_upgradable(rev_dep): if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) else: # add only installed but unsatisfied reverse dependencies if ctx.installdb.is_installed(rev_dep) and \ (not dependency.installed_satisfies_dep(depinfo)): if not dependency.repo_satisfies_dep(depinfo): raise Error(_('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 if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() if not ctx.get_option('ignore_file_conflicts'): check_conflicts(order, ctx.packagedb) return G_f, order
def plan_upgrade(A, ignore_build=False): # try to construct a pisi graph of packages to # install / reinstall packagedb = ctx.packagedb 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 # TODO: conflicts 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 dependency.repo_satisfies_dep(dep): if ctx.installdb.is_installed(dep.package): if ctx.get_option('eager'): if not is_upgradable(dep.package): continue else: if dependency.installed_satisfies_dep(dep): continue 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 Error(_("Upgrade is not possible.")) B = Bp # now, search reverse dependencies to see if anything # should be upgraded B = A 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: if ctx.get_option('eager'): # add all upgradable reverse deps if is_upgradable(rev_dep): if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) else: # add only installed but unsatisfied reverse dependencies if ctx.installdb.is_installed(rev_dep) and \ (not dependency.installed_satisfies_dep(depinfo)): if not dependency.repo_satisfies_dep(depinfo): raise Error( _('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 if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() if not ctx.get_option('ignore_file_conflicts'): check_conflicts(order, ctx.packagedb) return G_f, order
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 if not A: # if A is empty, then upgrade all packages A = ctx.installdb.list_installed() # filter packages that are not upgradable A_0 = A = set(A) Ap = [] for x in A: if x.endswith('.pisi'): ctx.ui.debug(_("Warning: package *name* ends with '.pisi'")) 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) # First check version. If they are same, check release. Again # if releases are same and checking buildno is premitted, # check build number. if version < pkg.version: Ap.append(x) elif version == pkg.version: if release < pkg.release: Ap.append(x) if release == pkg.release and build and not ignore_build: if 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 = set(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 def upgradable(dep): #pre dep.package is installed (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 return False elif b and bp and b >= bp: return False return True # TODO: conflicts 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 dependency.repo_satisfies_dep(dep): #TODO: distinguish must upgrade and upgradable if ctx.installdb.is_installed(dep.package): if not ctx.get_option('eager'): if dependency.installed_satisfies_dep(dep): continue else: if not upgradable(dep): continue if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) G_f.add_dep(x, dep) else: raise Error(_("Reverse dependency %s cannot be satisfied") % rev_dep) B = Bp # now, search reverse dependencies to see if anything # should be upgraded B = A 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: if not ctx.get_option('eager'): # add unsatisfied reverse dependencies if packagedb.has_package(rev_dep) and \ (not dependency.installed_satisfies_dep(depinfo)): if not dependency.repo_satisfies_dep(dep): raise Error(_("Reverse dependency %s cannot be satisfied") % rev_dep) if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) else: if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) B = Bp if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() check_conflicts(order) ctx.ui.info(_("""The following packages will be upgraded:\n""") + util.strlist(order)) if len(order) > len(A_0): if not ctx.ui.confirm('Do you want to continue?'): return False for x in order: atomicoperations.install_single_name(x, True)
def satisfiesDep(dep): # is dependency satisfied among available packages # or packages to be installed? return dependency.installed_satisfies_dep(dep) \ or dependency.dict_satisfies_dep(d_t, dep)
def satisfiesDep(dep): return dependency.installed_satisfies_dep(dep) \ or dependency.dict_satisfies_dep(d_t, dep)
def plan_upgrade(A): # try to construct a pisi graph of packages to # install / reinstall packagedb = ctx.packagedb 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 def upgradable(dep): #pre dep.package is installed (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 return False elif b and bp and b >= bp: return False return True # TODO: conflicts 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 dependency.repo_satisfies_dep(dep): #TODO: distinguish must upgrade and upgradable if ctx.installdb.is_installed(dep.package): if not ctx.get_option('eager'): if dependency.installed_satisfies_dep(dep): continue else: if not upgradable(dep): continue if not dep.package in G_f.vertices(): Bp.add(str(dep.package)) G_f.add_dep(x, dep) else: raise Error(_("Reverse dependency %s cannot be satisfied") % rev_dep) B = Bp # now, search reverse dependencies to see if anything # should be upgraded B = A 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: if not ctx.get_option('eager'): # add unsatisfied reverse dependencies if packagedb.has_package(rev_dep) and \ (not dependency.installed_satisfies_dep(depinfo)): if not dependency.repo_satisfies_dep(depinfo): raise Error(_("Reverse dependency %s cannot be satisfied") % rev_dep) if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) else: if not rev_dep in G_f.vertices(): Bp.add(rev_dep) G_f.add_plain_dep(rev_dep, x) B = Bp if ctx.config.get_option('debug'): G_f.write_graphviz(sys.stdout) order = G_f.topological_sort() order.reverse() check_conflicts(order, ctx.packagedb) return G_f, order