Files
aliasvault/scripts/generate-release-notes.sh
2026-02-23 23:12:34 +01:00

138 lines
4.9 KiB
Bash
Executable File

#!/bin/bash
# Script to generate release notes between two tags using GitHub API
# Usage:
# ./generate-release-notes.sh --new NEW_TAG --previous PREVIOUS_TAG
# ./generate-release-notes.sh --new NEW_TAG --prev PREVIOUS_TAG
# ./generate-release-notes.sh (interactive mode)
# Color codes
BLUE='\033[0;34m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
RESET='\033[0m'
# Parse command-line arguments
NEW_TAG=""
PREVIOUS_TAG=""
while [[ $# -gt 0 ]]; do
case $1 in
--new)
NEW_TAG="$2"
shift 2
;;
--previous|--prev)
PREVIOUS_TAG="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: ./generate-release-notes.sh --new NEW_TAG --previous PREVIOUS_TAG"
echo " or: ./generate-release-notes.sh (interactive mode)"
exit 1
;;
esac
done
# Prompt for the new tag if not provided
if [ -z "$NEW_TAG" ]; then
echo -en "${CYAN}Enter new tag name (that you will create later manually): ${RESET}"
read NEW_TAG
if [ -z "$NEW_TAG" ]; then
echo -e "${RED}Error: New tag name is required${RESET}"
exit 1
fi
fi
# Prompt for the previous tag if not provided
if [ -z "$PREVIOUS_TAG" ]; then
echo -en "${CYAN}Enter previous tag name: ${RESET}"
read PREVIOUS_TAG
if [ -z "$PREVIOUS_TAG" ]; then
echo -e "${RED}Error: Previous tag name is required${RESET}"
exit 1
fi
fi
echo ""
echo -e "${BLUE}Generating release notes from $PREVIOUS_TAG to $NEW_TAG...${RESET}"
echo ""
# Define release branch name
RELEASE_BRANCH="release/$NEW_TAG"
# Check if release branch exists on remote
if git ls-remote --heads origin "$RELEASE_BRANCH" | grep -q "$RELEASE_BRANCH"; then
echo -e "${GREEN}Using release branch: $RELEASE_BRANCH${RESET}"
TARGET_BRANCH="$RELEASE_BRANCH"
else
echo -e "${YELLOW}Release branch $RELEASE_BRANCH does not exist yet, using main branch for notes generation${RESET}"
TARGET_BRANCH="main"
fi
# Generate release notes
RELEASE_NOTES=$(gh api repos/aliasvault/aliasvault/releases/generate-notes \
-f tag_name="$NEW_TAG" \
-f previous_tag_name="$PREVIOUS_TAG" \
-f target_commitish="$TARGET_BRANCH" \
--jq .body)
# Display the generated notes with visual separator
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
echo -e "${CYAN}Generated Release Notes:${RESET}"
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
echo ""
echo "$RELEASE_NOTES"
echo ""
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${RESET}"
echo ""
# Check if release already exists
EXISTING_RELEASE=$(gh release view "$NEW_TAG" 2>/dev/null || echo "")
if [ -z "$EXISTING_RELEASE" ]; then
echo -e "${YELLOW}Release $NEW_TAG does not exist yet.${RESET}"
echo -en "${CYAN}Do you want to create a draft release? (y/n): ${RESET}"
read CREATE_DRAFT
if [[ "$CREATE_DRAFT" =~ ^[Yy]$ ]]; then
echo ""
# Check again if release branch exists for creating the release
if git ls-remote --heads origin "$RELEASE_BRANCH" | grep -q "$RELEASE_BRANCH"; then
echo -e "${BLUE}Creating draft release $NEW_TAG from branch $RELEASE_BRANCH...${RESET}"
RELEASE_TARGET="$RELEASE_BRANCH"
else
echo -e "${YELLOW}Warning: Release branch $RELEASE_BRANCH does not exist.${RESET}"
echo -e "${BLUE}Creating draft release $NEW_TAG from main branch...${RESET}"
RELEASE_TARGET="main"
fi
gh release create "$NEW_TAG" \
--draft \
--title "$NEW_TAG" \
--notes "$RELEASE_NOTES" \
--target "$RELEASE_TARGET"
if [ $? -eq 0 ]; then
echo ""
echo -e "${GREEN}✓ Draft release created successfully!${RESET}"
if [ "$RELEASE_TARGET" = "main" ]; then
echo ""
echo -e "${YELLOW}Note: Release was created from main branch. You can change the target branch later in the GitHub UI.${RESET}"
fi
else
echo ""
echo -e "${RED}✗ Failed to create draft release${RESET}"
exit 1
fi
else
echo -e "${YELLOW}Skipping draft release creation.${RESET}"
fi
else
echo -e "${YELLOW}Release $NEW_TAG already exists. Skipping creation.${RESET}"
fi