|
31 | 31 | if 'tag_name' not in data: |
32 | 32 | raise ValueError("tag_name not present in latest_url") |
33 | 33 |
|
| 34 | +import urllib.request |
| 35 | +import json |
| 36 | +import semver |
| 37 | + |
| 38 | +def get_latest_v1_tag_name(repo_owner, repo_name, allow_prerelease: bool = False): |
| 39 | + """ |
| 40 | + Fetches the latest v1 release tag_name from a GitHub repository's releases. |
| 41 | +
|
| 42 | + Args: |
| 43 | + repo_owner (str): The owner of the GitHub repository (e.g., 'syncthing'). |
| 44 | + repo_name (str): The name of the GitHub repository (e.g., 'syncthing'). |
| 45 | +
|
| 46 | + Returns: |
| 47 | + str or None: The tag_name of the latest v1 release, or None if not found. |
| 48 | + """ |
| 49 | + url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/releases" |
| 50 | + try: |
| 51 | + with urllib.request.urlopen(url) as response: |
| 52 | + if response.getcode() == 200: |
| 53 | + data = json.loads(response.read().decode('utf-8')) |
| 54 | + else: |
| 55 | + print(f"Error fetching data: HTTP {response.getcode()}") |
| 56 | + return None |
| 57 | + except urllib.error.URLError as e: |
| 58 | + print(f"Error connecting to GitHub API: {e.reason}") |
| 59 | + return None |
| 60 | + except json.JSONDecodeError: |
| 61 | + print("Error decoding JSON response.") |
| 62 | + return None |
| 63 | + |
| 64 | + v1_releases = [] |
| 65 | + for release in data: |
| 66 | + tag_name = release.get('tag_name') |
| 67 | + prerelease = release.get('prerelease') |
| 68 | + |
| 69 | + if tag_name: |
| 70 | + try: |
| 71 | + version = semver.Version.parse(tag_name.lstrip('v')) # Remove 'v' prefix if present |
| 72 | + if allow_prerelease and version.major == 1 and version.prerelease: |
| 73 | + v1_releases.append(version) |
| 74 | + elif version.major == 1: |
| 75 | + v1_releases.append(version) |
| 76 | + except ValueError: |
| 77 | + # Not a valid semver string, skip |
| 78 | + continue |
| 79 | + |
| 80 | + if not v1_releases: |
| 81 | + return None |
| 82 | + |
| 83 | + # Sort the prereleases to find the latest |
| 84 | + latest_v1_release = max(v1_releases) |
| 85 | + return f"v{latest_v1_release}" # Re-add the 'v' prefix for consistency |
| 86 | + |
34 | 87 | ### |
35 | 88 | # Parse the tag version and generate CFBundleShortVersionString and CFBundleVersion |
36 | 89 | ### |
| 90 | +owner = "syncthing" |
| 91 | +repo = "syncthing" |
| 92 | +latest_tag = get_latest_v1_tag_name(owner, repo) |
| 93 | + |
| 94 | +if latest_tag: |
| 95 | + print(f"The latest v1 release tag_name for {owner}/{repo} is: {latest_tag}") |
| 96 | +else: |
| 97 | + print(f"No v1 release found for {owner}/{repo}.") |
37 | 98 |
|
38 | 99 | # Ugly hack because of https://github.com/python-semver/python-semver/issues/137 |
39 | | -tag_name = data['tag_name'].replace('v', '') |
| 100 | +tag_name = latest_tag.replace('v', '') |
40 | 101 | version = semver.VersionInfo.parse(tag_name) |
41 | 102 |
|
42 | | -CFBundleShortVersionString = "{}-{:d}".format( |
| 103 | +CFBundleShortVersionString = "{}+{:d}".format( |
43 | 104 | str(version), |
44 | 105 | distVersion) |
45 | 106 | CFBundleVersion = "{:d}{:03d}{:03d}{:02d}".format( |
|
0 commit comments