#!/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 " 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