diff options
author | Andrew Cady <d@jerkface.net> | 2020-05-30 14:18:41 -0400 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2020-05-30 14:18:41 -0400 |
commit | 26672cb9450af1fd61e4b55958f2ced3c0aa83a5 (patch) | |
tree | 32f19f2a2745d39318987655c51adca183f27e9d /dot/local | |
parent | 9fbd4a9ea4ce0ef8df6b661b0858bfb16ba8d326 (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/local')
-rwxr-xr-x | dot/local/bin/git-ll-remote | 111 |
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 | ||
3 | while [ $# -gt 0 ] | ||
4 | do | ||
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 | ||
19 | done | ||
20 | |||
3 | remote=${1:-origin} | 21 | remote=${1:-origin} |
4 | 22 | ||
5 | git ls-remote $remote | | 23 | have_ref() |
24 | { | ||
25 | git rev-list --quiet "$1" 2>/dev/null | ||
26 | } | ||
27 | |||
28 | show_all_message() | ||
29 | { | ||
30 | >&2 printf '%s\n' \ | ||
31 | 'Showing all remote branches:' \ | ||
32 | '' | ||
33 | |||
34 | } | ||
35 | |||
36 | show_normal_message() | ||
37 | { | ||
38 | >&2 printf '%s\n' \ | ||
39 | 'Showing remote branches that have pushed onto your HEAD:' \ | ||
40 | '' | ||
41 | } | ||
42 | |||
43 | show_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 | |||
51 | handle_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 | |||
84 | read_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 | |||
93 | finalize() | ||
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 | |||
106 | skipped=0 | ||
107 | listed=0 | ||
108 | git 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 | ||