176 lines
6.2 KiB
Bash
176 lines
6.2 KiB
Bash
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ROOT_DIR="$(pwd)"
|
|
CONFIG_FILE="$SCRIPT_DIR/patch-config.txt"
|
|
|
|
check_dependency() {
|
|
if ! command -v "$1" > /dev/null 2>&1; then
|
|
echo "Error: '$1' is not installed. Please install it using 'pkg install $1'."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Check for jq, unzip, and curl
|
|
check_dependency jq
|
|
check_dependency unzip
|
|
check_dependency curl
|
|
|
|
# Check if CONFIG_FILE exists
|
|
if [ ! -f "$CONFIG_FILE" ]; then
|
|
echo "Config file '$CONFIG_FILE' not found! Assuming no patching needed."
|
|
exit 0
|
|
fi
|
|
|
|
# Convert line endings to Unix format
|
|
sed -i 's/\r$//' "$CONFIG_FILE"
|
|
|
|
# Debug information
|
|
echo "Root directory: $ROOT_DIR"
|
|
echo "Config file path: $CONFIG_FILE"
|
|
|
|
# Read configuration from file
|
|
. "$CONFIG_FILE"
|
|
|
|
# Get the latest hash
|
|
echo "Getting latest commit SHA hash"
|
|
latest_patch_sha=$(curl -s "https://gitgud.io/api/v4/projects/$username%2F$repo/repository/branches/$branch" | jq -r '.commit.id')
|
|
|
|
# --------------------------------------------------------
|
|
# PRE-SETUP: Ensure SRPG data and patch structure exists
|
|
# Run Steps 1 and 2 BEFORE pulling repo patch to avoid overwriting updates
|
|
# 1) Unpack once if data folder doesn't exist (and data.dts does)
|
|
# 2) Create Patch once if patch folder doesn't exist
|
|
# --------------------------------------------------------
|
|
UNPACKER="$ROOT_DIR/SRPG_Unpacker.exe"
|
|
if [ -f "$ROOT_DIR/data.dts" ]; then
|
|
if [ -f "$UNPACKER" ]; then
|
|
echo "[Pre-Setup] Running SRPG_Unpacker preparation steps..."
|
|
|
|
# Step 1: Unpack (once)
|
|
if [ ! -d "$ROOT_DIR/data" ]; then
|
|
if [ -f "$ROOT_DIR/data.dts" ]; then
|
|
echo "[Pre-Setup] Step 1: Unpacking data.dts -> data"
|
|
( cd "$ROOT_DIR" && "$UNPACKER" -o data data.dts ) || echo "[Pre-Setup] ERROR: Unpack failed."
|
|
else
|
|
echo "[Pre-Setup] Step 1: Skipping unpack (no data folder and no data.dts found)."
|
|
fi
|
|
else
|
|
echo "[Pre-Setup] Step 1: data folder exists; skipping unpack."
|
|
fi
|
|
|
|
# Step 2: Create Patch (once)
|
|
if [ ! -d "$ROOT_DIR/patch" ]; then
|
|
if [ -f "$ROOT_DIR/data/project.dat" ]; then
|
|
echo "[Pre-Setup] Step 2: Creating patch from data/project.dat"
|
|
( cd "$ROOT_DIR" && "$UNPACKER" ./data/project.dat -c ) || echo "[Pre-Setup] ERROR: Create Patch failed."
|
|
else
|
|
echo "[Pre-Setup] Step 2: Skipping create patch (data/project.dat not found)."
|
|
fi
|
|
else
|
|
echo "[Pre-Setup] Step 2: patch folder exists; skipping create."
|
|
fi
|
|
else
|
|
echo "[Pre-Setup] SRPG_Unpacker.exe not found in root; skipping pre-setup steps."
|
|
fi
|
|
else
|
|
echo "[Pre-Setup] data.dts not found; skipping pre-setup SRPG steps."
|
|
fi
|
|
|
|
download_extract() {
|
|
# Download zip file into root via GitLab API (bypasses Cloudflare DDoS protection)
|
|
echo "Downloading latest patch..."
|
|
curl -sL -A "git/2.0" "https://gitgud.io/api/v4/projects/$username%2F$repo/repository/archive.zip?sha=$branch" -o "$ROOT_DIR/repo.zip"
|
|
if [ $? -ne 0 ]; then
|
|
echo "Download failed!"
|
|
rm -f "$ROOT_DIR/repo.zip"
|
|
rm -rf "$ROOT_DIR/$repo-$branch"
|
|
return 1
|
|
fi
|
|
|
|
# Extract contents, overwriting conflicts into root
|
|
echo "Extracting..."
|
|
unzip -qo "$ROOT_DIR/repo.zip" -d "$ROOT_DIR"
|
|
if [ $? -ne 0 ]; then
|
|
echo "Extraction failed!"
|
|
rm -f "$ROOT_DIR/repo.zip"
|
|
rm -rf "$ROOT_DIR/$repo-$branch"
|
|
return 1
|
|
fi
|
|
|
|
echo "Applying patch..."
|
|
# API zip uses a different folder name (repo-branch-sha), find it dynamically
|
|
EXTRACTED_DIR=$(find "$ROOT_DIR" -maxdepth 1 -type d -name "${repo}-*" | head -1)
|
|
if [ -z "$EXTRACTED_DIR" ]; then
|
|
echo "Patch application failed - extracted folder not found!"
|
|
rm -f "$ROOT_DIR/repo.zip"
|
|
return 1
|
|
fi
|
|
cp -r "$EXTRACTED_DIR/"* "$ROOT_DIR/"
|
|
if [ $? -ne 0 ]; then
|
|
echo "Patch application failed!"
|
|
rm -f "$ROOT_DIR/repo.zip"
|
|
rm -rf "$ROOT_DIR/$repo-$branch"
|
|
return 1
|
|
fi
|
|
|
|
echo "Cleaning up..."
|
|
rm -f "$ROOT_DIR/repo.zip"
|
|
[ -n "$EXTRACTED_DIR" ] && rm -rf "$EXTRACTED_DIR"
|
|
rm -f "$ROOT_DIR/latest_patch_sha.txt"
|
|
|
|
# Store latest SHA for next check in gameupdate
|
|
echo "$latest_patch_sha" > "$SCRIPT_DIR/previous_patch_sha.txt"
|
|
|
|
# --------------------------------------------------------
|
|
# POST-APPLY: Run Steps 3 and 4 after patch files are merged
|
|
# 3) Apply Patch to data/project.dat
|
|
# 4) Pack data back into data.dts
|
|
# --------------------------------------------------------
|
|
UNPACKER="$ROOT_DIR/SRPG_Unpacker.exe"
|
|
if [ -f "$ROOT_DIR/data.dts" ]; then
|
|
if [ -f "$UNPACKER" ]; then
|
|
echo "Running SRPG_Unpacker apply/pack steps..."
|
|
|
|
# Step 3: Apply Patch
|
|
if [ -f "$ROOT_DIR/data/project.dat" ]; then
|
|
echo "Step 3: Applying patch to data/project.dat"
|
|
( cd "$ROOT_DIR" && "$UNPACKER" ./data/project.dat -a ) || echo "ERROR: Apply Patch failed."
|
|
else
|
|
echo "ERROR: data/project.dat not found; cannot apply patch."
|
|
fi
|
|
|
|
# Step 4: Pack
|
|
if [ -d "$ROOT_DIR/data" ]; then
|
|
echo "Step 4: Packing data -> data.dts"
|
|
( cd "$ROOT_DIR" && "$UNPACKER" -o data.dts data ) || echo "WARNING: Pack failed."
|
|
else
|
|
echo "Step 4: Skipping pack (data folder not found)."
|
|
fi
|
|
else
|
|
echo "SRPG_Unpacker.exe not found in root; skipping SRPG patch steps."
|
|
fi
|
|
else
|
|
echo "data.dts not found; skipping SRPG patch steps."
|
|
fi
|
|
}
|
|
|
|
# Check if previous_patch_sha.txt exists in gameupdate
|
|
if [ ! -f "$SCRIPT_DIR/previous_patch_sha.txt" ]; then
|
|
echo "Previous SHA hash not found!"
|
|
echo "Assuming first time patching..."
|
|
download_extract
|
|
else
|
|
# Read the stored SHA from previous check
|
|
previous_patch_sha=$(cat "$SCRIPT_DIR/previous_patch_sha.txt")
|
|
|
|
# Compare trimmed SHAs
|
|
if [ "$latest_patch_sha" != "$previous_patch_sha" ]; then
|
|
echo "Update found! Patching..."
|
|
download_extract
|
|
else
|
|
echo "Patch is up to date."
|
|
fi
|
|
fi
|