import { readFileSync } from "node:fs" const tag = process.env.RELEASE_TAG?.trim() const releaseName = process.env.RELEASE_NAME?.trim() || tag const bodyFile = process.env.RELEASE_BODY_FILE?.trim() || ".gitea-release-notes.md" const serverUrl = process.env.GITHUB_SERVER_URL?.trim() const repository = process.env.GITHUB_REPOSITORY?.trim() const token = process.env.GITEA_RELEASE_TOKEN?.trim() if (!tag) { throw new Error("RELEASE_TAG is required") } if (!serverUrl || !repository) { throw new Error("GITHUB_SERVER_URL and GITHUB_REPOSITORY are required") } if (!token) { throw new Error("GITEA_RELEASE_TOKEN is required") } const body = readFileSync(bodyFile, "utf8") const baseApi = `${serverUrl.replace(/\/$/, "")}/api/v1/repos/${repository}` async function request(path, options = {}) { const response = await fetch(`${baseApi}${path}`, { ...options, headers: { "content-type": "application/json", authorization: `token ${token}`, ...(options.headers ?? {}), }, }) return response } const payload = { tag_name: tag, target_commitish: "main", name: releaseName, body, draft: false, prerelease: false, } const existingResponse = await request(`/releases/tags/${encodeURIComponent(tag)}`) if (existingResponse.ok) { const existing = await existingResponse.json() const updateResponse = await request(`/releases/${existing.id}`, { method: "PATCH", body: JSON.stringify({ ...payload, target_commitish: existing.target_commitish ?? payload.target_commitish, }), }) if (!updateResponse.ok) { const message = await updateResponse.text() throw new Error(`Failed to update release: ${updateResponse.status} ${message}`) } console.log(`Updated release for tag ${tag}`) } else if (existingResponse.status === 404) { const createResponse = await request("/releases", { method: "POST", body: JSON.stringify(payload), }) if (!createResponse.ok) { const message = await createResponse.text() throw new Error(`Failed to create release: ${createResponse.status} ${message}`) } console.log(`Created release for tag ${tag}`) } else { const message = await existingResponse.text() throw new Error(`Failed to query existing release: ${existingResponse.status} ${message}`) }