From b4f26ff549ecb2d7ec0e8d9d3746a06ba5d1ba24 Mon Sep 17 00:00:00 2001 From: yaoge123 Date: Sun, 17 May 2026 16:29:11 +0800 Subject: [PATCH 1/5] feat: add release_versions and pre_release_versions config options --- github-release.py | 78 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 17 deletions(-) diff --git a/github-release.py b/github-release.py index ea3cc7d..5675d0e 100755 --- a/github-release.py +++ b/github-release.py @@ -225,13 +225,26 @@ def link_latest(name: str, repo_dir: Path) -> None: if isinstance(cfg, str): cfg = {"repo": cfg} repo = cfg["repo"] - versions = cfg.get("versions", 1) # keep # of latest releases + versions = cfg.get("versions", 1) # keep # of latest releases (mixed) + release_versions = cfg.get("release_versions") # # of stable releases only + pre_release_versions = cfg.get("pre_release_versions") # # of pre-releases only flat = cfg.get("flat", False) # build a folder for each release tarball = cfg.get("tarball", False) # download source tarball prerelease = cfg.get("pre_release", False) # include pre-releases perpage = cfg.get("per_page", 0) # number of releases per page exclude_regexes = cfg.get("exclude", []) # list of file name regexes to exclude + # Determine mode: new fields take priority over versions + use_separate_limits = release_versions is not None or pre_release_versions is not None + if use_separate_limits: + max_release = release_versions if release_versions is not None else 0 + max_prerelease = pre_release_versions if pre_release_versions is not None else 0 + # When using separate limits, always include pre-releases + prerelease = True + else: + max_release = versions + max_prerelease = 0 + repo_dir = working_dir / Path(repo) logger.info(f"syncing {repo} to {repo_dir}") @@ -267,25 +280,56 @@ def release_generator(): break n_downloaded = 0 + n_release = 0 + n_prerelease = 0 try: for release in release_generator(): - if not release["draft"] and (prerelease or not release["prerelease"]): - name = ensure_safe_name(release["name"] or release["tag_name"]) - if len(name) == 0: - logger.error("Unnamed release") + if release["draft"]: + continue + is_prerelease = release["prerelease"] + if is_prerelease and not prerelease: + continue + + # Check version limits + if is_prerelease and max_prerelease > 0: + if n_prerelease >= max_prerelease: continue - total_size += process_release( - release, - (repo_dir if flat else repo_dir / name), - tarball, - exclude_regexes, - ) - if n_downloaded == 0 and not flat: - # create a symbolic link to the latest release folder - link_latest(name, repo_dir) - n_downloaded += 1 - if versions > 0 and n_downloaded >= versions: - break + elif not is_prerelease and max_release > 0: + if n_release >= max_release: + continue + elif max_release <= 0 and max_prerelease <= 0: + pass # unlimited + else: + # Mixed mode: skip if respective limit reached + if is_prerelease and max_prerelease <= 0: + continue + if not is_prerelease and max_release <= 0: + continue + + name = ensure_safe_name(release["name"] or release["tag_name"]) + if len(name) == 0: + logger.error("Unnamed release") + continue + total_size += process_release( + release, + (repo_dir if flat else repo_dir / name), + tarball, + exclude_regexes, + ) + if n_downloaded == 0 and not flat: + # create a symbolic link to the latest release folder + link_latest(name, repo_dir) + n_downloaded += 1 + if is_prerelease: + n_prerelease += 1 + else: + n_release += 1 + + # Check if both limits are reached + release_done = max_release > 0 and n_release >= max_release + prerelease_done = (not prerelease) or max_prerelease <= 0 or n_prerelease >= max_prerelease + if release_done and prerelease_done: + break if n_downloaded == 0: logger.error(f"No release version found for {repo}") continue From ace79739e13ac9c47030486f2f5d25d0b82f6848 Mon Sep 17 00:00:00 2001 From: yaoge123 Date: Sun, 17 May 2026 16:37:00 +0800 Subject: [PATCH 2/5] fix: default release_versions to 1 in separate mode --- github-release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/github-release.py b/github-release.py index 5675d0e..85d0ccc 100755 --- a/github-release.py +++ b/github-release.py @@ -237,7 +237,7 @@ def link_latest(name: str, repo_dir: Path) -> None: # Determine mode: new fields take priority over versions use_separate_limits = release_versions is not None or pre_release_versions is not None if use_separate_limits: - max_release = release_versions if release_versions is not None else 0 + max_release = release_versions if release_versions is not None else 1 max_prerelease = pre_release_versions if pre_release_versions is not None else 0 # When using separate limits, always include pre-releases prerelease = True From 307e11c5ab554c881de27b52549449d863b19030 Mon Sep 17 00:00:00 2001 From: yaoge123 Date: Sun, 17 May 2026 17:10:20 +0800 Subject: [PATCH 3/5] refactor: simplify version limit checking logic --- github-release.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/github-release.py b/github-release.py index 85d0ccc..581276c 100755 --- a/github-release.py +++ b/github-release.py @@ -291,19 +291,15 @@ def release_generator(): continue # Check version limits - if is_prerelease and max_prerelease > 0: - if n_prerelease >= max_prerelease: + if is_prerelease: + if max_prerelease == 0: continue - elif not is_prerelease and max_release > 0: - if n_release >= max_release: + if max_prerelease > 0 and n_prerelease >= max_prerelease: continue - elif max_release <= 0 and max_prerelease <= 0: - pass # unlimited else: - # Mixed mode: skip if respective limit reached - if is_prerelease and max_prerelease <= 0: + if max_release == 0: continue - if not is_prerelease and max_release <= 0: + if max_release > 0 and n_release >= max_release: continue name = ensure_safe_name(release["name"] or release["tag_name"]) From 8b8fc89603c7c571de02cf0a541b494f2a25a376 Mon Sep 17 00:00:00 2001 From: yaoge123 Date: Sun, 17 May 2026 17:17:24 +0800 Subject: [PATCH 4/5] fix: preserve legacy mode behavior for version limits In legacy mode (use_separate_limits=False), use the single n_downloaded counter against versions for all releases. The separate max_prerelease=0 was incorrectly skipping pre-releases in legacy mode when pre_release=True. --- github-release.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/github-release.py b/github-release.py index 581276c..24036c9 100755 --- a/github-release.py +++ b/github-release.py @@ -291,15 +291,17 @@ def release_generator(): continue # Check version limits - if is_prerelease: - if max_prerelease == 0: - continue - if max_prerelease > 0 and n_prerelease >= max_prerelease: - continue + if use_separate_limits: + # Separate limits mode: skip if respective cap is 0 or reached + if is_prerelease: + if max_prerelease == 0 or n_prerelease >= max_prerelease: + continue + else: + if max_release == 0 or n_release >= max_release: + continue else: - if max_release == 0: - continue - if max_release > 0 and n_release >= max_release: + # Legacy mode: single counter against versions + if versions > 0 and n_downloaded >= versions: continue name = ensure_safe_name(release["name"] or release["tag_name"]) @@ -321,11 +323,15 @@ def release_generator(): else: n_release += 1 - # Check if both limits are reached - release_done = max_release > 0 and n_release >= max_release - prerelease_done = (not prerelease) or max_prerelease <= 0 or n_prerelease >= max_prerelease - if release_done and prerelease_done: - break + # Check if done + if use_separate_limits: + release_done = max_release > 0 and n_release >= max_release + prerelease_done = max_prerelease == 0 or n_prerelease >= max_prerelease + if release_done and prerelease_done: + break + else: + if versions > 0 and n_downloaded >= versions: + break if n_downloaded == 0: logger.error(f"No release version found for {repo}") continue From 9383fa689959a5c9668e823cf8163567aa10fbf8 Mon Sep 17 00:00:00 2001 From: yaoge123 Date: Sun, 17 May 2026 17:28:03 +0800 Subject: [PATCH 5/5] fix: handle -1 (unlimited) correctly in separate limits mode When a limit is -1, the skip check should never trigger and the done check should never be satisfied, allowing unlimited syncing for that category. --- github-release.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/github-release.py b/github-release.py index 24036c9..e23f6f8 100755 --- a/github-release.py +++ b/github-release.py @@ -293,11 +293,16 @@ def release_generator(): # Check version limits if use_separate_limits: # Separate limits mode: skip if respective cap is 0 or reached + # -1 means unlimited if is_prerelease: - if max_prerelease == 0 or n_prerelease >= max_prerelease: + if max_prerelease == 0: + continue + if max_prerelease > 0 and n_prerelease >= max_prerelease: continue else: - if max_release == 0 or n_release >= max_release: + if max_release == 0: + continue + if max_release > 0 and n_release >= max_release: continue else: # Legacy mode: single counter against versions @@ -325,8 +330,8 @@ def release_generator(): # Check if done if use_separate_limits: - release_done = max_release > 0 and n_release >= max_release - prerelease_done = max_prerelease == 0 or n_prerelease >= max_prerelease + release_done = max_release == 0 or (max_release > 0 and n_release >= max_release) + prerelease_done = max_prerelease == 0 or (max_prerelease > 0 and n_prerelease >= max_prerelease) if release_done and prerelease_done: break else: