custom-server-mods/scripts/build-mod.sh

68 lines
1.9 KiB
Bash
Executable file

#!/usr/bin/env bash
# Build a single custom mod from its manifest: clone (or refresh) the source at
# the pinned ref, apply optional patch, run the build, then copy produced jars
# to out/<name>/.
#
# Usage: ./scripts/build-mod.sh <name>
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck disable=SC1091
source "$SCRIPT_DIR/lib.sh"
name="${1:-}"
if [[ -z "$name" ]]; then
echo "Usage: $0 <mod-name>" >&2
exit 1
fi
load_manifest "$name"
src_dir="$WORK_DIR/$name"
mkdir -p "$WORK_DIR" "$OUT_DIR/$name"
echo "==> [$name] ensuring source at $SOURCE_REF from $SOURCE_URL"
if [[ -d "$src_dir/.git" ]]; then
git -C "$src_dir" fetch --tags --force origin
else
git clone --no-single-branch "$SOURCE_URL" "$src_dir"
fi
# Checkout the pinned ref robustly: prefer an exact tag, then a remote branch,
# then fall back to a raw commit SHA.
if git -C "$src_dir" rev-parse -q --verify "refs/tags/$SOURCE_REF" >/dev/null 2>&1; then
git -C "$src_dir" checkout --force "$SOURCE_REF"
elif git -C "$src_dir" rev-parse -q --verify "origin/$SOURCE_REF" >/dev/null 2>&1; then
git -C "$src_dir" checkout -B "$SOURCE_REF" "origin/$SOURCE_REF"
else
git -C "$src_dir" checkout --force "$SOURCE_REF"
fi
git -C "$src_dir" submodule update --init --recursive || true
if [[ -n "${PATCH_CMD:-}" ]]; then
echo "==> [$name] applying patch: $PATCH_CMD"
( cd "$src_dir" && eval "$PATCH_CMD" )
fi
echo "==> [$name] running: $BUILD_CMD"
( cd "$src_dir" && eval "$BUILD_CMD" )
echo "==> [$name] collecting jars matching '$JAR_GLOB'"
# shellcheck disable=SC2086
shopt -s nullglob
found=0
for jar in "$src_dir"/$JAR_GLOB; do
[[ -f "$jar" ]] || continue
base="$(basename "$jar")"
cp "$jar" "$OUT_DIR/$name/$base"
echo " -> out/$name/$base"
found=1
done
shopt -u nullglob
if [[ "$found" -eq 0 ]]; then
echo "ERROR: [$name] no jar matched '$JAR_GLOB' after build" >&2
exit 1
fi
echo "==> [$name] done"