예제 #1
0
    def fill_providers_deps(
            self, missing_deps: List[Tuple[str,
                                           str]], provided_map: Dict[str,
                                                                     Set[str]],
            remote_repo_map: Dict[str, str], already_checked: Set[str],
            remote_provided_map: Dict[str, Set[str]], deps_data: Dict[str,
                                                                      dict],
            aur_idx: Iterable[str], sort: bool, watcher: ProcessWatcher,
            automatch_providers: bool) -> List[Tuple[str, str]]:
        """
        :param missing_deps:
        :param provided_map:
        :param remote_repo_map:
        :param already_checked:
        :param remote_provided_map:
        :param deps_data:
        :param aur_idx:
        :param sort:
        :param watcher:
        :param automatch_providers
        :return: all deps sorted or None if the user declined the providers options
        """

        deps_providers = map_providers(
            {data[0]
             for data in missing_deps if data[1] == '__several__'},
            remote_provided_map)

        if deps_providers:
            all_providers = set()

            for providers in deps_providers.values():
                all_providers.update(providers)

            providers_repos = pacman.map_repositories(all_providers)
            selected_providers = confirmation.request_providers(
                deps_providers, providers_repos, watcher, self.i18n)

            if not selected_providers:
                return
            else:
                providers_data = pacman.map_updates_data(
                    selected_providers
                )  # adding the chosen providers to re-check the missing deps
                provided_map.update(
                    pacman.map_provided(remote=True, pkgs=selected_providers)
                )  # adding the providers as "installed" packages

                providers_deps = self.map_missing_deps(
                    pkgs_data=providers_data,
                    provided_map=provided_map,
                    aur_index=aur_idx,
                    deps_checked=already_checked,
                    deps_data=deps_data,
                    sort=False,
                    remote_provided_map=remote_provided_map,
                    remote_repo_map=remote_repo_map,
                    watcher=watcher,
                    choose_providers=True,
                    automatch_providers=automatch_providers)

                # cleaning the already mapped providers deps:
                to_remove = []

                for idx, dep in enumerate(missing_deps):
                    if dep[1] == '__several__':
                        to_remove.append(idx)

                for idx, to_remove in enumerate(to_remove):
                    del missing_deps[to_remove - idx]

                missing_deps.extend(((p, providers_repos.get(p, 'aur'))
                                     for p in selected_providers))

                for dep in providers_deps:
                    if dep not in missing_deps and dep[1] != '__several__':
                        missing_deps.append(dep)

                deps_data.update(providers_data)

                if not self.fill_providers_deps(
                        missing_deps=missing_deps,
                        provided_map=provided_map,
                        remote_repo_map=remote_repo_map,
                        already_checked=already_checked,
                        aur_idx=aur_idx,
                        remote_provided_map=remote_provided_map,
                        deps_data=deps_data,
                        sort=False,
                        watcher=watcher,
                        automatch_providers=automatch_providers):
                    return

                if sort:
                    missing_to_sort = {
                        d[0]
                        for d in missing_deps if d[1] != '__several__'
                    }
                    return sorting.sort(missing_to_sort, deps_data,
                                        provided_map)

        return missing_deps
예제 #2
0
    def fill_providers_deps(
            self, missing_deps: List[Tuple[str,
                                           str]], provided_map: Dict[str,
                                                                     Set[str]],
            remote_repo_map: Dict[str, str], already_checked: Set[str],
            remote_provided_map: Dict[str, Set[str]], deps_data: Dict[str,
                                                                      dict],
            aur_idx: Iterable[str], sort: bool, watcher: ProcessWatcher,
            automatch_providers: bool, prefer_repository_provider: bool
    ) -> Optional[List[Tuple[str, str]]]:
        """
        :param missing_deps:
        :param provided_map:
        :param remote_repo_map:
        :param already_checked:
        :param remote_provided_map:
        :param deps_data:
        :param aur_idx:
        :param sort:
        :param watcher:
        :param automatch_providers
        :param prefer_repository_provider
        :return: all deps sorted or None if the user declined the providers options
        """

        deps_providers = map_providers(
            {data[0]
             for data in missing_deps if data[1] == '__several__'},
            remote_provided_map)

        if deps_providers:
            providers_repos = {}
            repos_providers = set()

            for providers in deps_providers.values():
                for provider in providers:
                    if remote_repo_map.get(provider) == 'aur':
                        providers_repos[provider] = 'aur'
                    else:
                        repos_providers.add(provider)

            providers_repos.update(pacman.map_repositories(repos_providers))
            selected_providers = confirmation.request_providers(
                deps_providers, providers_repos, watcher, self.i18n)

            if not selected_providers:
                return
            else:
                # adding the chosen providers for re-checking the missing dependencies
                repo_selected, aur_selected = set(), set()

                for provider in selected_providers:
                    if provider in repos_providers:
                        repo_selected.add(provider)
                    else:
                        aur_selected.add(provider)

                providers_data = dict()

                if repo_selected:
                    providers_data.update(
                        pacman.map_updates_data(repo_selected))
                    # adding the providers as "installed" packages
                    provided_map.update(
                        pacman.map_provided(remote=True, pkgs=repo_selected))

                if aur_selected:
                    for pkgname, pkgdata in self.aur_client.gen_updates_data(
                            aur_selected):
                        providers_data[pkgname] = pkgdata
                        for provider in pkgdata[
                                'p']:  # adding the providers as "installed" packages
                            currently_provided = provided_map.get(
                                provider, set())
                            provided_map[provider] = currently_provided
                            currently_provided.add(pkgname)

                providers_deps = self.map_missing_deps(
                    pkgs_data=providers_data,
                    provided_map=provided_map,
                    aur_index=aur_idx,
                    deps_checked=already_checked,
                    deps_data=deps_data,
                    sort=False,
                    remote_provided_map=remote_provided_map,
                    remote_repo_map=remote_repo_map,
                    watcher=watcher,
                    choose_providers=True,
                    automatch_providers=automatch_providers,
                    prefer_repository_provider=prefer_repository_provider)

                if providers_deps is None:  # it means the user called off the installation process
                    return

                # cleaning the already mapped providers deps:
                to_remove = []

                for idx, dep in enumerate(missing_deps):
                    if dep[1] == '__several__':
                        to_remove.append(idx)

                for idx, to_remove in enumerate(to_remove):
                    del missing_deps[to_remove - idx]

                missing_deps.extend(((p, providers_repos.get(p, 'aur'))
                                     for p in selected_providers))

                for dep in providers_deps:
                    if dep not in missing_deps and dep[1] != '__several__':
                        missing_deps.append(dep)

                deps_data.update(providers_data)

                if not self.fill_providers_deps(
                        missing_deps=missing_deps,
                        provided_map=provided_map,
                        remote_repo_map=remote_repo_map,
                        already_checked=already_checked,
                        aur_idx=aur_idx,
                        remote_provided_map=remote_provided_map,
                        deps_data=deps_data,
                        sort=False,
                        watcher=watcher,
                        automatch_providers=automatch_providers,
                        prefer_repository_provider=prefer_repository_provider):
                    return

                if sort:
                    missing_to_sort = {
                        d[0]
                        for d in missing_deps if d[1] != '__several__'
                    }
                    return sorting.sort(missing_to_sort, deps_data,
                                        provided_map)

        return missing_deps