blob: 5fb7c673d20fdb69cc4aa0ca1663e03cc881a193 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#!/usr/bin/env sh
set -eu -o pipefail;
gg_file="$(git rev-parse --git-path _hooked_branch_list)";
current_branch() { git branch --show-current; }
confirm() {
echo -n "You sure? (y/n) ";
read response;
[ "$response" = "y" ];
}
branchlist() { cat "$gg_file" | sed '/^$/d' 2>/dev/null; }
add() {
echo "$1" >> "$gg_file";
sort -u "$gg_file" -o "$gg_file";
}
remove_branch() {
local new_branchlist=$(branchlist | grep -v "$1");
echo "Removing $1...";
if (confirm); then
echo "$new_branchlist" > "$gg_file";
fi
}
prompt_branchlist() {
branchlist | grep -v "$(current_branch)" | fzf;
}
cmd_list() { branchlist; }
cmd_add() {
if [ "$#" == 0 ]; then
add "$(current_branch)";
elif [ "$1" == "-s" ]; then
local branch=$(git branch --format '%(refname:short)' | fzf);
[ -z "$branch" ] && echo "<noop>" && exit 0;
add "$branch";
elif [ "$1" == "-" ]; then
while read b; do add "$b"; done
elif [ -n "$1" ]; then
add "$1";
fi
}
cmd_remove() {
if [ "$#" == 0 ]; then
local branch=$(branchlist | fzf);
[ -z "$branch" ] && echo "<noop>" && exit 0;
remove_branch "$branch";
elif [ "$1" == "-" ]; then
while read b; do remove_branch "$b"; done
elif [ -n "$1" ]; then
remove_branch "$1";
fi
}
cmd_checkout() {
local branch=$(prompt_branchlist);
[ -z "$branch" ] && echo "<noop>" && exit 0;
git checkout "$branch";
}
cmd_clear() {
echo "Clearing branch list";
if (confirm); then
echo -n "" > "$gg_file";
fi
}
cmd_rebase() {
local branch=$(prompt_branchlist);
[ -z "$branch" ] && echo "<noop>" && exit 0;
echo "Rebase $(current_branch) with base $branch";
if (confirm); then
git rebase "$branch";
fi
}
cmd="$1"; shift 1;
case "$cmd" in
l|ls|ll|list) cmd_list ;;
a|add) cmd_add "$@" ;;
c|co|checkout) cmd_checkout ;;
rb|rebase) cmd_rebase ;;
rm|remove) cmd_remove "$@" ;;
clear) cmd_clear ;;
*)
echo "Invalid command: $cmd"
echo "Use: (ls)list | (a)add | (rm)remove | (co)checkout | (re)rebase | clear"
;;
esac
|