80 lines
1.8 KiB
Bash
80 lines
1.8 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
REMOTE="${REMOTE:-origin}"
|
|
BRANCH="${BRANCH:-main}"
|
|
ALLOW_DIRTY=0
|
|
VERSION=""
|
|
MSG=""
|
|
|
|
usage(){
|
|
echo "Usage: $0 <X.Y.Z> [-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 <<EOF || true
|
|
MailWolt v${VERSION}
|
|
|
|
Changes since ${LAST_TAG:-repo start}:
|
|
${CHANGELOG}
|
|
EOF
|
|
fi
|
|
|
|
git tag -a "$TAG" -m "$MSG"
|
|
|
|
# Push commit + tag
|
|
git push "$REMOTE" "$BRANCH"
|
|
git push "$REMOTE" "$TAG"
|
|
|
|
echo "[✓] Release ${TAG} erstellt & gepusht." |