#!/usr/bin/env bash set -euo pipefail if [[ $# -gt 1 ]]; then echo "Usage: $0 [path/to/.env]" >&2 exit 2 fi ENV_FILE="${1:-$(dirname "$0")/.env}" if [[ ! -f "$ENV_FILE" ]]; then echo "Env file not found: $ENV_FILE" >&2 exit 1 fi # shellcheck disable=SC1090 source "$ENV_FILE" required_vars=( RSYNC_SOURCE RSYNC_TARGET_DIR GIT_REPO_DIR COMMIT_MESSAGE_PREFIX ) for var in "${required_vars[@]}"; do if [[ -z "${!var:-}" ]]; then echo "Missing required env var: $var" >&2 exit 1 fi done mkdir -p "$RSYNC_TARGET_DIR" repo_abs="$(cd "$GIT_REPO_DIR" && pwd)" target_abs="$(cd "$RSYNC_TARGET_DIR" && pwd)" case "$target_abs" in "$repo_abs"/*) ;; *) echo "RSYNC_TARGET_DIR must be inside GIT_REPO_DIR" >&2 exit 1 ;; esac rel_target="${target_abs#"$repo_abs"/}" if [[ -n "${RSYNC_RSH:-}" ]]; then rsync -az --delete -e "$RSYNC_RSH" "$RSYNC_SOURCE" "$RSYNC_TARGET_DIR/" else rsync -az --delete "$RSYNC_SOURCE" "$RSYNC_TARGET_DIR/" fi git -C "$GIT_REPO_DIR" add -A -- "$rel_target" if git -C "$GIT_REPO_DIR" diff --cached --quiet -- "$rel_target"; then exit 0 fi timestamp="$(date '+%Y-%m-%d %H:%M:%S')" git -C "$GIT_REPO_DIR" commit -m "$COMMIT_MESSAGE_PREFIX $timestamp" -- "$rel_target"