#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" if [[ ! -d "$ROOT_DIR/.git" ]]; then echo "[apply_patch][ERROR] no git repository available" exit 2 fi patch_tmp=$(mktemp) cleanup() { rm -f "$patch_tmp"; } trap cleanup EXIT if [[ $# -ge 1 ]]; then cp "$1" "$patch_tmp" else cat > "$patch_tmp" fi if [[ ! -s "$patch_tmp" ]]; then echo "[apply_patch][ERROR] patch is empty" exit 2 fi if ! git -C "$ROOT_DIR" apply --check "$patch_tmp" >/dev/null 2>&1; then echo "[apply_patch][ERROR] patch does not apply cleanly" exit 2 fi file_count=$(git -C "$ROOT_DIR" apply --numstat "$patch_tmp" | awk '$3 != "" {print $3}' | sort -u | wc -l | tr -d ' ') if (( file_count > 2 )); then echo "[apply_patch][BLOCK] patch touches $file_count files; max is 2 per step." exit 2 fi git -C "$ROOT_DIR" apply "$patch_tmp" echo "[apply_patch][OK] patch applied"