0baaf7e842fdafd4edc4c9847c2f9e449a50784a

Author
TheEdgeOfRage <git@theedgeofrage.com>
Committer
TheEdgeOfRage <git@theedgeofrage.com>
Date

Message

Update gsrb script

Diff

This diff is truncated to protect this page.

  1diff --git a/dot_local/bin/executable_gsrb b/dot_local/bin/executable_gsrb
  2index 3c7792b63dbc63482d6a482a40d17e14dfe5f3d3..5098ed49fd63d57ff1aa739cea5209d9305ece98 100644
  3--- a/dot_local/bin/executable_gsrb
  4+++ b/dot_local/bin/executable_gsrb
  5@@ -1,61 +1,134 @@
  6-#!/bin/sh
  7+#!/bin/zsh
  8 set -e
  9 
 10+function git_main_branch() {
 11+	command git rev-parse --git-dir &>/dev/null || return
 12+
 13+	local remote ref
 14+
 15+	for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,stable,master}; do
 16+		if command git show-ref -q --verify $ref; then
 17+			echo ${ref:t}
 18+			return 0
 19+		fi
 20+	done
 21+
 22+	for remote in origin upstream; do
 23+		ref=$(command git rev-parse --abbrev-ref $remote/HEAD 2>/dev/null)
 24+		if [[ $ref == $remote/* ]]; then
 25+			echo ${ref#"$remote/"}; return 0
 26+		fi
 27+	done
 28+
 29+	echo master
 30+	return 1
 31+}
 32+
 33 interactive=""
 34-while getopts "i" opt; do
 35+abort=false
 36+while getopts "ia" opt; do
 37 	case $opt in
 38 		i) interactive="-i" ;;
 39-		*) echo "usage: gsrb [-i]" >&2; exit 1 ;;
 40+		a) abort=true ;;
 41+		*) echo "usage: gsrb [-i] [-a] [base]" >&2; exit 1 ;;
 42 	esac
 43 done
 44+shift $((OPTIND - 1))
 45+
 46+gitdir=$(git rev-parse --git-dir)
 47+statefile="$gitdir/gsrb-state"
 48+
 49+if $abort; then
 50+	if [ -d "$gitdir/rebase-merge" ] || [ -d "$gitdir/rebase-apply" ]; then
 51+		git rebase --abort
 52+	fi
 53+	rm -f "$statefile"
 54+	echo "stack rebase aborted"
 55+	exit 0
 56+fi
 57+
 58+if [ -d "$gitdir/rebase-merge" ] || [ -d "$gitdir/rebase-apply" ]; then
 59+	echo "rebase in progress — run 'git rebase --continue' or 'gsrb -a' to abort" >&2
 60+	exit 1
 61+fi
 62+
 63+typeset -A old_tips
 64+remaining=()
 65 
 66-main=main
 67-git rev-parse --verify "$main" >/dev/null 2>&1 || main=master
 68+if [ -f "$statefile" ]; then
 69+	while IFS=' ' read -r key val; do
 70+		case "$key" in
 71+			current) current="$val" ;;
 72+			prev) prev="$val" ;;
 73+			prev_old) prev_old="$val" ;;
 74+			*) remaining+=("$key"); old_tips[$key]="$val" ;;
 75+		esac
 76+	done < "$statefile"
 77+	echo "resuming stack: ${remaining[*]}"
 78+else
 79+	if [ -n "$1" ]; then
 80+		main="$1"
 81+	else
 82+		main=$(git_main_branch)
 83+	fi
 84 
 85-current=$(git branch --show-current)
 86-merge_base=$(git merge-base HEAD "$main")
 87+	current=$(git branch --show-current)
 88+	merge_base=$(git merge-base HEAD "$main")
 89 
 90-# collect branches in stack order (closest to main first)
 91-branches=""
 92-for commit in $(git rev-list --reverse "$merge_base"..HEAD); do
 93-	for b in $(git branch --points-at "$commit" --format='%(refname:short)'); do
 94-		case "$b" in main|master) continue ;; esac
 95-		branches="$branches $b"
 96+	# collect branches in stack order (closest to main first)
 97+	branches=()
 98+	for commit in $(git rev-list --reverse "$merge_base"..HEAD); do
 99+		for b in $(git branch --points-at "$commit" --format='%(refname:short)'); do
100+			case "$b" in $main) continue ;; esac
101+			branches+=("$b")
102+		done
103 	done
104-done