149 lines
5.1 KiB
Bash
Executable file
149 lines
5.1 KiB
Bash
Executable file
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
# Post-commit hook for bumpver to create a Forgejo release
|
|
# This script creates a release on Forgejo using the changelog generated in the pre-commit hook
|
|
|
|
# Configuration
|
|
FORGEJO_URL="https://servala.app.codey.ch"
|
|
REPO_OWNER="servala"
|
|
REPO_NAME="servala-portal"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Check for required environment variable
|
|
if [ -z "${FORGEJO_TOKEN:-}" ]; then
|
|
echo -e "${RED}Error: FORGEJO_TOKEN environment variable is not set${NC}"
|
|
echo "Please set FORGEJO_TOKEN to your Forgejo API token"
|
|
exit 1
|
|
fi
|
|
|
|
# Get the current version from pyproject.toml
|
|
CURRENT_VERSION=$(grep -E 'current_version = ".*"' pyproject.toml | head -1 | sed -E 's/current_version = "(.*)"/\1/')
|
|
echo -e "${GREEN}Creating release for version: ${CURRENT_VERSION}${NC}"
|
|
|
|
# Get the latest tag (should match CURRENT_VERSION)
|
|
LATEST_TAG=$(git tag -l --sort=-v:refname | head -1)
|
|
if [ "$LATEST_TAG" != "$CURRENT_VERSION" ]; then
|
|
echo -e "${YELLOW}Warning: Latest tag (${LATEST_TAG}) doesn't match current version (${CURRENT_VERSION})${NC}"
|
|
echo -e "${YELLOW}Using current version: ${CURRENT_VERSION}${NC}"
|
|
fi
|
|
|
|
# Try to read the changelog generated by the pre-commit hook
|
|
CHANGELOG_DIR=".git/changelog"
|
|
CHANGELOG_FILE="${CHANGELOG_DIR}/${CURRENT_VERSION}.txt"
|
|
|
|
if [ -f "$CHANGELOG_FILE" ]; then
|
|
CHANGELOG_CONTENT=$(cat "$CHANGELOG_FILE")
|
|
echo -e "${GREEN}Found changelog content from pre-commit hook${NC}"
|
|
else
|
|
echo -e "${YELLOW}Warning: Changelog file not found at ${CHANGELOG_FILE}${NC}"
|
|
echo -e "${YELLOW}Generating changelog from tag information${NC}"
|
|
|
|
# Fallback: use git log to get commits since previous tag
|
|
PREVIOUS_TAG=$(git tag -l --sort=-v:refname | head -2 | tail -1)
|
|
if [ -n "$PREVIOUS_TAG" ]; then
|
|
CHANGELOG_CONTENT=$(git log --pretty=format:"* %s" "${PREVIOUS_TAG}..${LATEST_TAG}")
|
|
else
|
|
CHANGELOG_CONTENT="* Initial release"
|
|
fi
|
|
fi
|
|
|
|
# Convert AsciiDoc to Markdown
|
|
# 1. Convert === headers to ### (third-level headers)
|
|
# 2. Convert link:url[text] to [text](url)
|
|
CHANGELOG_MARKDOWN=$(echo "$CHANGELOG_CONTENT" | sed -E 's/^=== /### /g' | sed -E 's/link:([^[]+)\[([^]]+)\]/[\2](\1)/g')
|
|
|
|
# Create release body in Markdown format
|
|
RELEASE_BODY="## Release ${CURRENT_VERSION}
|
|
|
|
${CHANGELOG_MARKDOWN}
|
|
"
|
|
|
|
# Check if release already exists
|
|
API_URL="${FORGEJO_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases/tags/${CURRENT_VERSION}"
|
|
EXISTING_RELEASE=$(curl -s -H "Authorization: token ${FORGEJO_TOKEN}" "${API_URL}")
|
|
|
|
# Check if we got a release back (not an error)
|
|
if echo "$EXISTING_RELEASE" | jq -e '.id' > /dev/null 2>&1; then
|
|
echo -e "${YELLOW}Release ${CURRENT_VERSION} already exists${NC}"
|
|
RELEASE_ID=$(echo "$EXISTING_RELEASE" | jq -r '.id')
|
|
echo -e "${GREEN}Updating existing release (ID: ${RELEASE_ID})${NC}"
|
|
|
|
# Update the existing release
|
|
UPDATE_URL="${FORGEJO_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases/${RELEASE_ID}"
|
|
|
|
RESPONSE=$(curl -s -X PATCH \
|
|
-H "Authorization: token ${FORGEJO_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$(jq -n \
|
|
--arg tag "${CURRENT_VERSION}" \
|
|
--arg name "Release ${CURRENT_VERSION}" \
|
|
--arg body "${RELEASE_BODY}" \
|
|
'{
|
|
tag_name: $tag,
|
|
name: $name,
|
|
body: $body
|
|
}')" \
|
|
"${UPDATE_URL}")
|
|
|
|
if echo "$RESPONSE" | jq -e '.id' > /dev/null 2>&1; then
|
|
RELEASE_URL=$(echo "$RESPONSE" | jq -r '.html_url')
|
|
echo -e "${GREEN}Release updated successfully!${NC}"
|
|
echo -e "${GREEN}Release URL: ${RELEASE_URL}${NC}"
|
|
else
|
|
echo -e "${RED}Error updating release${NC}"
|
|
echo "$RESPONSE" | jq .
|
|
exit 1
|
|
fi
|
|
else
|
|
echo -e "${GREEN}Creating new release${NC}"
|
|
|
|
# Create new release
|
|
CREATE_URL="${FORGEJO_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/releases"
|
|
|
|
RESPONSE=$(curl -s -X POST \
|
|
-H "Authorization: token ${FORGEJO_TOKEN}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "$(jq -n \
|
|
--arg tag "${CURRENT_VERSION}" \
|
|
--arg name "Release ${CURRENT_VERSION}" \
|
|
--arg body "${RELEASE_BODY}" \
|
|
'{
|
|
tag_name: $tag,
|
|
name: $name,
|
|
body: $body,
|
|
draft: false,
|
|
prerelease: false
|
|
}')" \
|
|
"${CREATE_URL}")
|
|
|
|
if echo "$RESPONSE" | jq -e '.id' > /dev/null 2>&1; then
|
|
RELEASE_URL=$(echo "$RESPONSE" | jq -r '.html_url')
|
|
echo -e "${GREEN}Release created successfully!${NC}"
|
|
echo -e "${GREEN}Release URL: ${RELEASE_URL}${NC}"
|
|
else
|
|
echo -e "${RED}Error creating release${NC}"
|
|
echo "$RESPONSE" | jq .
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Clean up the changelog file
|
|
if [ -f "$CHANGELOG_FILE" ]; then
|
|
rm -f "$CHANGELOG_FILE"
|
|
fi
|
|
|
|
# Fetch the tag that Forgejo created when we made the release
|
|
echo -e "${GREEN}Fetching tags from remote to sync the tag created by Forgejo${NC}"
|
|
if git fetch --tags; then
|
|
echo -e "${GREEN}Tags synced successfully${NC}"
|
|
else
|
|
echo -e "${YELLOW}Warning: Failed to fetch tags from remote${NC}"
|
|
fi
|
|
|
|
exit 0
|