import fs from "fs-extra"; import path from "path"; import { fileURLToPath } from "url"; import fetch from "node-fetch"; import dotenv from "dotenv"; dotenv.config({ path: "./.env" }); const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const version = process.argv[2]; if (!version) { console.error("Version not passed to create-gitea-release.js"); process.exit(1); } const { GITEA_URL, GITEA_USERNAME, GITEA_REPO, GITEA_TOKEN } = process.env; if (!GITEA_URL || !GITEA_USERNAME || !GITEA_REPO || !GITEA_TOKEN) { console.error("Missing required environment variables"); process.exit(1); } const getChangelogContent = async () => { try { const changelogPath = path.resolve(__dirname, "../CHANGELOG.md"); const content = await fs.readFile(changelogPath, "utf8"); // Extract the section for the current version const versionHeading = `## [${version}]`; const sections = content.split(/(?=^## \[)/m); // Split at version headings if (sections.length < 2) { console.warn("Couldn't find version section in changelog"); return "No changelog content available."; } // The first section is the latest version const latestSection = sections[1]; return latestSection.trim(); } catch (err) { console.error("Error reading changelog:", err); return "No changelog content available."; } }; const createOrUpdateRelease = async (releaseNotes) => { const tagName = `v${version}`; const apiBase = `https://${GITEA_URL}/api/v1/repos/${GITEA_USERNAME}/${GITEA_REPO}`; try { const existing = await fetch(`${apiBase}/releases/tags/${tagName}`, { headers: { Authorization: `token ${GITEA_TOKEN}` }, }); if (existing.ok) { // Update existing release const existingRelease = await existing.json(); console.log(`Updating existing release ${tagName}`); const response = await fetch( `${apiBase}/releases/${existingRelease.id}`, { method: "PATCH", headers: { Authorization: `token ${GITEA_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: tagName, body: releaseNotes, draft: false, prerelease: false, // Change to true if you want prereleases }), } ); if (!response.ok) throw new Error(`Failed to update release: ${response.status}`); const release = await response.json(); console.log("Release updated:", release.html_url); return release; } else if (existing.status === 404) { // Create new release console.log(`Creating new release ${tagName}`); const response = await fetch(`${apiBase}/releases`, { method: "POST", headers: { Authorization: `token ${GITEA_TOKEN}`, "Content-Type": "application/json", }, body: JSON.stringify({ tag_name: tagName, name: `Release ${version}`, body: releaseNotes, draft: false, prerelease: false, // Change to true if you want prereleases }), }); if (!response.ok) throw new Error(`Failed to create release: ${response.status}`); const release = await response.json(); console.log("Release created:", release.html_url); return release; } else { throw new Error(`Failed to check release: ${existing.status}`); } } catch (error) { console.error("Error in createOrUpdateRelease:", error); throw error; } }; (async () => { try { const releaseNotes = await getChangelogContent(); await createOrUpdateRelease(releaseNotes); } catch (error) { console.error("Release failed:", error); process.exit(1); } })();