@echo off setlocal EnableExtensions EnableDelayedExpansion REM ============================================================ REM LesRaisinsArmor - Fabric Build + Git Script REM Windows REM ============================================================ cd /d "%~dp0" set "BUILD_ONLY=0" if /I "%~1"=="--build-only" set "BUILD_ONLY=1" set "GRADLE_PROPERTIES=%CD%\gradle.properties" set "LOCAL_GRADLE_DIR=%CD%\.gradle-local" set "GRADLE_VERSION=9.5.1" set "GRADLE_HOME=%LOCAL_GRADLE_DIR%\gradle-%GRADLE_VERSION%" set "GRADLE_BIN=%GRADLE_HOME%\bin\gradle.bat" set "GIT_ONLY=0" set "MOD_VERSION=" set "MINECRAFT_VERSION=" set "ARCHIVES_BASE_NAME=" if not exist "%GRADLE_PROPERTIES%" ( echo [ERROR] gradle.properties tidak ditemukan. call :finish 1 exit /b 1 ) for /f "usebackq tokens=1,* delims==" %%A in ("%GRADLE_PROPERTIES%") do ( if "%%A"=="mod_version" set "MOD_VERSION=%%B" if "%%A"=="minecraft_version" set "MINECRAFT_VERSION=%%B" if "%%A"=="archives_base_name" set "ARCHIVES_BASE_NAME=%%B" ) if not defined MOD_VERSION ( echo [ERROR] mod_version tidak ditemukan atau kosong di gradle.properties. call :finish 1 exit /b 1 ) if not defined MINECRAFT_VERSION set "MINECRAFT_VERSION=26.2" if not defined ARCHIVES_BASE_NAME set "ARCHIVES_BASE_NAME=lrarmor" set "JAR_PATH=%CD%\build\libs\%ARCHIVES_BASE_NAME%-%MOD_VERSION%.jar" set "SOURCES_JAR_PATH=%CD%\build\libs\%ARCHIVES_BASE_NAME%-%MOD_VERSION%-sources.jar" call :banner REM Jika JAR versi persis sudah ada, user boleh compile ulang atau Git-only. REM --build-only selalu melakukan build dan tidak menjalankan Git integration. if "%BUILD_ONLY%"=="0" if exist "%JAR_PATH%" ( echo. echo [INFO] JAR untuk v%MOD_VERSION% sudah tersedia: echo %JAR_PATH% echo. choice /C CG /N /M "[C] Compile ulang / [G] Git saja: " if errorlevel 2 ( set "GIT_ONLY=1" goto git_integration ) ) where java.exe >nul 2>&1 if errorlevel 1 ( echo [ERROR] Java tidak ditemukan di PATH. echo [INFO] Install JDK 25, buka terminal baru, lalu jalankan script lagi. call :finish 1 exit /b 1 ) set "JAVA_PATH=" for /f "delims=" %%J in ('where java.exe 2^>nul') do if not defined JAVA_PATH set "JAVA_PATH=%%J" echo [INFO] Java executable: %JAVA_PATH% set "JAVA_VERSION=" for /f "tokens=2" %%V in ('java --version 2^>^&1 ^| findstr /R /C:"^openjdk " /C:"^java "') do if not defined JAVA_VERSION set "JAVA_VERSION=%%V" if not defined JAVA_VERSION ( echo [ERROR] Tidak dapat membaca versi Java. call :finish 1 exit /b 1 ) for /f "tokens=1 delims=." %%M in ("%JAVA_VERSION%") do set "JAVA_MAJOR=%%M" if not "%JAVA_MAJOR%"=="25" ( echo [ERROR] Java 25 diperlukan. Terdeteksi: %JAVA_VERSION% call :finish 1 exit /b 1 ) echo [OK] Java 25 terdeteksi. if not exist "%GRADLE_BIN%" ( echo [INFO] Gradle %GRADLE_VERSION% belum tersedia. echo [INFO] Mengunduh distribusi resmi... if not exist "%LOCAL_GRADLE_DIR%" mkdir "%LOCAL_GRADLE_DIR%" set "GRADLE_ZIP=%LOCAL_GRADLE_DIR%\gradle-%GRADLE_VERSION%-bin.zip" set "GRADLE_URL=https://services.gradle.org/distributions/gradle-%GRADLE_VERSION%-bin.zip" where curl.exe >nul 2>&1 if errorlevel 1 ( echo [ERROR] curl.exe tidak ditemukan. call :finish 1 exit /b 1 ) curl.exe -L --fail --progress-bar "!GRADLE_URL!" -o "!GRADLE_ZIP!" if errorlevel 1 ( echo [ERROR] Gagal mengunduh Gradle %GRADLE_VERSION%. call :finish 1 exit /b 1 ) echo [INFO] Mengekstrak Gradle %GRADLE_VERSION%... powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Expand-Archive -LiteralPath '!GRADLE_ZIP!' -DestinationPath '%LOCAL_GRADLE_DIR%' -Force" if errorlevel 1 ( echo [ERROR] Gagal mengekstrak Gradle. call :finish 1 exit /b 1 ) del /q "!GRADLE_ZIP!" >nul 2>&1 ) if not exist "%GRADLE_BIN%" ( echo [ERROR] Gradle executable tidak ditemukan: %GRADLE_BIN% call :finish 1 exit /b 1 ) echo [OK] Gradle %GRADLE_VERSION% tersedia. echo [INFO] Menjalankan clean build LesRaisinsArmor v%MOD_VERSION%... echo. call "%GRADLE_BIN%" clean build --no-daemon if errorlevel 1 ( echo. echo ============================================ echo BUILD FAILED echo ============================================ echo [ERROR] Build gagal. Git Integration tidak dijalankan. if "%BUILD_ONLY%"=="1" exit /b 1 call :finish 1 exit /b 1 ) echo. echo ============================================ echo BUILD SUCCESS echo ============================================ if exist "%JAR_PATH%" ( echo JAR: echo %JAR_PATH% ) else ( echo [WARN] Build berhasil, tetapi JAR utama tidak ditemukan: echo %JAR_PATH% ) if exist "%SOURCES_JAR_PATH%" ( echo SOURCES JAR: echo %SOURCES_JAR_PATH% ) if "%BUILD_ONLY%"=="1" exit /b 0 echo. choice /C YN /N /M "Commit dan push perubahan ke Git? [Y/N]: " if errorlevel 2 ( echo. echo [INFO] Git commit/push dilewati. call :finish 0 exit /b 0 ) goto git_integration :git_integration echo. echo ============================================ echo Git Integration echo ============================================ if "%GIT_ONLY%"=="1" echo [INFO] Mode Git-only: build dilewati karena JAR v%MOD_VERSION% sudah tersedia. where git.exe >nul 2>&1 if errorlevel 1 ( echo [ERROR] Git tidak ditemukan di PATH. call :git_fail_message call :finish 2 exit /b 2 ) git rev-parse --is-inside-work-tree >nul 2>&1 if errorlevel 1 ( echo [ERROR] Folder ini belum menjadi Git repository. call :git_fail_message call :finish 2 exit /b 2 ) set "CURRENT_BRANCH=" for /f "delims=" %%B in ('git branch --show-current') do set "CURRENT_BRANCH=%%B" if not defined CURRENT_BRANCH ( echo [ERROR] Tidak dapat menentukan branch Git aktif. call :git_fail_message call :finish 2 exit /b 2 ) git remote get-url origin >nul 2>&1 if errorlevel 1 ( echo [ERROR] Remote Git 'origin' belum dikonfigurasi. call :git_fail_message call :finish 2 exit /b 2 ) set "ORIGIN_URL=" for /f "delims=" %%R in ('git remote get-url origin') do set "ORIGIN_URL=%%R" echo [INFO] Branch : !CURRENT_BRANCH! echo [INFO] Origin : !ORIGIN_URL! echo [INFO] Memeriksa perubahan... set "HAS_CHANGES=" for /f "delims=" %%G in ('git status --porcelain') do set "HAS_CHANGES=1" if defined HAS_CHANGES ( echo. echo Perubahan ditemukan: git status --short echo. call :suggest_commit_message echo [SUGGEST] Commit message: !SUGGESTED_COMMIT! echo [INFO] Tekan Enter untuk memakai saran tersebut, atau ketik pesan sendiri. set "COMMIT_MESSAGE=" set /p "COMMIT_MESSAGE=Commit message [!SUGGESTED_COMMIT!]: " if not defined COMMIT_MESSAGE set "COMMIT_MESSAGE=!SUGGESTED_COMMIT!" echo. echo [INFO] Menambahkan perubahan ke staging... git add -A if errorlevel 1 ( echo [ERROR] git add gagal. call :git_fail_message call :finish 2 exit /b 2 ) echo [INFO] Membuat commit... git commit -m "!COMMIT_MESSAGE!" if errorlevel 1 ( echo [ERROR] git commit gagal. call :git_fail_message call :finish 2 exit /b 2 ) ) else ( echo [INFO] Tidak ada perubahan source yang perlu di-commit. echo [INFO] Akan mencoba push commit lokal yang belum terkirim, jika ada. ) call :push_branch_with_retry if errorlevel 1 ( call :git_fail_message call :finish 2 exit /b 2 ) echo. echo [SUCCESS] Push ke Git berhasil. REM Jangan GOTO label akhir; selesai langsung agar tidak terkena masalah label parsing. call :finish 0 exit /b 0 :banner echo ============================================ echo LesRaisinsArmor - Fabric %MINECRAFT_VERSION% Build echo Mod Version: %MOD_VERSION% echo Archive: %ARCHIVES_BASE_NAME% echo ============================================ exit /b 0 :suggest_commit_message set "SUGGESTED_COMMIT=Update LesRaisinsArmor v%MOD_VERSION%" set "HAS_SRC_CHANGE=" set "HAS_SCRIPT_CHANGE=" set "HAS_DOC_CHANGE=" for /f "delims=" %%F in ('git status --porcelain') do ( set "LINE=%%F" echo !LINE! | findstr /I /C:"src/" >nul && set "HAS_SRC_CHANGE=1" echo !LINE! | findstr /I /C:"compile.bat" /C:"compile.sh" /C:"release.bat" /C:"run-client.bat" /C:"run-server.bat" >nul && set "HAS_SCRIPT_CHANGE=1" echo !LINE! | findstr /I /C:"README" /C:"LICENSE" /C:"PORT-CHANGELOG" >nul && set "HAS_DOC_CHANGE=1" ) if defined HAS_SRC_CHANGE set "SUGGESTED_COMMIT=Port LesRaisinsArmor v%MOD_VERSION%" if not defined HAS_SRC_CHANGE if defined HAS_SCRIPT_CHANGE set "SUGGESTED_COMMIT=Update build scripts for v%MOD_VERSION%" if not defined HAS_SRC_CHANGE if not defined HAS_SCRIPT_CHANGE if defined HAS_DOC_CHANGE set "SUGGESTED_COMMIT=Update documentation for v%MOD_VERSION%" exit /b 0 :push_branch_with_retry set /a PUSH_ROUND=1 :push_round_start set /a PUSH_ATTEMPT=1 :push_attempt_start echo. echo [INFO] Push attempt !PUSH_ATTEMPT!/3 ^(round !PUSH_ROUND!^) ke origin/!CURRENT_BRANCH!... git push -u origin "!CURRENT_BRANCH!" if not errorlevel 1 exit /b 0 echo [WARN] Push attempt !PUSH_ATTEMPT!/3 gagal. if !PUSH_ATTEMPT! LSS 3 ( set /a PUSH_ATTEMPT+=1 echo [INFO] Mencoba lagi dalam 2 detik... timeout /t 2 /nobreak >nul goto push_attempt_start ) echo. echo ============================================ echo GIT PUSH FAILED - 3 ATTEMPTS echo ============================================ echo [INFO] Commit lokal tetap aman dan tidak perlu compile ulang. choice /C YN /N /M "Coba push 3x lagi? [Y/N]: " if errorlevel 2 exit /b 1 set /a PUSH_ROUND+=1 goto push_round_start :git_fail_message echo. echo ============================================ echo GIT FAILED echo ============================================ if "%GIT_ONLY%"=="1" ( echo [INFO] Build tidak dijalankan; JAR v%MOD_VERSION% yang sudah ada tetap aman. ) else ( echo [INFO] Build tetap aman jika tahap build sebelumnya sukses. ) echo [INFO] Commit lokal tetap tersimpan. echo [INFO] Jalankan compile.bat lagi; jika JAR versi sama terdeteksi, pilih G untuk Git-only. exit /b 0 :finish set "FINISH_CODE=%~1" echo. echo ============================================ if "%FINISH_CODE%"=="0" ( echo LesRaisinsArmor v%MOD_VERSION% selesai. ) else ( echo LesRaisinsArmor v%MOD_VERSION% selesai dengan error %FINISH_CODE%. ) echo ============================================ echo. if "%BUILD_ONLY%"=="0" pause exit /b 0