#!/usr/bin/env bash set -euo pipefail REMOTE="${REMOTE:-origin}" BRANCH="${BRANCH:-main}" ALLOW_DIRTY=0 VERSION="" MSG="" usage(){ echo "Usage: $0 [-m \"release notes\"] [-b branch] [--allow-dirty]" exit 1 } # Args [[ $# -ge 1 ]] || usage VERSION="$1"; shift || true [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || { echo "[x] Ungültige Version: $VERSION (erwarte SemVer X.Y.Z)"; exit 1; } while [[ $# -gt 0 ]]; do case "$1" in -m) MSG="$2"; shift 2 ;; -b) BRANCH="$2"; shift 2 ;; --allow-dirty) ALLOW_DIRTY=1; shift ;; *) usage ;; esac done git rev-parse --git-dir >/dev/null 2>&1 || { echo "[x] kein Git-Repo"; exit 1; } # Clean tree? if [[ $ALLOW_DIRTY -eq 0 ]]; then if ! git diff --quiet || ! git diff --cached --quiet; then echo "[x] Arbeitsbaum nicht sauber. Committe oder nutze --allow-dirty." exit 1 fi fi # Aktuellen Stand holen git fetch --quiet "$REMOTE" --tags # Branch check-out/sync git checkout -q "$BRANCH" git pull --ff-only "$REMOTE" "$BRANCH" TAG="v${VERSION}" if git rev-parse -q --verify "refs/tags/${TAG}" >/dev/null; then echo "[x] Tag ${TAG} existiert bereits." exit 1 fi LAST_TAG="$(git describe --tags --abbrev=0 2>/dev/null || true)" if [[ -n "$LAST_TAG" ]]; then CHANGELOG="$(git log --pretty=format:'- %s (%h)' "${LAST_TAG}..HEAD" || true)" else CHANGELOG="$(git log --pretty=format:'- %s (%h)' || true)" fi [[ -n "$CHANGELOG" ]] || CHANGELOG="- initial release content" # VERSION bumpen echo -n "$VERSION" > VERSION git add VERSION git commit -m "chore(release): v${VERSION}" # Tag-Message bauen if [[ -z "$MSG" ]]; then read -r -d '' MSG <