#!/bin/sh -e # # repo sync script (env-based: REPOSYNC_*) # log() { msg="$1" if [ "$LOG" ]; then echo "$(date +'%Y-%m-%d %H:%M:%S') $msg" | tee -a "$LOGFILE" else echo "$msg" fi } run_cmd() { if [ "$DRY_RUN" ]; then log " [dry-run] $*" else log " $*" eval "$@" fi } syncrepo() { url=$1 branch=$2 path=$3 [ -z "$url" ] && return 0 if [ -z "$path" ]; then log "error: invalid repo format (missing path)" return 1 fi if [ "$FORCE" ] && [ -d "$path" ]; then log "=> Force removing repo directory $path..." run_cmd "rm -rf \"$path\"" fi if [ ! -d "$path/.git" ]; then log "=> Cloning repo into $path..." run_cmd "mkdir -p \"$path\"" run_cmd "git clone --branch \"$branch\" --single-branch \"$url\" \"$path\"" else log "=> Updating repo $path..." run_cmd "cd \"$path\" && git fetch origin \"$branch\"" run_cmd "cd \"$path\" && git reset --hard \"origin/$branch\"" run_cmd "cd \"$path\" && git clean -fdx" fi } usage() { echo "Usage: $0 [-n|-l|-f]" echo " -n dry-run" echo " -l logging (/var/log/reposync.log)" echo " -f force sync" exit 1 } # --- args --- while [ "$1" ]; do case "$1" in -n) DRY_RUN=1;; -l) LOG=1;; -f) FORCE=1;; -h) usage;; esac shift done # --- checks --- command -v git >/dev/null 2>&1 || { echo "error: git is not installed." >&2 exit 1 } LOGFILE="/var/log/reposync.log" REPOS=$(env | grep '^REPOSYNC_' | sort || true) if [ -z "$REPOS" ]; then echo "error: no REPOSYNC_* variables found." >&2 exit 1 fi echo "$REPOS" | while IFS='=' read -r name value; do IFS='|' read -r url branch path _ <