#!/usr/bin/env bash # # sync-upstream.sh — pull changes from upstream Feather into FTStore. # # Workflow: # 1. Fetch upstream and report how far behind we are (vs .upstream-sync.json). # 2. Optionally merge upstream/main (pass --merge). # 3. Re-apply the FTStore rebrand (scripts/apply-rebrand.sh). # 4. Remind you to update .upstream-sync.json once the merge is committed. # # Run with no args for a read-only status report. Run with --merge to merge. # set -euo pipefail cd "$(git rev-parse --show-toplevel)" SYNC_FILE=".upstream-sync.json" REMOTE="upstream" BRANCH="main" DO_MERGE=0 [ "${1:-}" = "--merge" ] && DO_MERGE=1 bold() { printf '\033[1m%s\033[0m\n' "$*"; } # Ensure the upstream remote exists. if ! git remote get-url "$REMOTE" >/dev/null 2>&1; then bold "Adding '$REMOTE' remote -> claration/Feather" git remote add "$REMOTE" https://github.com/claration/Feather.git fi bold "Fetching $REMOTE …" git fetch "$REMOTE" --tags LAST="$(jq -r '.lastMerged.commit' "$SYNC_FILE")" HEAD_UP="$(git rev-parse "$REMOTE/$BRANCH")" COUNT="$(git rev-list --count "${LAST}..${REMOTE}/${BRANCH}")" echo bold "Last merged upstream commit: $LAST (version $(jq -r '.lastMerged.upstreamVersion' "$SYNC_FILE"), synced $(jq -r '.lastMerged.syncedAt' "$SYNC_FILE"))" bold "Upstream $REMOTE/$BRANCH HEAD: $HEAD_UP" bold "FTStore is $COUNT commit(s) behind upstream." echo if [ "$COUNT" -eq 0 ]; then echo "Up to date. Nothing to merge." exit 0 fi bold "New upstream commits:" git log --oneline --no-decorate "${LAST}..${REMOTE}/${BRANCH}" echo if [ "$DO_MERGE" -eq 0 ]; then echo "Read-only report. Re-run with: scripts/sync-upstream.sh --merge" exit 0 fi bold "Merging $REMOTE/$BRANCH …" if ! git merge --no-edit "$REMOTE/$BRANCH"; then echo bold "Merge conflicts detected. Resolve them, then:" echo " - keep FTStore branding in app-repo.json / README.md / project.pbxproj" echo " - run: bash scripts/apply-rebrand.sh" echo " - commit, then update $SYNC_FILE (commit=$HEAD_UP) and re-run validation" exit 1 fi bold "Re-applying FTStore rebrand …" bash scripts/apply-rebrand.sh echo bold "Merge + rebrand complete. Next:" echo " 1. Review: git status && git diff" echo " 2. Update $SYNC_FILE:" echo " lastMerged.commit = $HEAD_UP" echo " lastMerged.upstreamVersion = " echo " lastMerged.syncedAt = $(date +%F)" echo " 3. Commit the merge + rebrand + sync-file bump."