Meta/GRADUATED: still experimenting...

Junio C Hamano committed Jan 22, 2013 at 14:41 UTC 1acf92ada834bcc44b05beba33fd658c103b72a3
1 file changed +51 -14
GRADUATED
+51 -14
@@ -1,11 +1,13 @@
1 #!/bin/sh
2
3 -base=
3 +base= ignore_file=
4 while :
5 do
6 case "$1" in
7 --base=*)
8 base=${1#*=} ;;
9 + --ignore=*)
10 + ignore_file=${1#*=} ;;
11 -*)
12 echo >&2 "Eh? $1"
13 exit 1 ;;
@@ -27,12 +29,29 @@ then
29 }
30 fi
31
30 -topics=
31 -leftover=
32 -dothis=
32 +topics= leftover= dothis=
33 LF='
34 '
35
36 +ignores=
37 +if test -f "$ignore_file"
38 +then
39 + while read ignore rest
40 + do
41 + test -n "$ignore" &&
42 + if ignore=$(git rev-parse -q --verify $ignore)
43 + then
44 + :
45 + elif ignore=$(expr "$rest" : '.* \([0-9a-f]\{40\}\)$')
46 + then
47 + :
48 + else
49 + continue
50 + fi
51 + ignores="$ignores$ignore "
52 + done <"$ignore_file"
53 +fi
54 +
55 defer () {
56 leftover="$leftover$1$LF"
57 }
@@ -42,20 +61,26 @@ dothis () {
61 }
62
63 one_topic () {
45 - topic="$1" tip="$2" date="$3"
64 + topic="$2" tip="$3" date="$4" merged="$1"
65 case " $topics" in *" $topic "*) return ;; esac
66 topics="$topics$topic "
67
49 - mergeable=no ready=no label=
50 -
68 maint_count=$(git rev-list "maint..$tip" | wc -l)
69 if test "$maint_count" = 0
70 then
71 + echo "**** already merged $topic ****"
72 return ;# already merged
73 fi
56 - master_count=$(git rev-list "$base..$tip" | wc -l)
74
58 - test $master_count = $maint_count && mergeable=yes
75 + ready=no label=
76 +
77 + master_count=$(git rev-list "$base..$tip" | wc -l)
78 + if test $maint_count -le $master_count
79 + then
80 + mergeable=yes
81 + else
82 + mergeable=no
83 + fi
84
85 if current=$(git rev-parse --verify -q "$topic^0") &&
86 test "$current" = "$tip"
@@ -70,14 +95,25 @@ one_topic () {
95
96 case "$mergeable,$ready" in
97 no,*)
73 - defer "# $topic: not mergeable ($master_count vs $maint_count)"
98 + comment="# $topic: not mergeable ($master_count vs $maint_count)"
99 + comment="$comment$LF# $merged"
100 + defer "$comment"
101 ;;
102 yes,no)
103 topic_count=$(git rev-list "$base..$current" | wc -l)
77 - defer "# $topic: not ready ($master_count vs $topic_count)"
104 +
105 + comment="# $topic: not ready ($master_count vs $topic_count)"
106 + comment="$comment$LF# $merged"
107 + defer "$comment"
108 ;;
109 yes,yes)
80 - insn="$label # $master_count ($date)"
110 + insn="$label"
111 + if test $maint_count = $master_count
112 + then
113 + insn="$insn # $master_count ($date) $merged"
114 + else
115 + insn="$insn # $maint_count/$master_count ($date) $merged"
116 + fi
117 insn="$insn$LF$(git log --oneline "maint..$tip" | sed -e "s/^/# /")"
118 dothis "$insn"
119 ;;
@@ -88,11 +124,12 @@ git log --first-parent --min-parents=2 --max-parents=2 \
124 --format='%ci %H %P %s' "$base..master" | {
125 while read date time zone commit parent tip subject
126 do
127 + case " $ignores" in *" $commit "*) continue ;; esac
128 topic=$(expr "$subject" : "Merge branch '\(.*\)'$") || {
92 - echo >&2 "Cannot parse $commit ($subject)"
129 + defer "# ignoring $commit ($subject)"
130 continue
131 }
95 - one_topic "$topic" "$tip" "$date"
132 + one_topic "$commit" "$topic" "$tip" "$date"
133 done
134 echo "$leftover"
135 echo "$dothis"