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"