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
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