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
114 lines
3.4 KiB
Bash
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."
|