#!/usr/bin/env bash
set -Eeuo pipefail
REPO_ROOT="${SANPO_DOCS_REPO:-/home/ubuntu/sanporobot/robot}"
REMOTE="${SANPO_DOCS_REMOTE:-origin}"
SOURCE_BRANCH="${SANPO_DOCS_SOURCE_BRANCH:-unified-main}"
TARGET_BRANCH="main"
LOCK_FILE="${SANPO_DOCS_LOCK:-/tmp/sanpo-docs-publish.lock}"
V4_MODE="preserve"
V6_MODE="preserve"
while [[ "$#" -gt 0 ]]; do
case "$1" in
--update-v4)
V4_MODE="rebuild"
;;
--update-v6)
V6_MODE="rebuild"
;;
*)
echo "Usage: $0 [--update-v4] [--update-v6]" >&2
exit 2
;;
esac
shift
done
if [[ ! -d "${REPO_ROOT}/.git" ]]; then
echo "Git repository not found: ${REPO_ROOT}" >&2
exit 1
fi
exec 9>"${LOCK_FILE}"
if ! flock -n 9; then
echo "Another documentation deployment is already running." >&2
exit 1
fi
if [[ "$(git -C "${REPO_ROOT}" branch --show-current)" != "${TARGET_BRANCH}" ]]; then
echo "Server repository must be on ${TARGET_BRANCH}." >&2
exit 1
fi
if [[ -n "$(git -C "${REPO_ROOT}" status --porcelain --untracked-files=no)" ]]; then
echo "Tracked changes exist in ${REPO_ROOT}; release aborted." >&2
exit 1
fi
echo "Fetching ${REMOTE}/${SOURCE_BRANCH} and ${REMOTE}/${TARGET_BRANCH} ..."
git -C "${REPO_ROOT}" fetch --prune "${REMOTE}" \
"${SOURCE_BRANCH}" "${TARGET_BRANCH}"
SOURCE_REF="refs/remotes/${REMOTE}/${SOURCE_BRANCH}"
TARGET_REF="refs/remotes/${REMOTE}/${TARGET_BRANCH}"
SOURCE_SHA="$(git -C "${REPO_ROOT}" rev-parse "${SOURCE_REF}")"
TARGET_SHA="$(git -C "${REPO_ROOT}" rev-parse "${TARGET_REF}")"
LOCAL_SHA="$(git -C "${REPO_ROOT}" rev-parse HEAD)"
if ! git -C "${REPO_ROOT}" merge-base --is-ancestor \
"${TARGET_SHA}" "${SOURCE_SHA}"; then
echo "${REMOTE}/${TARGET_BRANCH} cannot be fast-forwarded to ${REMOTE}/${SOURCE_BRANCH}." >&2
echo "Resolve the branch divergence manually; no push or deployment was performed." >&2
exit 1
fi
if ! git -C "${REPO_ROOT}" merge-base --is-ancestor \
"${LOCAL_SHA}" "${SOURCE_SHA}"; then
echo "Local ${TARGET_BRANCH} cannot be fast-forwarded to ${REMOTE}/${SOURCE_BRANCH}." >&2
echo "Resolve the server checkout manually; no push or deployment was performed." >&2
exit 1
fi
if ! git -C "${REPO_ROOT}" cat-file -e \
"${SOURCE_SHA}:scripts/docs/publish-server.sh"; then
echo "Publishing script is missing from ${REMOTE}/${SOURCE_BRANCH}." >&2
exit 1
fi
git -C "${REPO_ROOT}" merge --ff-only "${SOURCE_SHA}"
if [[ "${SOURCE_SHA}" != "${TARGET_SHA}" ]]; then
echo "Fast-forwarding ${REMOTE}/${TARGET_BRANCH} to ${SOURCE_SHA:0:12} ..."
git -C "${REPO_ROOT}" push "${REMOTE}" \
"HEAD:refs/heads/${TARGET_BRANCH}"
else
echo "${REMOTE}/${TARGET_BRANCH} is already synchronized."
fi
echo "Building and publishing ${TARGET_BRANCH}@${SOURCE_SHA:0:12} ..."
SANPO_DOCS_LOCK_HELD=1 \
SANPO_DOCS_V4_MODE="${V4_MODE}" \
SANPO_DOCS_V6_MODE="${V6_MODE}" \
bash "${REPO_ROOT}/scripts/docs/publish-server.sh" "${TARGET_BRANCH}"
echo "Release completed: ${SOURCE_BRANCH} -> ${TARGET_BRANCH} -> production (V4: ${V4_MODE}, V6: ${V6_MODE}, V8: rebuild)"