blob: 9977971179c5efe3d67df0ecb5d83d0add60a3d6 [file]
#!/usr/bin/env bash
# ======================================================================
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# ======================================================================
#
# Generate changelog between two git references (tags/commits)
# Usage: ./generate-changelog.sh <from_ref> <to_ref> [repo_owner/repo_name]
#
# Examples:
# ./generate-changelog.sh 1a40e1f 8178d4f
# ./generate-changelog.sh v1.0.0 v1.1.0
# ./generate-changelog.sh 1a40e1f 8178d4f apache/cloudberry
# ./generate-changelog.sh v1.0.0 v1.1.0 apache/cloudberry
#
# GitHub Token Setup:
# 1. Go to GitHub Settings > Developer settings > Personal access tokens > Tokens (classic)
# 2. Generate new token with 'repo' scope (for private repos) or 'public_repo' scope (for public repos)
# 3. Export the token: export GITHUB_TOKEN=your_token_here
set -e
# Default values
DEFAULT_REPO="apache/cloudberry"
GITHUB_API_BASE="https://api.github.com"
# Function to display usage
usage() {
echo "Usage: $0 <from_ref> <to_ref> [repo_owner/repo_name]"
echo ""
echo "Examples:"
echo " $0 1a40e1f 8178d4f"
echo " $0 v1.0.0 v1.1.0"
echo " $0 1a40e1f 8178d4f apache/cloudberry"
echo " $0 v1.0.0 v1.1.0 apache/cloudberry"
echo ""
echo "Environment variables:"
echo " GITHUB_TOKEN - GitHub personal access token (required)"
exit 1
}
# Check arguments
if [ $# -lt 2 ] || [ $# -gt 3 ]; then
usage
fi
FROM_REF="$1"
TO_REF="$2"
REPO="${3:-$DEFAULT_REPO}"
# Check if GITHUB_TOKEN is set
if [ -z "$GITHUB_TOKEN" ]; then
echo "Error: GITHUB_TOKEN environment variable is required"
echo "Please set it with: export GITHUB_TOKEN=your_token_here"
exit 1
fi
# Check if jq is installed
if ! command -v jq &> /dev/null; then
echo "Error: jq is required but not installed"
echo "Please install jq using your system's package manager"
exit 1
fi
# Count total commits first
total_commits=$(git log --oneline "$FROM_REF..$TO_REF" | wc -l | tr -d ' ')
echo "Generating changelog for $REPO from $FROM_REF to $TO_REF..."
echo "Found $total_commits commits to process"
echo ""
# Generate changelog
git log --oneline --pretty=format:"%h|%H|%s|%an" "$FROM_REF..$TO_REF" | while IFS='|' read -r short_sha full_sha subject author; do
# Get PR number for this commit
pr_number=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
"$GITHUB_API_BASE/repos/$REPO/commits/$full_sha/pulls" | \
jq -r '.[0].number // empty')
if [ -n "$pr_number" ]; then
echo "* [\`$short_sha\`](https://github.com/$REPO/commit/$full_sha) - $subject ($author) [#$pr_number](https://github.com/$REPO/pull/$pr_number)"
else
echo "* [\`$short_sha\`](https://github.com/$REPO/commit/$full_sha) - $subject ($author)"
fi
done
echo ""
echo "Changelog generation completed!"