0baaf7e842fdafd4edc4c9847c2f9e449a50784a
- Author
- TheEdgeOfRage <git@theedgeofrage.com>
- Committer
- TheEdgeOfRage <git@theedgeofrage.com>
- Date
Message
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