示例#1
0
    def uninstall(pilist: list,
                  ipmap: dict,
                  env: Environment = None,
                  logger: TextLogger = None):
        """
        Build the list of packages to uninstall.
        Dependencies are preserved (ie dependencies needed by other installed packages are kept)
        Packages are sorted for uninstall order.
        Returns a list of InstalledPackage
        """
        def _log(message):
            if logger is not None and logger.isverbose():
                logger.print_verbose(message)

        out = []
        # Build the list from installed packages
        DependencyUtils.__build_tree(pilist,
                                     ipmap,
                                     out,
                                     env=env,
                                     ignore_unknown=True)
        # for uninstall, reverse order
        out = list(reversed(out))

        # Remove read only packages
        ro_packages = list(filter(lambda ip: ip.read_only, out))
        if len(ro_packages) > 0 and logger is not None and logger.isverbose():
            logger.print_verbose("System package(s) cannot be uninstalled: " +
                                 ", ".join(map(str, ro_packages)))

        # Maintain dependencies
        other_pi_list = [
            ip.identifier for ip in ipmap.values() if ip not in out
        ]
        # Keep all configurations (ie env=None) for all other installed packages
        for needed_ip in DependencyUtils.installed(other_pi_list,
                                                   ipmap,
                                                   env=None,
                                                   ignore_unknown=True):
            if needed_ip in out:
                if logger is not None and logger.isverbose():
                    # Print packages which needs this package
                    rdepends = DependencyUtils.rdepends([needed_ip.identifier],
                                                        ipmap,
                                                        env=env)
                    _log(
                        "Cannot uninstall {ip.identifier} (dependency of {text})"
                        .format(ip=needed_ip,
                                text=", ".join(map(str, rdepends))))
                out.remove(needed_ip)
        out = [ip for ip in out if ip not in ro_packages]
        return out
示例#2
0
def download_and_verify_file(url: str,
                             output: Path,
                             logger: TextLogger = None,
                             hashstr: str = None):
    """
    Download an artifact and check its hash if given
    """
    if output.exists():
        if hashstr is None:
            logger.print_verbose(
                "File exists but cannot be verified, {file.name} will be re-downloaded"
                .format(file=output))
            os.remove(str(output))
        elif not hash_check(output, hashstr, raise_exception=False):
            logger.print_verbose(
                "File exists but hash differs, {file.name} will be re-downloaded"
                .format(file=output))
            os.remove(str(output))
        else:
            logger.print_verbose(
                "File {file.name} is already downloaded".format(file=output))

    if not output.exists():
        download_file(url, output, logger=logger)
        if hashstr:
            hash_check(output, hashstr, raise_exception=True)
    return output