예제 #1
0
    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)
예제 #2
0
    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