summaryrefslogtreecommitdiff
path: root/dot
diff options
context:
space:
mode:
authorAndrew Cady <d@jerkface.net>2020-05-30 14:18:41 -0400
committerAndrew Cady <d@jerkface.net>2020-05-30 14:18:41 -0400
commit26672cb9450af1fd61e4b55958f2ced3c0aa83a5 (patch)
tree32f19f2a2745d39318987655c51adca183f27e9d /dot
parent9fbd4a9ea4ce0ef8df6b661b0858bfb16ba8d326 (diff)
improve git-ll-remote
0) If we already have the ref to be fetched, "git fetch" will no longer even be called, making this command much faster overall most of the time. 1) By default, only print remote branches that have pushed onto the local HEAD. If you don't do any rebasing, these correspond roughly to "pull requests". 2) With "-r", only print remote branches that are ANCESTORS of HEAD. These may be people you need to nag more because you are requesting the pull from them. As likely, they are old stale branches that you should delete. 3) With "-a", print everything.
Diffstat (limited to 'dot')
-rwxr-xr-xdot/local/bin/git-ll-remote111
1 files changed, 104 insertions, 7 deletions
diff --git a/dot/local/bin/git-ll-remote b/dot/local/bin/git-ll-remote
index 4052a41..a0e689b 100755
--- a/dot/local/bin/git-ll-remote
+++ b/dot/local/bin/git-ll-remote
@@ -1,12 +1,109 @@
1#!/bin/sh 1#!/bin/sh
2 2
3while [ $# -gt 0 ]
4do
5 case "$1" in
6 --) shift; break;;
7 -?) eval "OPT_${1#-}=y"
8 shift
9 ;;
10 --*=*) kv=${1#--}
11 k=${kv##=*}
12 v=${kv%*=}
13 eval "OPT_${k}=\$1" "$v"
14 shift
15 ;;
16 -*) exit 1;;
17 *) break;;
18 esac
19done
20
3remote=${1:-origin} 21remote=${1:-origin}
4 22
5git ls-remote $remote | 23have_ref()
24{
25 git rev-list --quiet "$1" 2>/dev/null
26}
27
28show_all_message()
29{
30 >&2 printf '%s\n' \
31 'Showing all remote branches:' \
32 ''
33
34}
35
36show_normal_message()
37{
38 >&2 printf '%s\n' \
39 'Showing remote branches that have pushed onto your HEAD:' \
40 ''
41}
42
43show_reverse_message()
44{
45 >&2 printf '%s\n' \
46 'Showing branches unmerged on the REMOTE side (THEY need YOUR changes)' \
47 'because "-r" (reverse) was specified:' \
48 ''
49}
50
51handle_hash_ref()
52{
53 local hash="$1" ref="$2"
54 if ! have_ref $hash
55 then
56 git fetch $remote $ref;
57 fi
58 if [ -z "$OPT_r" ]
59 then
60 cmd="git merge-base --is-ancestor HEAD $hash"
61 else
62 cmd="git merge-base --is-ancestor $hash HEAD"
63 fi
64 if [ "$OPT_a" ] || $cmd
65 then
66 if ! [ "$OPT_q" ]
67 then
68 if [ "$OPT_a" ]
69 then show_all_message
70 elif [ "$OPT_r" -a "$listed" -eq 0 ]
71 then show_reverse_message
72 else show_normal_message
73 fi
74 fi
75
76 >&2 printf 'remote: %s\n' "$ref"
77 git show $hash | sed '/^$/q'
78 listed=$((listed + 1))
79 else
80 skipped=$((skipped + 1))
81 fi
82}
83
84read_hashes()
85{
86 while read hash ref; do
87 case $ref in
88 refs/namespaces/*) handle_hash_ref "$hash" "$ref" ;;
89 esac
90 done
91}
92
93finalize()
94{
95 if [ "$listed" -eq 0 ]
96 then
97 if [ "$OPT_r" ]
98 then
99 >&2 printf 'Already up-to-date. (No remotes are ancestors of your HEAD; %d remotes up-to-date.)\n' "$skipped"
100 else
101 >&2 printf 'Already up-to-date. (No remotes have pushed onto your HEAD; %d remotes up-to-date.)\n' "$skipped"
102 fi
103 fi
104}
105
106skipped=0
107listed=0
108git ls-remote $remote | (read_hashes && finalize)
6 109
7 while read hash ref; do
8 case $ref in refs/namespaces/*)
9 git fetch $remote $ref;
10 git show $hash | sed '/^$/q';;
11 esac
12 done