1+ #! /bin/bash
2+
3+ # Script zum Rebasen aller release/* Branches auf master und Erstellen von GitHub Releases
4+ # Autor: MinecraftServerAPI Team
5+ # Datum: 2025-09-06
6+
7+ set -e # Bei Fehler beenden
8+
9+ # Farben für Output
10+ RED=' \033[0;31m'
11+ GREEN=' \033[0;32m'
12+ YELLOW=' \033[1;33m'
13+ BLUE=' \033[0;34m'
14+ NC=' \033[0m' # No Color
15+
16+ # Logging-Funktionen
17+ log_info () {
18+ echo -e " ${BLUE} [INFO]${NC} $1 "
19+ }
20+
21+ log_success () {
22+ echo -e " ${GREEN} [SUCCESS]${NC} $1 "
23+ }
24+
25+ log_warning () {
26+ echo -e " ${YELLOW} [WARNING]${NC} $1 "
27+ }
28+
29+ log_error () {
30+ echo -e " ${RED} [ERROR]${NC} $1 "
31+ }
32+
33+ # Prüfe ob wir im richtigen Verzeichnis sind
34+ if [ ! -f " pom.xml" ] || [ ! -d " .git" ]; then
35+ log_error " Dieses Skript muss im Root-Verzeichnis des MinecraftServerAPI-Projekts ausgeführt werden!"
36+ exit 1
37+ fi
38+
39+ # Prüfe ob gh (GitHub CLI) installiert ist
40+ if ! command -v gh & > /dev/null; then
41+ log_error " GitHub CLI (gh) ist nicht installiert. Bitte installiere es mit: brew install gh"
42+ exit 1
43+ fi
44+
45+ # Prüfe ob wir bei GitHub authentifiziert sind
46+ if ! gh auth status & > /dev/null; then
47+ log_error " Nicht bei GitHub authentifiziert. Bitte führe 'gh auth login' aus."
48+ exit 1
49+ fi
50+
51+ # Speichere den aktuellen Branch
52+ CURRENT_BRANCH=$( git branch --show-current)
53+ log_info " Aktueller Branch: $CURRENT_BRANCH "
54+
55+ # Stelle sicher, dass das Working Directory sauber ist
56+ if [ -n " $( git status --porcelain) " ]; then
57+ log_error " Working Directory ist nicht sauber. Bitte committe oder stashe deine Änderungen."
58+ exit 1
59+ fi
60+
61+ # Hole die neuesten Änderungen
62+ log_info " Hole die neuesten Änderungen vom Remote..."
63+ git fetch --all --prune
64+
65+ # Wechsle zu master und aktualisiere
66+ log_info " Wechsle zu master Branch..."
67+ git checkout master
68+ git pull origin master
69+
70+ # Hole alle release/* Branches
71+ RELEASE_BRANCHES=$( git branch -r | grep ' origin/release/' | sed ' s/origin\///' | sort -V)
72+
73+ if [ -z " $RELEASE_BRANCHES " ]; then
74+ log_warning " Keine release/* Branches gefunden!"
75+ git checkout " $CURRENT_BRANCH "
76+ exit 0
77+ fi
78+
79+ log_info " Gefundene Release-Branches:"
80+ echo " $RELEASE_BRANCHES " | while read -r branch; do
81+ echo " - $branch "
82+ done
83+
84+ # Arrays für Erfolg und Fehler
85+ SUCCESSFUL_REBASES=()
86+ FAILED_REBASES=()
87+ SUCCESSFUL_RELEASES=()
88+ FAILED_RELEASES=()
89+
90+ # Rebase alle Release-Branches
91+ echo " "
92+ log_info " === PHASE 1: Rebase alle Release-Branches auf master ==="
93+ echo " "
94+
95+ for branch in $RELEASE_BRANCHES ; do
96+ log_info " Verarbeite Branch: $branch "
97+
98+ # Checkout des Branches
99+ if git checkout " $branch " 2> /dev/null || git checkout -b " $branch " " origin/$branch " 2> /dev/null; then
100+
101+ # Versuche Rebase
102+ log_info " Rebase $branch auf master..."
103+ if git rebase master; then
104+ log_success " Rebase von $branch erfolgreich!"
105+
106+ # Force Push (da wir rebased haben)
107+ log_info " Pushe $branch zum Remote..."
108+ if git push --force-with-lease origin " $branch " ; then
109+ log_success " Push von $branch erfolgreich!"
110+ SUCCESSFUL_REBASES+=(" $branch " )
111+ else
112+ log_error " Push von $branch fehlgeschlagen!"
113+ FAILED_REBASES+=(" $branch " )
114+ git rebase --abort 2> /dev/null || true
115+ fi
116+ else
117+ log_error " Rebase von $branch fehlgeschlagen! Überspringe..."
118+ FAILED_REBASES+=(" $branch " )
119+ git rebase --abort 2> /dev/null || true
120+ fi
121+ else
122+ log_error " Konnte Branch $branch nicht auschecken!"
123+ FAILED_REBASES+=(" $branch " )
124+ fi
125+
126+ echo " "
127+ done
128+
129+ # Wechsle zurück zu master für Release-Erstellung
130+ git checkout master
131+
132+ echo " "
133+ log_info " === PHASE 2: Erstelle GitHub Releases ==="
134+ echo " "
135+
136+ # Erstelle Releases für erfolgreich gerebaste Branches
137+ for branch in " ${SUCCESSFUL_REBASES[@]} " ; do
138+ # Extrahiere Version aus Branch-Namen (z.B. release/1.19.4 -> 1.19.4)
139+ VERSION=$( echo " $branch " | sed ' s/release\///' )
140+ TAG_NAME=" v$VERSION "
141+
142+ log_info " Erstelle Release für $branch (Tag: $TAG_NAME )..."
143+
144+ # Checkout des Branches für Release
145+ git checkout " $branch "
146+
147+ # Hole die neueste Commit-Message für Release Notes
148+ LAST_COMMIT=$( git log -1 --pretty=format:" %s" )
149+
150+ # Generiere Release Notes
151+ RELEASE_NOTES=" ## MinecraftServerAPI v$VERSION
152+
153+ ### 🎮 Minecraft Version
154+ Supports Minecraft $VERSION
155+
156+ ### 📦 Änderungen
157+ - Rebased auf den neuesten master Branch
158+ - Alle aktuellen Features und Bugfixes enthalten
159+
160+ ### 🔄 Letzte Änderung
161+ $LAST_COMMIT
162+
163+ ### 📥 Installation
164+ Lade die JAR-Datei herunter und platziere sie in deinem Minecraft Server's \` plugins\` Ordner.
165+
166+ ### 📖 Dokumentation
167+ Siehe [README.md](https://github.com/$( gh repo view --json nameWithOwner -q .nameWithOwner) /blob/$branch /README.md) für die vollständige Dokumentation.
168+
169+ ---
170+ *Automatisch generiert am $( date ' +%Y-%m-%d %H:%M:%S' ) *"
171+
172+ # Erstelle Tag falls nicht vorhanden
173+ if ! git tag | grep -q " ^$TAG_NAME $" ; then
174+ log_info " Erstelle Tag $TAG_NAME ..."
175+ git tag " $TAG_NAME "
176+ git push origin " $TAG_NAME "
177+ else
178+ log_warning " Tag $TAG_NAME existiert bereits, aktualisiere..."
179+ git tag -f " $TAG_NAME "
180+ git push origin -f " $TAG_NAME "
181+ fi
182+
183+ # Baue das Projekt
184+ log_info " Baue JAR-Datei für $VERSION ..."
185+ if mvn clean package -DskipTests > /dev/null 2>&1 ; then
186+ JAR_FILE=$( find target -name " MinecraftServerAPI-*.jar" | head -1)
187+
188+ if [ -f " $JAR_FILE " ]; then
189+ # Erstelle oder aktualisiere Release
190+ log_info " Erstelle GitHub Release..."
191+
192+ # Prüfe ob Release bereits existiert
193+ if gh release view " $TAG_NAME " > /dev/null 2>&1 ; then
194+ log_warning " Release $TAG_NAME existiert bereits, lösche und erstelle neu..."
195+ gh release delete " $TAG_NAME " --yes
196+ fi
197+
198+ # Erstelle neues Release
199+ if gh release create " $TAG_NAME " \
200+ --title " MinecraftServerAPI v$VERSION " \
201+ --notes " $RELEASE_NOTES " \
202+ --target " $branch " \
203+ " $JAR_FILE #MinecraftServerAPI-$VERSION .jar" ; then
204+
205+ log_success " Release $TAG_NAME erfolgreich erstellt!"
206+ SUCCESSFUL_RELEASES+=(" $VERSION " )
207+ else
208+ log_error " Fehler beim Erstellen von Release $TAG_NAME !"
209+ FAILED_RELEASES+=(" $VERSION " )
210+ fi
211+ else
212+ log_error " JAR-Datei nicht gefunden für $VERSION !"
213+ FAILED_RELEASES+=(" $VERSION " )
214+ fi
215+ else
216+ log_error " Build fehlgeschlagen für $VERSION !"
217+ FAILED_RELEASES+=(" $VERSION " )
218+ fi
219+
220+ echo " "
221+ done
222+
223+ # Zurück zum ursprünglichen Branch
224+ log_info " Wechsle zurück zu $CURRENT_BRANCH ..."
225+ git checkout " $CURRENT_BRANCH "
226+
227+ # Zusammenfassung
228+ echo " "
229+ echo " ========================================"
230+ echo " ZUSAMMENFASSUNG "
231+ echo " ========================================"
232+ echo " "
233+
234+ if [ ${# SUCCESSFUL_REBASES[@]} -gt 0 ]; then
235+ log_success " Erfolgreich gerebaste Branches (${# SUCCESSFUL_REBASES[@]} ):"
236+ for branch in " ${SUCCESSFUL_REBASES[@]} " ; do
237+ echo " ✅ $branch "
238+ done
239+ fi
240+
241+ if [ ${# FAILED_REBASES[@]} -gt 0 ]; then
242+ echo " "
243+ log_error " Fehlgeschlagene Rebases (${# FAILED_REBASES[@]} ):"
244+ for branch in " ${FAILED_REBASES[@]} " ; do
245+ echo " ❌ $branch "
246+ done
247+ fi
248+
249+ if [ ${# SUCCESSFUL_RELEASES[@]} -gt 0 ]; then
250+ echo " "
251+ log_success " Erfolgreich erstellte Releases (${# SUCCESSFUL_RELEASES[@]} ):"
252+ for version in " ${SUCCESSFUL_RELEASES[@]} " ; do
253+ echo " ✅ v$version "
254+ done
255+ fi
256+
257+ if [ ${# FAILED_RELEASES[@]} -gt 0 ]; then
258+ echo " "
259+ log_error " Fehlgeschlagene Releases (${# FAILED_RELEASES[@]} ):"
260+ for version in " ${FAILED_RELEASES[@]} " ; do
261+ echo " ❌ v$version "
262+ done
263+ fi
264+
265+ echo " "
266+ echo " ========================================"
267+
268+ # Exit-Code basierend auf Erfolg
269+ if [ ${# FAILED_REBASES[@]} -eq 0 ] && [ ${# FAILED_RELEASES[@]} -eq 0 ]; then
270+ log_success " Alle Operationen erfolgreich abgeschlossen! 🎉"
271+ exit 0
272+ else
273+ log_warning " Einige Operationen sind fehlgeschlagen. Bitte prüfe die Fehler oben."
274+ exit 1
275+ fi
0 commit comments