1 Commits

+22 -16
View File
@@ -103,24 +103,24 @@ def _gitea_api(base: str, token: str, method: str, path: str, payload: dict | No
def _upload_asset(base: str, token: str, repo: str, release_id: int, path: Path) -> None: def _upload_asset(base: str, token: str, repo: str, release_id: int, path: Path) -> None:
boundary = "----evosci-release" # curl -F: urllib's hand-rolled multipart gets a 403 from Gitea
data = path.read_bytes() subprocess.run(
body = ( [
f"--{boundary}\r\n" "curl",
f'Content-Disposition: form-data; name="attachment"; filename="{path.name}"\r\n' "-sS",
f"Content-Type: application/octet-stream\r\n\r\n" "-f",
).encode() + data + f"\r\n--{boundary}--\r\n".encode() "-X",
req = urllib.request.Request( "POST",
"-H",
f"Authorization: token {token}",
"-F",
f"attachment=@{path}",
f"{base}/api/v1/repos/{repo}/releases/{release_id}/assets?name={path.name}", f"{base}/api/v1/repos/{repo}/releases/{release_id}/assets?name={path.name}",
data=body, ],
method="POST", check=True,
headers={ capture_output=True,
"Authorization": f"token {token}", text=True,
"Content-Type": f"multipart/form-data; boundary={boundary}",
},
) )
with urllib.request.urlopen(req, timeout=300):
pass
def main(argv=None, *, run=subprocess.run, repo_root: Path | None = None) -> int: def main(argv=None, *, run=subprocess.run, repo_root: Path | None = None) -> int:
@@ -269,6 +269,12 @@ def main(argv=None, *, run=subprocess.run, repo_root: Path | None = None) -> int
body = "\n\n".join(notes) or f"Release v{target}" body = "\n\n".join(notes) or f"Release v{target}"
if args.breaking_db: if args.breaking_db:
body = "BREAKING-DB\n\n" + body body = "BREAKING-DB\n\n" + body
try:
rel = _gitea_api(base, token, "GET", f"/repos/{repo}/releases/tags/v{target}")
print(f" reusing existing release v{target} (id {rel['id']})")
except urllib.error.HTTPError as e:
if e.code != 404:
raise
rel = _gitea_api( rel = _gitea_api(
base, base,
token, token,