Пример #1
0
    def unmark_packages(self, unmark_names: Set[str]) -> None:
        skipped_essential = set()
        skipped_filtered = set()

        for package in self.cache.get_changes():
            if package.candidate is None:
                raise errors.PackageNotFoundError(package.name)

            if package.candidate.priority == "essential":
                # Filter 'essential' packages.
                skipped_essential.add(package.name)
                package.mark_keep()
                continue

            if package.name in unmark_names:
                # Filter packages from given list.
                skipped_filtered.add(package.name)
                package.mark_keep()
                continue

        if skipped_essential:
            logger.debug(
                f"Skipping priority essential packages: {sorted(skipped_essential)}"
            )

        if skipped_filtered:
            logger.debug(
                f"Skipping filtered manifest packages: {sorted(skipped_filtered)}"
            )

        # Unmark dependencies that are no longer required.
        self._autokeep_packages()
Пример #2
0
 def _set_pkg_version(self, package: apt.Package, version: str) -> None:
     # Set candidate version to a specific version if available
     if version in package.versions:
         package_version = package.versions.get(version)
         package.candidate = package_version
     else:
         raise errors.PackageNotFoundError("{}={}".format(
             package.name, version))
Пример #3
0
    def _verify_marked_install(self, package: apt.Package):
        if not package.installed and not package.marked_install:
            broken_deps: List[str] = list()

            if package.candidate is None:
                raise errors.PackageNotFoundError(package.name)

            for package_dependencies in package.candidate.dependencies:
                for dep in package_dependencies:
                    if not dep.target_versions:
                        broken_deps.append(dep.name)
            raise errors.PackageBrokenError(package.name, broken_deps)
Пример #4
0
    def fetch_archives(self,
                       download_path: Path) -> List[Tuple[str, str, Path]]:
        """Fetches archives, list of (<package-name>, <package-version>, <dl-path>)."""
        downloaded = list()
        for package in self.cache.get_changes():
            try:
                dl_path = package.candidate.fetch_binary(
                    str(download_path))  # type: ignore
            except apt.package.FetchError as e:
                raise errors.PackageFetchError(str(e))

            if package.candidate is None:
                raise errors.PackageNotFoundError(package.name)

            downloaded.append(
                (package.name, package.candidate.version, Path(dl_path)))
        return downloaded
Пример #5
0
    def mark_packages(self, package_names: Set[str]) -> None:
        for name in package_names:
            if name.endswith(":any"):
                name = name[:-4]

            if self.cache.is_virtual_package(name):
                name = self.cache.get_providing_packages(name)[0].name

            logger.debug(
                "Marking {!r} (and its dependencies) to be fetched".format(
                    name))

            name_arch, version = get_pkg_name_parts(name)
            if name_arch not in self.cache:
                raise errors.PackageNotFoundError(name_arch)

            package = self.cache[name_arch]
            if version is not None:
                self._set_pkg_version(package, version)

            logger.debug(f"package: {package!r}")

            # Disable automatic resolving of broken packages here
            # because if that fails it raises a SystemError and the
            # API doesn't expose enough information about the problem.
            # Instead we let apt-get show a verbose error message later.
            # Also, make sure this package is marked as auto-installed,
            # which will propagate to its dependencies.
            package.mark_install(auto_fix=False, from_user=False)

            # Now mark this package as NOT automatically installed, which
            # will leave its dependencies marked as auto-installed, which
            # allows us to clean them up if necessary.
            package.mark_auto(False)

            self._verify_marked_install(package)
Пример #6
0
    def test_invalid_package_requested(self):
        self.fake_apt_cache.return_value.__enter__.return_value.mark_packages.side_effect = errors.PackageNotFoundError(
            "package-invalid")

        self.assertRaises(
            errors.BuildPackageNotFoundError,
            repo.Ubuntu.install_build_packages,
            ["package-invalid"],
        )