aboutsummaryrefslogtreecommitdiff
path: root/scripts/bin/gg
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