|
import requests |
|
from functools import lru_cache |
|
from packaging.version import parse |
|
import os |
|
|
|
TOKEN = os.getenv("GITHUB_TOKEN", None) |
|
HEADERS = {"Authorization": f"token {TOKEN}"} if TOKEN else {} |
|
|
|
|
|
@lru_cache() |
|
def fetch_all_branches(user, repo): |
|
branches = [] |
|
page = 1 |
|
while True: |
|
|
|
response = requests.get( |
|
f"https://api.github.com/repos/{user}/{repo}/branches", params={"page": page}, headers=HEADERS |
|
) |
|
|
|
|
|
if response.status_code == 200: |
|
|
|
branches.extend([branch["name"] for branch in response.json()]) |
|
|
|
|
|
if "next" in response.links: |
|
page += 1 |
|
else: |
|
break |
|
else: |
|
print("Failed to retrieve branches:", response.status_code) |
|
break |
|
|
|
return branches |
|
|
|
|
|
def fetch_github_info(repo_url): |
|
|
|
repo_parts = repo_url.rstrip("/").split("/") |
|
owner, repo = repo_parts[-2], repo_parts[-1] |
|
print(f"{owner=}, {repo=}") |
|
|
|
|
|
api_url = f"https://api.github.com/repos/{owner}/{repo}" |
|
|
|
try: |
|
|
|
tags_response = requests.get(f"{api_url}/tags", headers=HEADERS) |
|
tags_response.raise_for_status() |
|
tags = tags_response.json() |
|
|
|
if len(tags) < 2: |
|
raise ValueError("Not enough tags to fetch the second last tag.") |
|
|
|
second_last_tag = tags[1]["name"] |
|
|
|
|
|
branches = fetch_all_branches(user=owner, repo=repo) |
|
if not branches: |
|
raise ValueError("No branches found.") |
|
|
|
filtered_branches = [] |
|
for branch in branches: |
|
if branch.startswith("v") and ("-release" in branch or "-patch" in branch): |
|
filtered_branches.append(branch) |
|
if not filtered_branches: |
|
raise ValueError("No release branches found.") |
|
|
|
sorted_branches = sorted(filtered_branches, key=lambda x: parse(x.split("-")[0][1:]), reverse=True) |
|
latest_release_branch = sorted_branches[0] |
|
|
|
return {"second_last_tag": second_last_tag, "latest_release_branch": latest_release_branch} |
|
|
|
except requests.exceptions.RequestException as e: |
|
print(f"Error fetching data from GitHub: {e}") |
|
return None |
|
except ValueError as e: |
|
print(e) |
|
return None |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
repo_url = "https://github.com/huggingface/diffusers" |
|
info = fetch_github_info(repo_url) |
|
|
|
if info: |
|
print("Second Last Tag:", info["second_last_tag"]) |
|
print("Latest Release Branch:", info["latest_release_branch"]) |
|
|