summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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