| from subprocess import check_output, check_call |
| from typing import List |
| |
| import json |
| import os |
| import pandas as pd |
| import sys |
| |
| from packaging.version import Version |
| |
| |
| VERSIONS_TO_KEEP = 5 |
| PACKAGES = [ |
| "arrow-cpp", |
| "arrow-cpp-proc", |
| "parquet-cpp", |
| "pyarrow", |
| "pyarrow-tests", |
| "r-arrow", |
| ] |
| PLATFORMS = [ |
| "linux-64", |
| "linux-aarch64", |
| "osx-64", |
| "win-64", |
| ] |
| EXCLUDED_PATTERNS = [ |
| ["r-arrow", "linux-aarch64"], |
| ] |
| |
| |
| def packages_to_delete(package_name: str, platform: str) -> List[str]: |
| env = os.environ.copy() |
| env["CONDA_SUBDIR"] = platform |
| pkgs_json = check_output( |
| [ |
| "conda", |
| "search", |
| "--json", |
| "-c", |
| "arrow-nightlies", |
| "--override-channels", |
| package_name, |
| ], |
| env=env, |
| ) |
| pkgs = pd.DataFrame(json.loads(pkgs_json)[package_name]) |
| pkgs["version"] = pkgs["version"].map(Version) |
| pkgs["py_version"] = pkgs["build"].str.slice(0, 4) |
| |
| to_delete = [] |
| |
| for (subdir, python), group in pkgs.groupby(["subdir", "py_version"]): |
| group = group.sort_values(by="version", ascending=False) |
| |
| if len(group) > VERSIONS_TO_KEEP: |
| del_candidates = group[VERSIONS_TO_KEEP:] |
| to_delete += ( |
| f"arrow-nightlies/{package_name}/" |
| + del_candidates["version"].astype(str) |
| + del_candidates["url"].str.replace( |
| "https://conda.anaconda.org/arrow-nightlies", "" |
| ) |
| ).to_list() |
| |
| return to_delete |
| |
| |
| if __name__ == "__main__": |
| to_delete = [] |
| for package in PACKAGES: |
| for platform in PLATFORMS: |
| if [package, platform] in EXCLUDED_PATTERNS: |
| continue |
| to_delete += packages_to_delete(package, platform) |
| |
| for name in to_delete: |
| print(f"Deleting {name} …") |
| if "FORCE" in sys.argv: |
| check_call(["anaconda", "remove", "-f", name]) |