Files
VoiceStudio/scripts/clear-release-rerun-assets.py

53 lines
2.3 KiB
Python

"""Remove only this build/target's colliding installers before a release retry."""
import argparse
import json
import re
import subprocess
def matching_assets(names, version, target):
versions = [version]
updater = None
if target == "x86_64-pc-windows-msvc":
versions.append(version.replace("-", "."))
suffix = r"x64(?:_[A-Za-z-]+\.msi(?:\.zip)?|-setup\.(?:exe|nsis\.zip))(?:\.sig)?"
elif target == "aarch64-apple-darwin":
suffix = r"aarch64\.dmg(?:\.sig)?"
updater = re.compile(r"VoiceStudio_aarch64\.app\.tar\.gz(?:\.sig)?")
elif target == "x86_64-apple-darwin":
suffix = r"x64\.dmg(?:\.sig)?"
updater = re.compile(r"VoiceStudio_x64\.app\.tar\.gz(?:\.sig)?")
elif target == "x86_64-unknown-linux-gnu":
suffix = r"amd64\.(?:AppImage(?:\.tar\.gz)?|deb)(?:\.sig)?"
else:
raise ValueError(f"Unsupported release target: {target}")
pattern = re.compile(r"VoiceStudio_(?:" + "|".join(map(re.escape, versions)) + ")_" + suffix)
# macOS updater archives have no version in their names. The release tag
# scopes their version; only this target's architecture may be replaced.
return [name for name in names if pattern.fullmatch(name) or (updater and updater.fullmatch(name))]
def clear_assets(tag, version, target):
result = subprocess.run(["gh", "release", "view", tag, "--json", "assets"],
capture_output=True, text=True)
if result.returncode:
if "HTTP 404" in result.stderr or "release not found" in result.stderr.lower():
return
raise RuntimeError(result.stderr)
names = [asset["name"] for asset in json.loads(result.stdout)["assets"]]
for name in matching_assets(names, version, target):
result = subprocess.run(["gh", "release", "delete-asset", tag, name, "--yes"],
capture_output=True, text=True)
if result.returncode and "HTTP 404" not in result.stderr:
raise RuntimeError(result.stderr)
print(f"Cleared retry asset: {name}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--tag", required=True)
parser.add_argument("--version", required=True)
parser.add_argument("--target", required=True)
args = parser.parse_args()
clear_assets(args.tag, args.version, args.target)