servala-portal/hack/bumpver-pre-commit-hook.sh
Tobias Brunner 96469c0212
All checks were successful
Build and Deploy Staging / build (push) Successful in 44s
Build and Deploy Antora Docs / build (push) Successful in 36s
Tests / test (push) Successful in 27s
Build and Deploy Staging / deploy (push) Successful in 6s
Build and Deploy Antora Docs / deploy (push) Successful in 4s
add changelog tooling
2025-10-27 15:37:58 +01:00

134 lines
4.1 KiB
Bash
Executable file

#!/bin/bash
set -euo pipefail
# Pre-commit hook for bumpver to generate changelog from Forgejo merge requests
# This script queries the Forgejo API for merged pull requests since the last release
# and appends them to the changelog file in AsciiDoc format
# Configuration
FORGEJO_URL="https://servala.app.codey.ch"
REPO_OWNER="servala"
REPO_NAME="servala-portal"
CHANGELOG_FILE="docs/modules/ROOT/pages/web-portal-changelog.adoc"
# 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 new version from pyproject.toml (bumpver updates this before running the hook)
NEW_VERSION=$(grep -E 'current_version = ".*"' pyproject.toml | head -1 | sed -E 's/current_version = "(.*)"/\1/')
echo -e "${GREEN}Generating changelog for version: ${NEW_VERSION}${NC}"
# Get the previous tag
PREVIOUS_TAG=$(git tag -l --sort=-v:refname | head -2 | tail -1)
if [ -z "$PREVIOUS_TAG" ]; then
echo -e "${YELLOW}Warning: No previous tag found, using all merge requests${NC}"
# Get date of first commit
SINCE_DATE=$(git log --reverse --format=%aI | head -1)
else
echo -e "${GREEN}Previous version: ${PREVIOUS_TAG}${NC}"
# Get the date of the previous tag
SINCE_DATE=$(git log -1 --format=%aI "${PREVIOUS_TAG}")
fi
echo -e "${GREEN}Fetching merge requests since ${SINCE_DATE}${NC}"
# Query Forgejo API for closed/merged pull requests
# Forgejo API returns pull requests sorted by updated time
API_URL="${FORGEJO_URL}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/pulls?state=closed&sort=updated&limit=100"
RESPONSE=$(curl -s -H "Authorization: token ${FORGEJO_TOKEN}" "${API_URL}")
# Check if curl was successful
if [ $? -ne 0 ]; then
echo -e "${RED}Error: Failed to fetch pull requests from Forgejo API${NC}"
exit 1
fi
# Filter merged PRs since the previous tag and group by labels
# Using jq to parse JSON, filter by merge date, and group by labels
CHANGELOG_ENTRIES=$(echo "${RESPONSE}" | jq -r --arg since "${SINCE_DATE}" '
# Filter merged PRs since the last tag
[.[] | select(.merged_at != null and .merged_at > $since)] |
sort_by(.merged_at) | reverse |
# Group by primary label (first label if multiple, or "Uncategorized")
group_by(
if (.labels | length) > 0 then
.labels[0].name
else
"Uncategorized"
end
) |
# Format each group
map(
# Group header
"=== " + (
if .[0].labels | length > 0 then
.[0].labels[0].name
else
"Uncategorized"
end
) + "\n" +
# List items in this group
(map("* " + .title + " (link:" + .html_url + "[#" + (.number | tostring) + "])") | join("\n"))
) |
join("\n\n")
')
if [ -z "$CHANGELOG_ENTRIES" ]; then
echo -e "${YELLOW}Warning: No merged pull requests found since ${PREVIOUS_TAG}${NC}"
CHANGELOG_ENTRIES="=== Uncategorized\n\n* No changes recorded"
fi
# Create changelog section
CHANGELOG_SECTION="
== ${NEW_VERSION}
${CHANGELOG_ENTRIES}
"
# Check if changelog file exists
if [ ! -f "$CHANGELOG_FILE" ]; then
echo -e "${RED}Error: Changelog file ${CHANGELOG_FILE} not found${NC}"
exit 1
fi
# Create temporary file with new changelog entry at the top
TMP_FILE=$(mktemp)
{
# Keep the title
head -1 "$CHANGELOG_FILE"
# Add the new changelog section
echo "$CHANGELOG_SECTION"
# Add the rest of the file (skip the title)
tail -n +2 "$CHANGELOG_FILE"
} > "$TMP_FILE"
# Replace the original file
mv "$TMP_FILE" "$CHANGELOG_FILE"
chmod 0644 "$CHANGELOG_FILE"
# Add the changelog file to git
git add "$CHANGELOG_FILE"
echo -e "${GREEN}Changelog updated successfully${NC}"
echo -e "${GREEN}Added ${CHANGELOG_FILE} to git staging area${NC}"
# Save changelog for post-commit hook
CHANGELOG_DIR=".git/changelog"
mkdir -p "$CHANGELOG_DIR"
echo "$CHANGELOG_ENTRIES" > "${CHANGELOG_DIR}/${NEW_VERSION}.txt"
exit 0