#!/bin/bash set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SOURCE_DIR="${1:?usage: apply-patches.sh /path/to/RustProxy-source}" [[ -f "$SOURCE_DIR/Cargo.toml" ]] || { echo "Missing Cargo.toml in RustProxy source: $SOURCE_DIR" >&2 exit 1 } command -v git >/dev/null 2>&1 || { echo "git is required to apply FreeBSD patches" >&2; exit 1; } command -v python3 >/dev/null 2>&1 || { echo "python3 is required to detect RustProxy version" >&2; exit 1; } version="$(python3 - "$SOURCE_DIR/Cargo.toml" <<'PY' import sys import tomllib from pathlib import Path with Path(sys.argv[1]).open('rb') as f: data = tomllib.load(f) print(data['package']['version']) PY )" PATCH_DIR="$ROOT/patches/$version" if [[ ! -d "$PATCH_DIR" ]]; then echo "No FreeBSD/OPNsense patch set for RustProxy $version; building upstream source unchanged." exit 0 fi shopt -s nullglob patches=("$PATCH_DIR"/*.patch) if (( ${#patches[@]} == 0 )); then echo "FreeBSD patch directory is empty for RustProxy $version: $PATCH_DIR" >&2 exit 1 fi echo "Applying FreeBSD/OPNsense patch set for RustProxy $version to isolated build source..." for patch_file in "${patches[@]}"; do patch_name="$(basename "$patch_file")" if git -C "$SOURCE_DIR" apply --check "$patch_file" 2>/dev/null; then git -C "$SOURCE_DIR" apply "$patch_file" echo " applied: $patch_name" elif git -C "$SOURCE_DIR" apply --reverse --check "$patch_file" 2>/dev/null; then echo " already present: $patch_name" else echo "Patch does not apply cleanly: $patch_name" >&2 echo "RustProxy source version: $version" >&2 exit 1 fi done