#!/bin/bash # Generate release notes from commits since the previous tag. set -euo pipefail CURRENT_TAG="${1:-${DRONE_TAG:-}}" OUTPUT_FILE="${2:-.build/release-notes.md}" if [ -z "$CURRENT_TAG" ]; then echo "Error: current tag not provided" exit 1 fi # In CI, the tag name may be available but not present as a local ref. CURRENT_REF="$CURRENT_TAG" if ! git rev-parse --verify -q "${CURRENT_REF}^{commit}" >/dev/null; then CURRENT_REF="${DRONE_COMMIT:-HEAD}" fi PREVIOUS_TAG=$(git describe --tags --abbrev=0 "${CURRENT_REF}^" 2>/dev/null || echo "") mkdir -p "$(dirname "$OUTPUT_FILE")" { echo "# Release $CURRENT_TAG" echo if [ -n "$PREVIOUS_TAG" ]; then echo "Changes since $PREVIOUS_TAG:" echo git log "$PREVIOUS_TAG..$CURRENT_REF" --pretty=format:"%s" | while read -r commit; do if [[ $commit =~ ^([a-z]+)(\(.+\))?:\ (.+)$ ]]; then TYPE="${BASH_REMATCH[1]}" SCOPE="${BASH_REMATCH[2]}" MESSAGE="${BASH_REMATCH[3]}" case "$TYPE" in feat) echo "- Feature${SCOPE}: $MESSAGE" ;; fix) echo "- Fix${SCOPE}: $MESSAGE" ;; docs) echo "- Docs${SCOPE}: $MESSAGE" ;; ci) echo "- CI${SCOPE}: $MESSAGE" ;; test) echo "- Test${SCOPE}: $MESSAGE" ;; refactor) echo "- Refactor${SCOPE}: $MESSAGE" ;; perf) echo "- Performance${SCOPE}: $MESSAGE" ;; *) echo "- $commit" ;; esac else echo "- $commit" fi done else echo "Initial release" echo git log "$CURRENT_REF" --pretty=format:"- %s" | head -20 fi echo echo "---" if [ -n "$PREVIOUS_TAG" ]; then echo "See all changes: https://scm.yoorie.de/git/go-lib/micro/compare/$PREVIOUS_TAG...$CURRENT_TAG" else echo "See all changes: https://scm.yoorie.de/git/go-lib/micro/releases/tag/$CURRENT_TAG" fi } > "$OUTPUT_FILE" echo "Release notes generated: $OUTPUT_FILE" cat "$OUTPUT_FILE"