Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 66 additions & 15 deletions github-release.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 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
else:
max_release = versions
max_prerelease = 0

repo_dir = working_dir / Path(repo)
logger.info(f"syncing {repo} to {repo_dir}")

Expand Down Expand Up @@ -267,23 +280,61 @@ 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 use_separate_limits:
# Separate limits mode: skip if respective cap is 0 or reached
# -1 means unlimited
if is_prerelease:
if max_prerelease == 0:
continue
if max_prerelease > 0 and n_prerelease >= max_prerelease:
continue
else:
if max_release == 0:
continue
if max_release > 0 and n_release >= max_release:
continue
else:
# Legacy mode: single counter against versions
if versions > 0 and n_downloaded >= versions:
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

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 done
if use_separate_limits:
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:
if versions > 0 and n_downloaded >= versions:
break
if n_downloaded == 0:
Expand Down
Loading