def verbose_size(self, pkg, repoadd_set, pkg_info): """Determines the size of the downloads required @param pkg: _emerge.Package.Package instance @param repoadd_set: set of repos to add @param pkg_info: dictionary Modifies class globals: self.myfetchlist, self.counters.totalsize, self.verboseadd, repoadd_set. """ mysize = 0 if pkg.type_name in ("binary", "ebuild") and pkg_info.merge: db = pkg.root_config.trees[ pkg.root_config.pkg_tree_map[pkg.type_name]].dbapi kwargs = {} if pkg.type_name == "ebuild": kwargs["useflags"] = pkg_info.use kwargs["myrepo"] = pkg.repo myfilesdict = None try: myfilesdict = db.getfetchsizes(pkg.cpv, **portage._native_kwargs(kwargs)) except InvalidDependString as e: # FIXME: validate SRC_URI earlier depstr, = db.aux_get(pkg.cpv, ["SRC_URI"], myrepo=pkg.repo) show_invalid_depstring_notice( pkg, depstr, _unicode(e)) raise except SignatureException: # missing/invalid binary package SIZE signature pass if myfilesdict is None: myfilesdict = "[empty/missing/bad digest]" else: for myfetchfile in myfilesdict: if myfetchfile not in self.myfetchlist: mysize += myfilesdict[myfetchfile] self.myfetchlist.add(myfetchfile) if pkg_info.ordered: self.counters.totalsize += mysize self.verboseadd += _format_size(mysize) if self.quiet_repo_display: # overlay verbose # assign index for a previous version in the same slot if pkg_info.previous_pkg is not None: repo_name_prev = pkg_info.previous_pkg.repo else: repo_name_prev = None # now use the data to generate output if pkg.installed or pkg_info.previous_pkg is None: self.repoadd = self.conf.repo_display.repoStr( pkg_info.repo_path_real) else: repo_path_prev = None if repo_name_prev: repo_path_prev = self.portdb.getRepositoryPath( repo_name_prev) if repo_path_prev == pkg_info.repo_path_real: self.repoadd = self.conf.repo_display.repoStr( pkg_info.repo_path_real) else: self.repoadd = "%s=>%s" % ( self.conf.repo_display.repoStr(repo_path_prev), self.conf.repo_display.repoStr(pkg_info.repo_path_real)) if self.repoadd: repoadd_set.add(self.repoadd)
def verbose_size(self, pkg, repoadd_set, pkg_info): """Determines the size of the downloads required @param pkg: _emerge.Package.Package instance @param repoadd_set: set of repos to add @param pkg_info: dictionary Modifies class globals: self.myfetchlist, self.counters.totalsize, self.verboseadd, repoadd_set. """ mysize = 0 if pkg.type_name in ("binary", "ebuild") and pkg_info.merge: db = pkg.root_config.trees[pkg.root_config.pkg_tree_map[ pkg.type_name]].dbapi kwargs = {} if pkg.type_name == "ebuild": kwargs["useflags"] = pkg_info.use kwargs["myrepo"] = pkg.repo myfilesdict = None try: myfilesdict = db.getfetchsizes(pkg.cpv, **kwargs) except InvalidDependString as e: # FIXME: validate SRC_URI earlier depstr, = db.aux_get(pkg.cpv, ["SRC_URI"], myrepo=pkg.repo) show_invalid_depstring_notice(pkg, str(e)) raise except SignatureException: # missing/invalid binary package SIZE signature pass if myfilesdict is None: myfilesdict = "[empty/missing/bad digest]" else: for myfetchfile in myfilesdict: if myfetchfile not in self.myfetchlist: mysize += myfilesdict[myfetchfile] self.myfetchlist.add(myfetchfile) if pkg_info.ordered: self.counters.totalsize += mysize self.verboseadd += localized_size(mysize) if self.quiet_repo_display: # overlay verbose # assign index for a previous version in the same slot if pkg_info.previous_pkg is not None: repo_name_prev = pkg_info.previous_pkg.repo else: repo_name_prev = None # now use the data to generate output if pkg.installed or pkg_info.previous_pkg is None: self.repoadd = self.conf.repo_display.repoStr( pkg_info.repo_path_real) else: repo_path_prev = None if repo_name_prev: repo_path_prev = self.portdb.getRepositoryPath( repo_name_prev) if repo_path_prev == pkg_info.repo_path_real: self.repoadd = self.conf.repo_display.repoStr( pkg_info.repo_path_real) else: self.repoadd = "%s=>%s" % ( self.conf.repo_display.repoStr(repo_path_prev), self.conf.repo_display.repoStr( pkg_info.repo_path_real)) if self.repoadd: repoadd_set.add(self.repoadd)
def findInstalledBlockers(self, new_pkg, acquire_lock=0): blocker_cache = BlockerCache(self._vartree.root, self._vartree.dbapi) dep_keys = ["DEPEND", "RDEPEND", "PDEPEND"] settings = self._vartree.settings stale_cache = set(blocker_cache) fake_vartree = self._get_fake_vartree(acquire_lock=acquire_lock) dep_check_trees = self._dep_check_trees vardb = fake_vartree.dbapi installed_pkgs = list(vardb) for inst_pkg in installed_pkgs: stale_cache.discard(inst_pkg.cpv) cached_blockers = blocker_cache.get(inst_pkg.cpv) if cached_blockers is not None and \ cached_blockers.counter != long(inst_pkg.metadata["COUNTER"]): cached_blockers = None if cached_blockers is not None: blocker_atoms = cached_blockers.atoms else: # Use aux_get() to trigger FakeVartree global # updates on *DEPEND when appropriate. depstr = " ".join(vardb.aux_get(inst_pkg.cpv, dep_keys)) success, atoms = portage.dep_check(depstr, vardb, settings, myuse=inst_pkg.use.enabled, trees=dep_check_trees, myroot=inst_pkg.root) if not success: pkg_location = os.path.join(inst_pkg.root, portage.VDB_PATH, inst_pkg.category, inst_pkg.pf) portage.writemsg("!!! %s/*DEPEND: %s\n" % \ (pkg_location, atoms), noiselevel=-1) continue blocker_atoms = [atom for atom in atoms \ if atom.startswith("!")] blocker_atoms.sort() counter = long(inst_pkg.metadata["COUNTER"]) blocker_cache[inst_pkg.cpv] = \ blocker_cache.BlockerData(counter, blocker_atoms) for cpv in stale_cache: del blocker_cache[cpv] blocker_cache.flush() blocker_parents = digraph() blocker_atoms = [] for pkg in installed_pkgs: for blocker_atom in blocker_cache[pkg.cpv].atoms: blocker_atom = blocker_atom.lstrip("!") blocker_atoms.append(blocker_atom) blocker_parents.add(blocker_atom, pkg) blocker_atoms = InternalPackageSet(initial_atoms=blocker_atoms) blocking_pkgs = set() for atom in blocker_atoms.iterAtomsForPackage(new_pkg): blocking_pkgs.update(blocker_parents.parent_nodes(atom)) # Check for blockers in the other direction. depstr = " ".join(new_pkg.metadata[k] for k in dep_keys) success, atoms = portage.dep_check(depstr, vardb, settings, myuse=new_pkg.use.enabled, trees=dep_check_trees, myroot=new_pkg.root) if not success: # We should never get this far with invalid deps. show_invalid_depstring_notice(new_pkg, depstr, atoms) assert False blocker_atoms = [atom.lstrip("!") for atom in atoms \ if atom[:1] == "!"] if blocker_atoms: blocker_atoms = InternalPackageSet(initial_atoms=blocker_atoms) for inst_pkg in installed_pkgs: try: next(blocker_atoms.iterAtomsForPackage(inst_pkg)) except (portage.exception.InvalidDependString, StopIteration): continue blocking_pkgs.add(inst_pkg) return blocking_pkgs