def _add_dependency_breakage(self, pkgname: str, pkgdeps: Optional[Set[str]], provided_versions: Dict[str, Set[str]], cannot_upgrade: Set[str], context: UpdateRequirementsContext): if pkgdeps: for dep in pkgdeps: dep_split = RE_DEP_OPERATORS.split(dep) if len(dep_split) > 1 and dep_split[1]: real_providers = context.provided_map.get(dep_split[0]) if real_providers: versions = provided_versions.get(dep_split[0]) if versions: op = ''.join(RE_DEP_OPERATORS.findall(dep)) if op == '=': op = '==' version_match = False for v in versions: try: provided_version, required_version = parse_version( v), parse_version(dep_split[1]) if eval('provided_version {} required_version' .format(op)): version_match = True break except: self.logger.error( "Error when comparing versions {} (provided) and {} (required)" .format(v, dep_split[1])) traceback.print_exc() if not version_match: for pname in real_providers: if pname not in cannot_upgrade: provider = context.to_update.get(pname) if provider: cannot_upgrade.add(pname) reason = self.i18n[ 'arch.sync.dep_breakage.reason'].format( pkgname, dep) context.cannot_upgrade[ pname] = UpgradeRequirement( pkg=provider, reason=reason)
def _map_requirement(self, pkg: ArchPackage, context: UpdateRequirementsContext, installed_sizes: Dict[str, int] = None, to_install: bool = False, to_sync: Set[str] = None) -> UpgradeRequirement: requirement = UpgradeRequirement(pkg) if pkg.repository != 'aur': pkgdata = context.pkgs_data.get(pkg.name) if pkgdata: requirement.required_size = pkgdata['ds'] requirement.extra_size = pkgdata['s'] current_size = installed_sizes.get( pkg.name) if installed_sizes else None if current_size is not None and pkgdata['s'] is not None: requirement.extra_size = pkgdata['s'] - current_size required_by = set() if to_install and to_sync and context.pkgs_data: names = pkgdata.get('p', {pkg.name}) if pkgdata else {pkg.name} to_sync_deps_cache = {} for p in to_sync: if p != pkg.name and p in context.pkgs_data: deps = to_sync_deps_cache.get(p) if deps is None: deps = context.pkgs_data[p]['d'] if deps is None: deps = set() else: deps = { RE_DEP_OPERATORS.split(d)[0] for d in deps } to_sync_deps_cache[p] = deps if deps: for n in names: if n in deps: required_by.add(p) break requirement.reason = '{}: {}'.format( self.i18n['arch.info.required by'].capitalize(), ','.join(required_by) if required_by else '?') return requirement