| """This is @konstin's scripts for checking an entire checkout of ~2.1k packages for |
| panics, fix errors and similar problems. |
| |
| It's a less elaborate, more hacky version of check_ecosystem.py |
| """ |
| |
| from __future__ import annotations |
| |
| import json |
| import subprocess |
| import sys |
| from pathlib import Path |
| from subprocess import CalledProcessError |
| from typing import NamedTuple |
| |
| from tqdm import tqdm |
| |
| |
| class Repository(NamedTuple): |
| """A GitHub repository at a specific ref.""" |
| |
| org: str |
| repo: str |
| ref: str | None |
| |
| |
| def main() -> None: |
| ruff_args = sys.argv[1:] |
| checkouts = Path("checkouts") |
| out_dir = Path("ecosystem_all_results") |
| github_search_json = Path("github_search.jsonl") |
| # Somehow it doesn't like plain ruff |
| ruff = Path.cwd().joinpath("ruff") |
| |
| out_dir.mkdir(parents=True, exist_ok=True) |
| |
| repositories = [] |
| for line in github_search_json.read_text().splitlines(): |
| item = json.loads(line) |
| # Pick only the easier case for now. |
| if item["path"] != "pyproject.toml": |
| continue |
| repositories.append( |
| Repository( |
| item["owner"], |
| item["repo"], |
| item.get("ref"), |
| ), |
| ) |
| |
| successes = 0 |
| errors = 0 |
| for repository in tqdm(repositories): |
| project_dir = checkouts.joinpath(f"{repository.org}:{repository.repo}") |
| if not project_dir.is_dir(): |
| tqdm.write(f"Missing {project_dir}") |
| errors += 1 |
| continue |
| |
| try: |
| output = subprocess.run( |
| [ruff, *ruff_args, "."], |
| cwd=project_dir, |
| capture_output=True, |
| text=True, |
| ) |
| except CalledProcessError as e: |
| tqdm.write(f"Ruff failed on {project_dir}: {e}") |
| errors += 1 |
| continue |
| |
| org_repo = f"{repository.org}:{repository.repo}" |
| out_dir.joinpath(f"{org_repo}.stdout.txt").write_text(output.stdout) |
| out_dir.joinpath(f"{org_repo}.stderr.txt").write_text(output.stderr) |
| successes += 1 |
| print(f"Success: {successes} Error {errors}") |
| |
| |
| if __name__ == "__main__": |
| main() |