Files
opencode-mobile/scripts/deploy-docs.sh
Den ac37a4c2df chore(docs): add safe gh-pages deploy script (#115)
There is no auto-deploy for the docs site — gh-pages is updated manually,
which is why fixes (e.g. the opencode->opencode-ai guide correction in #113)
land on main but not on the live site. This ad-hoc process also risks wiping
the live F-Droid repo (gh-pages/fdroid/) since docs-site/ doesn't contain it.

scripts/deploy-docs.sh copies docs-site/ over gh-pages ADDITIVELY (never
--delete) and hard-aborts if fdroid/, privacy/, or .nojekyll would go missing
or the F-Droid repo index is empty. Supports --dry-run. A dry-run against the
current site shows it would ship exactly the pending changes (the guide
install-command fix + demo.gif/mp4 + updated screenshots) and touch nothing
under fdroid/.

Usage: bash scripts/deploy-docs.sh [--dry-run]


Claude-Session: https://claude.ai/code/session_01T12AhSnQVrSxNnvwfCx2z6

Co-authored-by: engineer <engineer@macbookpro.lan>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 21:48:33 -07:00

84 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Deploy the static site in docs-site/ to the gh-pages branch (the live site
# at https://dzianisv.github.io/opencode-mobile/).
#
# WHY THIS EXISTS: there is no auto-deploy. GitHub Pages serves the gh-pages
# branch as-is, and gh-pages holds content that is NOT in docs-site/ and must
# survive every deploy:
# - fdroid/ the LIVE F-Droid repo (built by publish-fdroid.yml). Wiping
# it breaks every user's F-Droid client. NEVER touch it.
# - privacy/ the privacy policy, maintained directly on gh-pages.
# - .nojekyll required so Pages serves files literally.
# So this deploy is ADDITIVE: it copies docs-site/ over the gh-pages root
# (overwriting docs pages, adding new assets) but never deletes, and it aborts
# if any protected path would go missing.
#
# Usage:
# bash scripts/deploy-docs.sh # deploy
# bash scripts/deploy-docs.sh --dry-run # stage + show diff, do not push
#
set -euo pipefail
DRY_RUN=0
[ "${1:-}" = "--dry-run" ] && DRY_RUN=1
REPO_ROOT="$(git rev-parse --show-toplevel)"
cd "$REPO_ROOT"
SRC="$REPO_ROOT/docs-site"
[ -d "$SRC" ] || { echo "error: $SRC not found" >&2; exit 1; }
# Protected paths that live on gh-pages but not in docs-site/.
PROTECTED=(fdroid privacy .nojekyll)
WORKTREE="$(mktemp -d)"
cleanup() { git worktree remove --force "$WORKTREE" 2>/dev/null || true; rm -rf "$WORKTREE"; }
trap cleanup EXIT
echo "==> Fetching origin/gh-pages"
git fetch --quiet origin gh-pages
git worktree add --quiet "$WORKTREE" origin/gh-pages
# Sanity: the protected paths must exist in the current gh-pages before we start.
for p in "${PROTECTED[@]}"; do
[ -e "$WORKTREE/$p" ] || { echo "error: expected '$p' on gh-pages but it's missing — aborting before any change" >&2; exit 1; }
done
echo "==> Copying docs-site/ into gh-pages worktree (additive, no deletes)"
# Trailing '/.' copies contents (including dotfiles) without removing anything
# already present in the destination — so fdroid/, privacy/, .nojekyll stay.
cp -a "$SRC/." "$WORKTREE/"
# Post-copy guard: the protected paths must STILL be present and non-empty.
for p in "${PROTECTED[@]}"; do
if [ ! -e "$WORKTREE/$p" ]; then
echo "error: '$p' disappeared after copy — refusing to deploy" >&2; exit 1
fi
done
# fdroid/ must still contain its repo index, or we'd be shipping a broken repo.
if [ ! -s "$WORKTREE/fdroid/repo/index-v1.json" ] && [ ! -s "$WORKTREE/fdroid/repo/index-v2.json" ]; then
echo "error: fdroid/repo index missing/empty after copy — refusing to deploy" >&2; exit 1
fi
cd "$WORKTREE"
git add -A
if git diff --cached --quiet; then
echo "==> No changes to deploy — gh-pages already matches docs-site/."
exit 0
fi
echo "==> Changes to deploy:"
git diff --cached --stat
if [ "$DRY_RUN" = "1" ]; then
echo "==> --dry-run: not committing or pushing."
exit 0
fi
SRC_SHA="$(cd "$REPO_ROOT" && git rev-parse --short HEAD)"
git commit --quiet -m "deploy: docs-site from ${SRC_SHA}"
echo "==> Pushing to origin gh-pages"
git push --quiet origin HEAD:gh-pages
echo "==> Deployed. Live at https://dzianisv.github.io/opencode-mobile/"