|
| 1 | +from pathlib import Path |
| 2 | +import tomllib |
| 3 | +import json |
| 4 | + |
| 5 | +def resolve_version(friendly_version: str) -> str: |
| 6 | + """Resolve a friendly version like '3.10t' to an exact version like '3.10.12'.""" |
| 7 | + # Strip JIT for now as it's not recognized by pyenv |
| 8 | + is_free_threaded = friendly_version.endswith('t') |
| 9 | + is_jit = friendly_version.endswith('j') |
| 10 | + base_version = friendly_version.rstrip('jt') |
| 11 | + |
| 12 | + pyenv_versions = Path("/pyenv/plugins/python-build/share/python-build") |
| 13 | + |
| 14 | + matching_versions = [] |
| 15 | + |
| 16 | + for version_file in pyenv_versions.glob(f"{base_version}.*"): |
| 17 | + version_str = version_file.name |
| 18 | + |
| 19 | + if version_str.endswith("-dev"): |
| 20 | + continue |
| 21 | + |
| 22 | + if version_str.endswith("t") and is_free_threaded: |
| 23 | + matching_versions.append(version_str.rstrip('t')) |
| 24 | + elif not version_str.endswith("t"): |
| 25 | + matching_versions.append(version_str) |
| 26 | + |
| 27 | + if not matching_versions: |
| 28 | + raise ValueError(f"No matching versions found for base version '{base_version}'") |
| 29 | + |
| 30 | + # Sort versions to get the latest |
| 31 | + matching_versions.sort(key=lambda s: list(map(int, s.split('.')))) |
| 32 | + |
| 33 | + latest_version = matching_versions[-1] |
| 34 | + |
| 35 | + latest_version += 'j' if is_jit else '' |
| 36 | + latest_version += 't' if is_free_threaded else '' |
| 37 | + |
| 38 | + return latest_version |
| 39 | + |
| 40 | +if __name__ == "__main__": |
| 41 | + versions_toml_path = Path("/") / "versions.toml" |
| 42 | + |
| 43 | + if not versions_toml_path.exists(): |
| 44 | + raise FileNotFoundError(f"Could not find versions.toml at expected path: {versions_toml_path}") |
| 45 | + |
| 46 | + with versions_toml_path.open("rb") as f: |
| 47 | + versions_config = tomllib.load(f) |
| 48 | + |
| 49 | + friendly_versions = versions_config["config"]["versions"] |
| 50 | + |
| 51 | + resolved_versions = [ |
| 52 | + {"tag": v, "version": resolve_version(v)} for v in friendly_versions |
| 53 | + ] |
| 54 | + |
| 55 | + print(json.dumps(resolved_versions)) |
0 commit comments