Files
lobby-systems/compile.sh
T
2026-09-07 05:53:59 +07:00

341 lines
8.6 KiB
Bash

#!/usr/bin/env bash
# ============================================================
# Lobby Systems - Fabric Build Script
# Linux / macOS
# ============================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR" || exit 1
BUILD_ONLY=0
if [[ "${1:-}" == "--build-only" ]]; then
BUILD_ONLY=1
fi
GRADLE_PROPERTIES="$SCRIPT_DIR/gradle.properties"
LOCAL_GRADLE_DIR="$SCRIPT_DIR/.gradle-local"
GRADLE_VERSION="9.5.1"
GRADLE_HOME="$LOCAL_GRADLE_DIR/gradle-$GRADLE_VERSION"
GRADLE_BIN="$GRADLE_HOME/bin/gradle"
GIT_ONLY=0
info() { echo "[INFO] $1"; }
ok() { echo "[OK] $1"; }
warn() { echo "[WARN] $1"; }
error() { echo "[ERROR] $1"; }
separator() { echo "============================================"; }
read_property() {
local key="$1"
grep -E "^${key}=" "$GRADLE_PROPERTIES" | head -n 1 | cut -d'=' -f2- | tr -d '\r'
}
suggest_commit_message() {
SUGGESTED_COMMIT="Update Lobby Systems v$MOD_VERSION"
}
push_branch_with_retry() {
local round=1
local attempt
while true; do
attempt=1
while [[ $attempt -le 3 ]]; do
echo
info "Push attempt $attempt/3 (round $round) ke origin/$CURRENT_BRANCH..."
if git push origin "$CURRENT_BRANCH"; then
return 0
fi
warn "Push attempt $attempt/3 gagal."
if [[ $attempt -lt 3 ]]; then
info "Mencoba lagi dalam 2 detik..."
sleep 2
fi
attempt=$((attempt + 1))
done
echo
separator
echo " GIT PUSH FAILED - 3 ATTEMPTS"
separator
info "Commit lokal tetap aman dan tidak perlu compile ulang."
read -r -p "Coba push 3x lagi? [Y/N]: " RETRY_CONFIRM
case "$RETRY_CONFIRM" in
y|Y|yes|YES|Yes) round=$((round + 1)) ;;
*) return 1 ;;
esac
done
}
run_git_integration() {
echo
separator
echo " Git Integration"
separator
if [[ $GIT_ONLY -eq 1 ]]; then
info "Mode Git-only: build dilewati karena JAR v$MOD_VERSION sudah tersedia."
fi
if ! command -v git >/dev/null 2>&1; then
error "Git tidak ditemukan di PATH."
return 2
fi
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
error "Folder ini belum menjadi Git repository."
echo
echo "Jalankan terlebih dahulu:"
echo " git init"
echo " git branch -M main"
echo " git remote add origin <URL-GITEA>"
return 2
fi
info "Memeriksa perubahan Git..."
CHANGES="$(git status --porcelain)"
if [[ -n "$CHANGES" ]]; then
echo
echo "Perubahan ditemukan:"
echo
git status --short
echo
suggest_commit_message
echo "[SUGGEST] Commit message: $SUGGESTED_COMMIT"
info "Tekan Enter untuk memakai saran tersebut, atau ketik pesan sendiri."
read -r -p "Commit message [$SUGGESTED_COMMIT]: " COMMIT_MESSAGE
[[ -z "$COMMIT_MESSAGE" ]] && COMMIT_MESSAGE="$SUGGESTED_COMMIT"
info "Menambahkan perubahan ke staging..."
if ! git add -A; then
error "git add gagal."
return 2
fi
info "Membuat commit..."
if ! git commit -m "$COMMIT_MESSAGE"; then
error "git commit gagal."
return 2
fi
else
info "Tidak ada perubahan source yang perlu di-commit."
info "Akan mencoba push commit lokal yang belum terkirim, jika ada."
fi
CURRENT_BRANCH="$(git branch --show-current)"
if [[ -z "$CURRENT_BRANCH" ]]; then
error "Tidak dapat menentukan branch Git aktif."
return 2
fi
info "Branch aktif: $CURRENT_BRANCH"
if ! git remote get-url origin >/dev/null 2>&1; then
error "Remote Git 'origin' belum dikonfigurasi."
info "Commit lokal tetap tersimpan."
return 2
fi
REMOTE_URL="$(git remote get-url origin)"
info "Remote origin: $REMOTE_URL"
if ! push_branch_with_retry; then
return 2
fi
echo
ok "Push ke Git/Gitea berhasil."
return 0
}
if [[ ! -f "$GRADLE_PROPERTIES" ]]; then
error "gradle.properties tidak ditemukan."
exit 1
fi
MOD_VERSION="$(read_property "mod_version")"
MINECRAFT_VERSION="$(read_property "minecraft_version")"
MAVEN_GROUP="$(read_property "maven_group")"
[[ -z "$MOD_VERSION" ]] && MOD_VERSION="unknown"
[[ -z "$MINECRAFT_VERSION" ]] && MINECRAFT_VERSION="26.2"
[[ -z "$MAVEN_GROUP" ]] && MAVEN_GROUP="id.dartokloning"
JAR_PATH="$SCRIPT_DIR/build/libs/lobby-systems-$MOD_VERSION.jar"
separator
echo " Lobby Systems - Fabric $MINECRAFT_VERSION Build"
echo " Version: $MOD_VERSION"
echo " Namespace: id.dartokloning.lobbysystems"
echo " Mod ID: dartokloning"
separator
if [[ $BUILD_ONLY -eq 0 && -f "$JAR_PATH" ]]; then
echo
info "JAR untuk v$MOD_VERSION sudah pernah dibuild:"
echo " $JAR_PATH"
echo
read -r -p "[C] Compile ulang / [G] Git saja: " EXISTING_ACTION
case "$EXISTING_ACTION" in
g|G|git|GIT|Git)
GIT_ONLY=1
if run_git_integration; then
echo
separator
echo " Lobby Systems v$MOD_VERSION selesai."
separator
exit 0
fi
echo
separator
echo " GIT FAILED"
separator
info "Build tidak dijalankan; JAR v$MOD_VERSION yang sudah ada tetap aman."
info "Commit lokal tetap tersimpan."
exit 2
;;
*) ;;
esac
fi
if ! command -v java >/dev/null 2>&1; then
error "Java tidak ditemukan di PATH."
echo "Install JDK 25 lalu jalankan script lagi."
exit 1
fi
JAVA_PATH="$(command -v java)"
info "Java executable: $JAVA_PATH"
JAVA_VERSION_OUTPUT="$(java --version 2>&1 | head -n 1)"
JAVA_VERSION="$(echo "$JAVA_VERSION_OUTPUT" | awk '{print $2}')"
JAVA_MAJOR="$(echo "$JAVA_VERSION" | cut -d'.' -f1)"
if [[ "$JAVA_MAJOR" != "25" ]]; then
error "Java 25 diperlukan."
echo "[INFO] Java yang terdeteksi:"
echo " $JAVA_VERSION_OUTPUT"
exit 1
fi
ok "Java 25 terdeteksi."
if [[ ! -x "$GRADLE_BIN" ]]; then
info "Gradle $GRADLE_VERSION belum tersedia."
info "Mengunduh distribusi resmi..."
mkdir -p "$LOCAL_GRADLE_DIR"
GRADLE_ZIP="$LOCAL_GRADLE_DIR/gradle-$GRADLE_VERSION-bin.zip"
GRADLE_URL="https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip"
if command -v curl >/dev/null 2>&1; then
curl -L --fail --progress-bar "$GRADLE_URL" -o "$GRADLE_ZIP"
DOWNLOAD_RESULT=$?
elif command -v wget >/dev/null 2>&1; then
wget "$GRADLE_URL" -O "$GRADLE_ZIP"
DOWNLOAD_RESULT=$?
else
error "curl atau wget tidak ditemukan."
exit 1
fi
if [[ $DOWNLOAD_RESULT -ne 0 ]]; then
error "Gagal mengunduh Gradle $GRADLE_VERSION."
exit 1
fi
info "Mengekstrak Gradle $GRADLE_VERSION..."
if ! command -v unzip >/dev/null 2>&1; then
error "Command 'unzip' tidak ditemukan."
exit 1
fi
unzip -q -o "$GRADLE_ZIP" -d "$LOCAL_GRADLE_DIR"
EXTRACT_RESULT=$?
if [[ $EXTRACT_RESULT -ne 0 ]]; then
error "Gagal mengekstrak Gradle."
exit 1
fi
rm -f "$GRADLE_ZIP"
fi
if [[ ! -x "$GRADLE_BIN" ]]; then
error "Gradle executable tidak ditemukan:"
echo "$GRADLE_BIN"
exit 1
fi
ok "Gradle $GRADLE_VERSION tersedia."
info "Menjalankan clean build Lobby Systems v$MOD_VERSION..."
echo
"$GRADLE_BIN" clean build --no-daemon
BUILD_RESULT=$?
if [[ $BUILD_RESULT -ne 0 ]]; then
echo
separator
echo " BUILD FAILED"
separator
echo
error "Build gagal dengan exit code $BUILD_RESULT."
info "Git Integration tidak dijalankan."
exit "$BUILD_RESULT"
fi
echo
separator
echo " BUILD SUCCESS"
separator
if [[ -f "$JAR_PATH" ]]; then
echo "JAR:"
echo "$JAR_PATH"
else
warn "Build berhasil, tetapi JAR utama tidak ditemukan pada:"
echo "$JAR_PATH"
fi
if [[ $BUILD_ONLY -eq 1 ]]; then
exit 0
fi
echo
read -r -p "Commit dan push perubahan ke Git/Gitea? [Y/N]: " GIT_CONFIRM
case "$GIT_CONFIRM" in
y|Y|yes|YES|Yes) ;;
*)
echo
info "Git commit/push dilewati."
echo
separator
echo " Lobby Systems v$MOD_VERSION selesai."
separator
exit 0
;;
esac
if ! run_git_integration; then
echo
separator
echo " GIT FAILED"
separator
info "Build Lobby Systems tetap berhasil."
info "Commit lokal tetap tersimpan."
info "Jalankan compile.sh lagi; jika JAR versi sama terdeteksi, pilih G untuk Git-only."
exit 2
fi
echo
separator
echo " Lobby Systems v$MOD_VERSION selesai."
separator
exit 0