dp-zp-agent/tools/git_runner/sync_fork.sh

96 lines
2.9 KiB
Bash

#!/usr/bin/env bash
# Preserve original upstream commits; never force-push or write to KEMT/zpwiki.
set -euo pipefail
set +x
umask 077
fork_url='git@git.kemt.fei.tuke.sk:jp170na/zpwiki.git'
upstream_url='git@git.kemt.fei.tuke.sk:KEMT/zpwiki.git'
script_root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
check_only=false
case "${1:-}" in
--check) check_only=true ;;
'') ;;
-h|--help)
echo "Pouzitie: bash tools/git_runner/sync_fork.sh [--check]"
echo "--check iba porovna vetvy bez zapisu; pouzije dostupny lokalny SSH pristup."
exit 0
;;
*) echo "Neznamy parameter." >&2; exit 64 ;;
esac
if [[ $# -gt 1 ]]; then
echo "Prilis vela parametrov." >&2
exit 64
fi
if ! "$check_only"; then
: "${ZPWIKI_SYNC_SSH_KEY:?Chyba Actions secret ZPWIKI_SYNC_SSH_KEY}"
fi
export GIT_TERMINAL_PROMPT=0 LC_ALL=C
export ZPWIKI_KNOWN_HOSTS_FILE="$script_root/ssh_known_hosts"
if [[ ! -s "$ZPWIKI_KNOWN_HOSTS_FILE" ]]; then
echo "Chyba doveryhodny subor ssh_known_hosts vedla skriptu." >&2
exit 1
fi
work="$(mktemp -d /tmp/zpwiki-fork-sync.XXXXXXXX)"
trap 'rm -rf "$work"' EXIT
if [[ -n "${ZPWIKI_SYNC_SSH_KEY:-}" ]]; then
key_text="${ZPWIKI_SYNC_SSH_KEY//$'\r'/}"
printf '%s\n' "${key_text%$'\n'}" > "$work/id_ed25519"
unset key_text
chmod 600 "$work/id_ed25519"
export ZPWIKI_SSH_KEY_FILE="$work/id_ed25519"
fi
unset ZPWIKI_SYNC_SSH_KEY
cat > "$work/ssh" <<'SH'
#!/usr/bin/env bash
set -euo pipefail
options=(-F /dev/null -o BatchMode=yes -o StrictHostKeyChecking=yes
-o ConnectTimeout=15 -o ServerAliveInterval=15 -o ServerAliveCountMax=2
-o "UserKnownHostsFile=$ZPWIKI_KNOWN_HOSTS_FILE")
if [[ -n "${ZPWIKI_SSH_KEY_FILE:-}" ]]; then
options+=(-o IdentitiesOnly=yes -i "$ZPWIKI_SSH_KEY_FILE")
fi
exec ssh "${options[@]}" "$@"
SH
chmod 700 "$work/ssh"
# mktemp's fixed /tmp template contains no shell metacharacters.
export GIT_SSH_COMMAND="$work/ssh" GIT_SSH_VARIANT=ssh
git_cmd() {
git -c core.hooksPath=/dev/null "$@"
}
git_cmd clone --quiet --bare --single-branch --branch master --no-tags \
"$fork_url" "$work/wiki.git"
cd "$work/wiki.git"
git_cmd fetch --quiet --no-tags "$upstream_url" \
refs/heads/master:refs/remotes/upstream/master
fork="$(git_cmd rev-parse refs/heads/master)"
upstream="$(git_cmd rev-parse refs/remotes/upstream/master)"
echo "Fork master: $fork"
echo "KEMT master: $upstream"
if git_cmd merge-base --is-ancestor "$upstream" "$fork"; then
echo "Fork uz obsahuje vsetky zmeny hlavnej wiki. Bez zapisu."
exit 0
fi
if ! git_cmd merge-base --is-ancestor "$fork" "$upstream"; then
echo "CHYBA: Vetvy sa rozisli. Fork nebol prepisany." >&2
exit 1
fi
if "$check_only"; then
echo "Fork potrebuje fast-forward aktualizaciu. Kontrola nic nezmenila."
exit 0
fi
# Normal push also rejects a concurrent divergent update on the server.
git_cmd push origin "$upstream:refs/heads/master"
echo "Fork bol aktualizovany na $upstream."