hurl/bin/check/rust_version.py

72 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import datetime
import json
import os
import sys
import requests
def get_latest_release(token: str | None) -> None | tuple[str, datetime]:
"""Returns the latest Rust release available."""
url = "https://api.github.com/repos/rust-lang/rust/releases"
headers = {}
if token:
headers["Authorization"] = f"Bearer {token}"
r = requests.get(url, headers=headers)
if r.status_code != 200:
sys.stderr.write(f"Error GET {url} {r.status_code}\n")
sys.stderr.write(f"{r.text}\n")
return None
releases = json.loads(r.text)
latest_release = releases[0]
version = latest_release["tag_name"]
date_str = latest_release["published_at"]
date = datetime.datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ")
return version, date
def get_current_version() -> str:
"""Returns the current Rust version used by the project."""
return os.popen("cargo --version").read().split(" ")[1]
def main():
parser = argparse.ArgumentParser(
description="Check if Hurl uses the latest Rust version"
)
parser.add_argument(
"num_days_before_error",
type=int,
metavar="NUM_DAYS_BEFORE_ERROR",
help="Interval in days before raising an error if Hurl is not using latest Rust",
)
parser.add_argument("--token", help="GitHub authentication token")
args = parser.parse_args()
num_days_before_error = args.num_days_before_error
token = args.token
ret = get_latest_release(token=token)
if not ret:
sys.exit(2)
latest_version, date = ret
current_version = get_current_version()
if current_version < latest_version:
sys.stderr.write(
f"Rust version must be updated from {current_version} to the latest version {latest_version}\n"
)
days_before_now = datetime.datetime.now() - date
if days_before_now > datetime.timedelta(days=num_days_before_error):
sys.exit(1)
else:
sys.stderr.write(f"Latest Rust version: {latest_version}\n")
sys.stderr.write(f"Hurl Rust version: {current_version}\n")
if __name__ == "__main__":
main()