Files
blackroad/scripts/sync-final-push.sh
Alexa Amundson 78fbe80f2a Initial monorepo — everything BlackRoad in one place
bin/       230 CLI tools (ask-*, br-*, agent-*, roadid, carpool)
scripts/   99 automation scripts
fleet/     Node configs and deployment
workers/   Cloudflare Worker sources (roadpay, road-search, squad webhooks)
roadc/     RoadC programming language
roadnet/   Mesh network (5 APs, WireGuard)
operator/  Memory system scripts
config/    System configs
dotfiles/  Shell configs
docs/      Documentation

BlackRoad OS — Pave Tomorrow.

RoadChain-SHA2048: d1a24f55318d338b
RoadChain-Identity: alexa@sovereign
RoadChain-Full: d1a24f55318d338b24b60bad7be39286379c76ae5470817482100cb0ddbbcb97e147d07ac7243da0a9f0363e4e5c833d612b9c0df3a3cd20802465420278ef74875a5b77f55af6fe42a931b8b635b3d0d0b6bde9abf33dc42eea52bc03c951406d8cbe49f1a3d29b26a94dade05e9477f34a7d4d4c6ec4005c3c2ac54e73a68440c512c8e83fd9b1fe234750b898ef8f4032c23db173961fe225e67a0432b5293a9714f76c5c57ed5fdf35b9fb40fd73c03ebf88b7253c6a0575f5afb6a6b49b3bda310602fb1ef676859962dad2aebbb2875814b30eee0a8ba195e482d4cbc91d8819e7f38f6db53e8063401649c77bb994371473cabfb917fb53e8cbe73d60
2026-03-14 17:08:41 -05:00

114 lines
3.4 KiB
Bash

#!/bin/bash
# Final push: fetch, rebase with auto-resolve (theirs for conflicts), push
# For protected branches that can't be force-pushed
PUSH_TIMEOUT=30
SUCCESS=0
FAIL=0
SKIPPED=0
NO_REMOTE=0
declare -a PUSHED=()
declare -a FAILED=()
echo "=== Final Push: rebase + auto-resolve + push ==="
while IFS= read -r gitdir; do
repo="$(dirname "$gitdir")"
reponame="$(basename "$repo")"
cd "$repo" 2>/dev/null || continue
# Skip repos without remotes
git remote get-url origin >/dev/null 2>&1 || { NO_REMOTE=$((NO_REMOTE+1)); continue; }
# Clean up any stuck state
git rebase --abort 2>/dev/null
git merge --abort 2>/dev/null
git cherry-pick --abort 2>/dev/null
branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
[ -z "$branch" ] && continue
# Fetch
timeout 15 git fetch origin 2>/dev/null
# Check if ahead
ahead="$(git rev-list --count origin/${branch}..HEAD 2>/dev/null)"
if [ "$ahead" = "0" ] 2>/dev/null || [ -z "$ahead" ]; then
SKIPPED=$((SKIPPED+1))
continue
fi
# Try simple push first
if timeout $PUSH_TIMEOUT git push origin "$branch" --no-verify 2>/dev/null; then
SUCCESS=$((SUCCESS+1))
PUSHED+=("$reponame")
echo " [OK] $reponame"
continue
fi
# Try pull rebase with auto-resolve strategy
# Use -X theirs to auto-resolve conflicts in favor of remote
if timeout 60 git pull --rebase -X theirs origin "$branch" --no-verify 2>/dev/null; then
if timeout $PUSH_TIMEOUT git push origin "$branch" --no-verify 2>/dev/null; then
SUCCESS=$((SUCCESS+1))
PUSHED+=("$reponame (rebased)")
echo " [REBASED+PUSHED] $reponame"
else
FAIL=$((FAIL+1))
FAILED+=("$reponame (push after rebase)")
echo " [FAIL push] $reponame"
fi
else
# Rebase failed even with auto-resolve, abort and try merge approach
git rebase --abort 2>/dev/null
# Try merge instead of rebase
if timeout 60 git pull --no-rebase -X theirs origin "$branch" --no-verify 2>/dev/null; then
# Auto-commit the merge if needed
git add -A 2>/dev/null
git commit -m "chore: merge remote changes" --no-verify 2>/dev/null
if timeout $PUSH_TIMEOUT git push origin "$branch" --no-verify 2>/dev/null; then
SUCCESS=$((SUCCESS+1))
PUSHED+=("$reponame (merged)")
echo " [MERGED+PUSHED] $reponame"
else
FAIL=$((FAIL+1))
FAILED+=("$reponame (push after merge)")
echo " [FAIL push after merge] $reponame"
fi
else
git merge --abort 2>/dev/null
FAIL=$((FAIL+1))
FAILED+=("$reponame (merge failed)")
echo " [FAIL merge] $reponame"
fi
fi
done < <(find /Users/alexa -maxdepth 2 -name ".git" -type d 2>/dev/null | sort)
echo ""
echo "========================================="
echo " FINAL PUSH SUMMARY"
echo "========================================="
echo "Pushed: $SUCCESS"
echo "Failed: $FAIL"
echo "Skipped: $SKIPPED"
echo "No remote: $NO_REMOTE"
echo "========================================="
if [ ${#PUSHED[@]} -gt 0 ]; then
echo ""
echo "Pushed:"
printf ' - %s\n' "${PUSHED[@]}"
fi
if [ ${#FAILED[@]} -gt 0 ]; then
echo ""
echo "Failed:"
printf ' - %s\n' "${FAILED[@]}"
fi
echo "Done."