#!/usr/bin/env bash # sync-wikis-to-github.sh — Mirror Gitea wiki repos to their GitHub counterparts # # Clones each Gitea wiki repo, adds the GitHub wiki as a remote, and force-pushes. # Requires GH_TOKEN env var or ~/.github-token for authentication. # # Usage: # sync-wikis-to-github.sh [repo-name] # sync one repo # sync-wikis-to-github.sh # sync all configured repos # # Requires: git, curl # set -euo pipefail GITEA_URL="${GITEA_URL:-https://git.mokoconsulting.tech}" GITHUB_ORG="${GITHUB_ORG:-mokoconsulting-tech}" GH_TOKEN="${GH_TOKEN:-$(cat ~/.github-token 2>/dev/null || echo "")}" GITEA_TOKEN="${GITEA_TOKEN:-$(cat ~/.gitea-token 2>/dev/null || echo "")}" TMPDIR="$(mktemp -d)" trap 'rm -rf "$TMPDIR"' EXIT log() { echo "[$(date '+%H:%M:%S')] $*"; } if [[ -z "$GH_TOKEN" ]]; then log "ERROR: GH_TOKEN not set. Export it or create ~/.github-token" exit 1 fi # Repo mappings: gitea_owner/repo → github_repo (same name unless overridden) declare -A REPOS=( ["MokoConsulting/moko-platform"]="moko-platform" ["MokoConsulting/MokoOnyx"]="MokoOnyx" ["MokoConsulting/MokoWaaS"]="MokoWaaS" ["MokoConsulting/monitor-mcp"]="monitor-mcp" ["MokoConsulting/deploy-mcp"]="deploy-mcp" ["MokoConsulting/ssh-mcp"]="ssh-mcp" ["MokoConsulting/backup-mcp"]="backup-mcp" ["MokoConsulting/joomla-api-mcp"]="joomla-api-mcp" ["MokoConsulting/Template-Client-WaaS"]="Template-Client-WaaS" ["ClarksvilleFurs/client-waas-clarksvillefurs"]="client-waas-clarksvillefurs" ) FILTER="${1:-}" SYNCED=0 FAILED=0 for GITEA_REPO in "${!REPOS[@]}"; do GH_REPO="${REPOS[$GITEA_REPO]}" # Filter to specific repo if requested if [[ -n "$FILTER" && "$GH_REPO" != "$FILTER" && "$GITEA_REPO" != *"$FILTER"* ]]; then continue fi log "Syncing wiki: ${GITEA_REPO} → github/${GH_REPO}" WORK="${TMPDIR}/${GH_REPO}.wiki" # Clone Gitea wiki GITEA_WIKI_URL="${GITEA_URL}/${GITEA_REPO}.wiki.git" if ! git clone --quiet "$GITEA_WIKI_URL" "$WORK" 2>/dev/null; then log " SKIP: no wiki on Gitea" continue fi cd "$WORK" # Add GitHub wiki remote GH_WIKI_URL="https://${GH_TOKEN}@github.com/${GITHUB_ORG}/${GH_REPO}.wiki.git" # Ensure GitHub wiki exists (create initial page if needed) WIKI_CHECK=$(curl -sf -H "Authorization: token ${GH_TOKEN}" \ "https://api.github.com/repos/${GITHUB_ORG}/${GH_REPO}" 2>/dev/null | \ python3 -c "import sys,json; print(json.load(sys.stdin).get('has_wiki', False))" 2>/dev/null || echo "False") if [[ "$WIKI_CHECK" != "True" ]]; then log " SKIP: GitHub wiki not enabled for ${GH_REPO}" FAILED=$((FAILED + 1)) continue fi git remote add github "$GH_WIKI_URL" 2>/dev/null || git remote set-url github "$GH_WIKI_URL" # Force push to GitHub wiki if git push --force --quiet github master:master 2>/dev/null || git push --force --quiet github main:master 2>/dev/null; then SYNCED=$((SYNCED + 1)) log " OK: synced" else FAILED=$((FAILED + 1)) log " FAIL: push failed" fi cd "$TMPDIR" done log "Done. Synced: ${SYNCED}, Failed: ${FAILED}"