72 lines
2.1 KiB
Python
Executable File
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()
|