126 lines
6.7 KiB
Bash
126 lines
6.7 KiB
Bash
#!/usr/bin/env bash
|
|
set -u
|
|
|
|
# ============================================================
|
|
# Handcrafted - Fabric Build Script
|
|
# Linux / macOS
|
|
# ============================================================
|
|
|
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
|
cd "$SCRIPT_DIR" || exit 1
|
|
|
|
BUILD_ONLY=0
|
|
[[ "${1:-}" == "--build-only" ]] && BUILD_ONLY=1
|
|
|
|
GRADLE_PROPERTIES="$PWD/gradle.properties"
|
|
LOCAL_GRADLE_DIR="$PWD/.gradle-local"
|
|
GRADLE_VERSION="9.7.1"
|
|
GRADLE_HOME="$LOCAL_GRADLE_DIR/gradle-$GRADLE_VERSION"
|
|
GRADLE_BIN="$GRADLE_HOME/bin/gradle"
|
|
GIT_ONLY=0
|
|
|
|
pause_if_needed() { [[ $BUILD_ONLY -eq 0 ]] && read -r -p "Tekan Enter untuk melanjutkan..." _ || true; }
|
|
fail() { echo; echo "[ERROR] $1"; pause_if_needed; exit 1; }
|
|
|
|
[[ -f "$GRADLE_PROPERTIES" ]] || fail "gradle.properties tidak ditemukan."
|
|
|
|
get_prop() { sed -n "s/^$1=//p" "$GRADLE_PROPERTIES" | tail -n 1 | tr -d '\r'; }
|
|
MOD_VERSION="$(get_prop mod_version)"; MOD_VERSION="${MOD_VERSION:-unknown}"
|
|
MINECRAFT_VERSION="$(get_prop minecraft_version)"; MINECRAFT_VERSION="${MINECRAFT_VERSION:-26.2}"
|
|
MAVEN_GROUP="$(get_prop maven_group)"; MAVEN_GROUP="${MAVEN_GROUP:-id.dartokloning}"
|
|
ARCHIVES_BASE_NAME="$(get_prop archives_base_name)"; ARCHIVES_BASE_NAME="${ARCHIVES_BASE_NAME:-handcrafted}"
|
|
JAR_PATH="$PWD/build/libs/$ARCHIVES_BASE_NAME-$MOD_VERSION.jar"
|
|
|
|
echo "============================================"
|
|
echo " Handcrafted - Fabric $MINECRAFT_VERSION Build"
|
|
echo " Version: $MOD_VERSION"
|
|
echo " Namespace: earth.terrarium.handcrafted"
|
|
echo " Mod ID: handcrafted"
|
|
echo "============================================"
|
|
|
|
if [[ $BUILD_ONLY -eq 0 && -f "$JAR_PATH" ]]; then
|
|
echo; echo "[INFO] JAR untuk v$MOD_VERSION sudah pernah dibuild:"; echo " $JAR_PATH"; echo
|
|
read -r -p "[C] Compile ulang / [G] Git saja: " ans
|
|
if [[ "$ans" == "g" || "$ans" == "G" ]]; then GIT_ONLY=1; fi
|
|
fi
|
|
|
|
if [[ $GIT_ONLY -eq 0 ]]; then
|
|
command -v java >/dev/null 2>&1 || fail "Java tidak ditemukan di PATH. Install JDK 25, buka terminal baru, lalu jalankan script lagi."
|
|
JAVA_PATH="$(command -v java)"
|
|
echo "[INFO] Java executable: $JAVA_PATH"
|
|
JAVA_VERSION="$(java --version 2>&1 | head -n 1 | awk '{print $2}' | tr -d '"')"
|
|
JAVA_MAJOR="${JAVA_VERSION%%.*}"
|
|
[[ "$JAVA_MAJOR" == "25" ]] || fail "Java 25 diperlukan. Java yang terdeteksi: $JAVA_VERSION"
|
|
echo "[OK] Java 25 terdeteksi."
|
|
|
|
if [[ ! -x "$GRADLE_BIN" ]]; then
|
|
echo "[INFO] Gradle $GRADLE_VERSION belum tersedia."
|
|
echo "[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" || fail "Gagal mengunduh Gradle $GRADLE_VERSION."
|
|
elif command -v wget >/dev/null 2>&1; then
|
|
wget -O "$GRADLE_ZIP" "$GRADLE_URL" || fail "Gagal mengunduh Gradle $GRADLE_VERSION."
|
|
else
|
|
fail "curl atau wget tidak ditemukan."
|
|
fi
|
|
command -v unzip >/dev/null 2>&1 || fail "unzip tidak ditemukan. Install unzip lalu jalankan script lagi."
|
|
echo "[INFO] Mengekstrak Gradle $GRADLE_VERSION..."
|
|
unzip -q -o "$GRADLE_ZIP" -d "$LOCAL_GRADLE_DIR" || fail "Gagal mengekstrak Gradle."
|
|
rm -f "$GRADLE_ZIP"
|
|
[[ -x "$GRADLE_BIN" ]] || fail "Gradle berhasil diekstrak tetapi executable tidak ditemukan."
|
|
fi
|
|
|
|
echo "[OK] Gradle $GRADLE_VERSION tersedia."
|
|
echo "[INFO] Menjalankan clean build Handcrafted v$MOD_VERSION..."; echo
|
|
"$GRADLE_BIN" clean build --no-daemon || { echo; echo "============================================"; echo " BUILD FAILED"; echo "============================================"; echo "[ERROR] Build gagal."; echo "[INFO] Git Integration tidak dijalankan."; pause_if_needed; exit 1; }
|
|
echo; echo "============================================"; echo " BUILD SUCCESS"; echo "============================================"
|
|
if [[ -f "$JAR_PATH" ]]; then echo "JAR:"; echo "$JAR_PATH"; else echo "[WARN] Build berhasil, tetapi JAR utama tidak ditemukan pada:"; echo "$JAR_PATH"; fi
|
|
[[ $BUILD_ONLY -eq 1 ]] && exit 0
|
|
echo
|
|
read -r -p "Commit dan push perubahan ke Git/Gitea? [Y/N]: " ans
|
|
[[ "$ans" == "y" || "$ans" == "Y" ]] || { echo; echo "[INFO] Git commit/push dilewati."; echo; echo "============================================"; echo " Handcrafted v$MOD_VERSION selesai."; echo "============================================"; pause_if_needed; exit 0; }
|
|
fi
|
|
|
|
echo; echo "============================================"; echo " Git Integration"; echo "============================================"
|
|
[[ $GIT_ONLY -eq 1 ]] && echo "[INFO] Mode Git-only: build dilewati karena JAR v$MOD_VERSION sudah tersedia."
|
|
command -v git >/dev/null 2>&1 || { echo "[ERROR] Git tidak ditemukan di PATH."; exit 2; }
|
|
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || { echo "[ERROR] Folder ini belum menjadi Git repository."; echo "Jalankan: git init && git branch -M main && git remote add origin <URL-GITEA>"; exit 2; }
|
|
|
|
if [[ -n "$(git status --porcelain)" ]]; then
|
|
echo; echo "Perubahan ditemukan:"; git status --short; echo
|
|
SUGGESTED_COMMIT="Update Handcrafted v$MOD_VERSION"
|
|
echo "[SUGGEST] Commit message: $SUGGESTED_COMMIT"
|
|
read -r -p "Commit message [$SUGGESTED_COMMIT]: " COMMIT_MESSAGE
|
|
COMMIT_MESSAGE="${COMMIT_MESSAGE:-$SUGGESTED_COMMIT}"
|
|
git add -A || exit 2
|
|
git commit -m "$COMMIT_MESSAGE" || exit 2
|
|
else
|
|
echo "[INFO] Tidak ada perubahan source yang perlu di-commit."
|
|
fi
|
|
|
|
CURRENT_BRANCH="$(git branch --show-current)"
|
|
[[ -n "$CURRENT_BRANCH" ]] || { echo "[ERROR] Tidak dapat menentukan branch Git aktif."; exit 2; }
|
|
git remote get-url origin >/dev/null 2>&1 || { echo "[ERROR] Remote Git 'origin' belum dikonfigurasi. Commit lokal tetap tersimpan."; exit 2; }
|
|
|
|
round=1
|
|
while true; do
|
|
for attempt in 1 2 3; do
|
|
echo; echo "[INFO] Push attempt $attempt/3 (round $round) ke origin/$CURRENT_BRANCH..."
|
|
if git push origin "$CURRENT_BRANCH"; then
|
|
echo; echo "[SUCCESS] Push ke Git/Gitea berhasil."
|
|
echo; echo "============================================"; echo " Handcrafted v$MOD_VERSION selesai."; echo "============================================"
|
|
pause_if_needed; exit 0
|
|
fi
|
|
echo "[WARN] Push attempt $attempt/3 gagal."
|
|
[[ $attempt -lt 3 ]] && { echo "[INFO] Mencoba lagi dalam 2 detik..."; sleep 2; }
|
|
done
|
|
echo; echo "============================================"; echo " GIT PUSH FAILED - 3 ATTEMPTS"; echo "============================================"
|
|
echo "[INFO] Commit lokal tetap aman dan tidak perlu compile ulang."
|
|
read -r -p "Coba push 3x lagi? [Y/N]: " ans
|
|
[[ "$ans" == "y" || "$ans" == "Y" ]] || { echo "[INFO] Commit lokal tetap tersimpan."; exit 2; }
|
|
round=$((round + 1))
|
|
done
|