diff --git a/scripts/generate-changelog.sh b/scripts/generate-changelog.sh new file mode 100755 index 0000000..5ba3794 --- /dev/null +++ b/scripts/generate-changelog.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +# generate-changelog.sh – generates a Debian-style changelog via git-cliff +# +# Usage: +# ./generate-changelog.sh -c cliff.debian.toml -t v2.9.1 -o debian/changelog +# +# Options: +# -c, --config Path to a valid git-cliff config file (required) +# -t, --tag Git tag used as the starting point for the changelog (required) +# -o, --out Target changelog file to write to (required, unless --debug) +# -d, --debug Print changelog to stdout instead of writing the file +# -h, --help Show this help message +# +# Behaviour: +# • Verifies git-cliff, sed, and git are installed. +# • Checks that the config file exists and is readable. +# • Ensures the parent directory of the output file exists (unless --debug). +# • Generates the changelog; removes a leading empty line. +set -euo pipefail + +# ─────────────────────────────────────────────── +CONFIG_FILE="" +TAG="" +OUT_FILE="" +DEBUG=false +# ─────────────────────────────────────────────── + +show_help() { sed -n '2,18p' "$0"; } + +# 1 Parse CLI options +while [[ $# -gt 0 ]]; do + case "$1" in + -c|--config) [[ $# -lt 2 ]] && { echo "❌ $1 requires a value"; exit 1; }; CONFIG_FILE="$2"; shift 2 ;; + -t|--tag) [[ $# -lt 2 ]] && { echo "❌ $1 requires a value"; exit 1; }; TAG="$2"; shift 2 ;; + -o|--out) [[ $# -lt 2 ]] && { echo "❌ $1 requires a value"; exit 1; }; OUT_FILE="$2"; shift 2 ;; + -d|--debug) DEBUG=true; shift ;; + -h|--help) show_help; exit 0 ;; + *) echo "❌ Unknown option: $1"; show_help; exit 1 ;; + esac +done + +# 2 Basic validation +[[ -z "$CONFIG_FILE" || -z "$TAG" ]] && { echo "❌ --config and --tag are required"; show_help; exit 1; } +[[ "$DEBUG" = false && -z "$OUT_FILE" ]] && { echo "❌ --out is required unless --debug is set"; show_help; exit 1; } +[[ ! -r "$CONFIG_FILE" ]] && { echo "❌ Config file not found or unreadable: $CONFIG_FILE"; exit 1; } +if [[ "$DEBUG" = false ]]; then + OUT_DIR=$(dirname "$OUT_FILE") + [[ ! -d "$OUT_DIR" ]] && { echo "❌ Output directory does not exist: $OUT_DIR"; exit 1; } +fi + +# 3 Required tools +need() { command -v "$1" >/dev/null || { echo "❌ $1 is required but not installed"; exit 1; }; } +need git; need git-cliff; need sed + +# 4 Generate changelog +if $DEBUG; then + echo "📝 Generating changelog (debug mode – stdout only)" + git cliff --config "$CONFIG_FILE" -t "$TAG" -s all +else + echo "📝 Generating changelog → $OUT_FILE" + git cliff --config "$CONFIG_FILE" -t "$TAG" -s all > "$OUT_FILE" + echo "✅ Changelog written to $OUT_FILE" +fi