docs-onboarding/resources/scripts/release-notes.bash

123 lines
3 KiB
Bash
Executable file

#!/bin/bash
# Usage function to display help
usage() {
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " -f, --final Use the last 'final' tag as the start point."
echo " -n, --newest Display commits from newest to oldest."
echo " -h, --help Display this help and exit."
echo ""
echo "This script generates release notes from git commits based on tags."
echo "By default, it lists commits from the last tag to HEAD, sorted from oldest to newest."
}
# Check for command line arguments
for arg in "$@"; do
case "$arg" in
-f|--final)
finalFlag=true
;;
-n|--newest)
newestFirst=true
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown option: $arg"
usage
exit 1
;;
esac
done
# Adjust sort order based on the flag
if [ "${newestFirst}" = true ]; then
sortOrder="cat"
else
sortOrder="tail -r"
fi
# Get tags sorted by creation date
tags=$(git tag --sort=creatordate)
# Convert tags into an array
if [[ $(echo "$BASH_VERSION" | cut -d. -f1) -ge 4 ]]; then
readarray -t tagArray <<< "$tags"
else
IFS=$'\n' read -d '' -ra tagArray <<< "$tags"
fi
# Determine the number of tags
len=${#tagArray[@]}
# Find the last tag or the last "final" tag based on the flag
if [ "${finalFlag}" = true ]; then
for (( i=len-1; i>=0; i-- )); do
if [[ "${tagArray[i]}" == *"final"* ]]; then
latestTag="${tagArray[i]}"
break
fi
done
if [ -z "$latestTag" ]; then
echo "No 'final' tag found."
exit 1
fi
else
if [ "$len" -gt 0 ]; then
latestTag="${tagArray[$len-1]}"
else
echo "No tags found."
exit 1
fi
fi
# Print release notes
echo "## Release Notes from $latestTag to this release"
echo ""
# Fetch commit logs from the latest tag to HEAD and categorize them
newfeatures=$(git log "$latestTag"..HEAD --pretty=format:"%s" | grep 'new:' | sed 's/new:/- /g' | sort | uniq | $sortOrder)
updatedfeatures=$(git log "$latestTag"..HEAD --pretty=format:"%s" | grep 'update:' | sed 's/update:/- /g' | sort | uniq | $sortOrder)
fixedfeatures=$(git log "$latestTag"..HEAD --pretty=format:"%s" | grep 'fix:' | sed 's/fix:/- /g' | sort | uniq | $sortOrder)
deletedfeatures=$(git log "$latestTag"..HEAD --pretty=format:"%s" | grep 'delete:' | sed 's/delete:/- /g' | sort | uniq | $sortOrder)
# Output formatted commit lists
echo "New Features:"
echo ""
if [ -z "$newfeatures" ]; then
echo "- No new features."
else
echo "$newfeatures"
fi
echo ""
echo "Updated Features:"
echo ""
if [ -z "$updatedfeatures" ]; then
echo "- No updated features."
else
echo "$updatedfeatures"
fi
echo ""
echo "Fixed Features:"
echo ""
if [ -z "$fixedfeatures" ]; then
echo "- No fixed features."
else
echo "$fixedfeatures"
fi
echo ""
echo "Deleted Features:"
echo ""
if [ -z "$deletedfeatures" ]; then
echo "- No deleted features."
else
echo "$deletedfeatures"
fi
echo ""