#!/usr/bin/env bash set -u cd "$(dirname "${BASH_SOURCE[0]}")" || exit 1 GITEA_BASE_URL="${GITEA_BASE_URL:-https://git.darto.id}" GITEA_OWNER="${GITEA_OWNER:-dartokloning}" GITEA_REPO="${GITEA_REPO:-item-despawn-timer}" prop() { sed -n "s/^$1=//p" gradle.properties | head -n1 | tr -d '\r'; } info() { echo "[INFO] $1"; } error() { echo "[ERROR] $1"; } [[ -f gradle.properties ]] || { error "gradle.properties tidak ditemukan."; exit 1; } MOD_VERSION="$(prop mod_version)" MINECRAFT_VERSION="$(prop minecraft_version)" ARCHIVES_BASE_NAME="$(prop archives_base_name)" ARCHIVES_BASE_NAME="${ARCHIVES_BASE_NAME:-item-despawn-timer}" [[ -n "$MOD_VERSION" && -n "$MINECRAFT_VERSION" ]] || { error "mod_version/minecraft_version tidak lengkap."; exit 1; } PROJECT_VERSION="${MOD_VERSION}+mc${MINECRAFT_VERSION}" TAG="v${MOD_VERSION}" JAR_NAME="${ARCHIVES_BASE_NAME}-${PROJECT_VERSION}.jar" JAR_PATH="$PWD/build/libs/$JAR_NAME" echo "============================================" echo " Item Despawn Timer - Release $TAG" echo " Mod version: $MOD_VERSION" echo " Minecraft: $MINECRAFT_VERSION" echo " Asset: $JAR_NAME" echo " Gitea: $GITEA_BASE_URL/$GITEA_OWNER/$GITEA_REPO" echo "============================================" echo [[ -f ./compiler.sh ]] || { error "compiler.sh tidak ditemukan."; exit 1; } chmod +x ./compiler.sh info "Menjalankan build release terlebih dahulu..." ./compiler.sh --build-only || { error "Release dibatalkan karena build gagal."; exit 1; } [[ -f "$JAR_PATH" ]] || { error "JAR release tidak ditemukan: $JAR_PATH" ls -1 build/libs/*.jar 2>/dev/null || true exit 1 } command -v git >/dev/null || { error "Git tidak ditemukan di PATH."; exit 1; } command -v curl >/dev/null || { error "curl tidak ditemukan di PATH."; exit 1; } git rev-parse --is-inside-work-tree >/dev/null 2>&1 || { error "Folder ini bukan Git repository."; exit 1; } CURRENT_BRANCH="$(git branch --show-current)" [[ -n "$CURRENT_BRANCH" ]] || { error "Tidak dapat menentukan branch Git aktif."; exit 1; } git remote get-url origin >/dev/null 2>&1 || { error "Remote origin belum dikonfigurasi."; exit 1; } echo echo "============================================" echo " Git Release Preparation" echo "============================================" if [[ -n "$(git status --porcelain)" ]]; then echo echo "Perubahan source belum di-commit:" git status --short echo read -r -p "Commit dan push perubahan sebelum membuat release? [Y/N]: " sync [[ "$sync" =~ ^[Yy]$ ]] || { echo "[WARN] Release dibatalkan. Source harus bersih."; exit 0; } default="Prepare Item Despawn Timer $TAG release" read -r -p "Commit message [$default]: " msg msg="${msg:-$default}" git add -A || exit 2 git commit -m "$msg" || exit 2 fi info "Push branch $CURRENT_BRANCH ke origin..." git push origin "$CURRENT_BRANCH" || { error "Push branch gagal. Release dibatalkan."; exit 2; } HEAD_COMMIT="$(git rev-parse HEAD)" if git rev-parse "$TAG" >/dev/null 2>&1; then TAG_COMMIT="$(git rev-list -n 1 "$TAG")" [[ "$TAG_COMMIT" == "$HEAD_COMMIT" ]] || { error "Tag $TAG sudah ada tetapi menunjuk commit lain." echo "Tag : $TAG_COMMIT" echo "HEAD: $HEAD_COMMIT" echo "Naikkan mod_version sebelum membuat release baru." exit 2 } info "Tag lokal $TAG sudah ada pada commit saat ini." else info "Membuat tag $TAG..." git tag -a "$TAG" -m "Item Despawn Timer $TAG" || exit 2 fi if git ls-remote --exit-code --tags origin "refs/tags/$TAG" >/dev/null 2>&1; then info "Tag $TAG sudah ada di origin." else info "Push tag $TAG ke origin..." git push origin "$TAG" || exit 2 fi echo echo "============================================" echo " Gitea Release" echo "============================================" read -r -p "Buat Release $TAG dan upload $JAR_NAME? [Y/N]: " confirm [[ "$confirm" =~ ^[Yy]$ ]] || { info "Pembuatan Gitea Release dilewati. Tag $TAG tetap sudah tersimpan." exit 0 } if [[ -z "${GITEA_TOKEN:-}" ]]; then read -r -s -p "Gitea Personal Access Token: " GITEA_TOKEN echo fi [[ -n "$GITEA_TOKEN" ]] || { error "Token Gitea kosong."; exit 2; } API_BASE="$GITEA_BASE_URL/api/v1/repos/$GITEA_OWNER/$GITEA_REPO" TMP_DIR="$(mktemp -d)" trap 'rm -rf "$TMP_DIR"' EXIT RELEASE_JSON="$TMP_DIR/release.json" CREATE_JSON="$TMP_DIR/create.json" ASSET_JSON="$TMP_DIR/asset.json" HTTP_CODE="$(curl -sS -o "$RELEASE_JSON" -w '%{http_code}' \ -H "Authorization: token $GITEA_TOKEN" "$API_BASE/releases/tags/$TAG")" if [[ "$HTTP_CODE" == "200" ]]; then info "Release $TAG sudah ada. Akan menggunakan release tersebut." elif [[ "$HTTP_CODE" == "404" ]]; then cat > "$CREATE_JSON" <