What's cooking (2013/01 #11)
[alt-git.git] / GRADUATED
blobe267be5a19a42deb567094594e34cad734fe8a82
1 #!/bin/sh
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 ;;
15 break ;;
16 esac
17 shift
18 done
20 if test -z "$base"
21 then
22 describe=$(git describe "master")
23 base=$(expr "$describe" : '\(.*\)-\([0-9]*\)-g[0-9a-f]*$') ||
24 base="$describe"
26 git rev-parse --verify "$base^0" >/dev/null 2>/dev/null || {
27 echo >&2 "Eh? where is your base?"
28 exit 1
32 topics= leftover= dothis=
33 LF='
36 ignores=
37 if test -f "$ignore_file"
38 then
39 while read ignore rest
41 test -n "$ignore" &&
42 if ignore=$(git rev-parse -q --verify $ignore)
43 then
45 elif ignore=$(expr "$rest" : '.* \([0-9a-f]\{40\}\)$')
46 then
48 else
49 continue
51 ignores="$ignores$ignore "
52 done <"$ignore_file"
55 defer () {
56 leftover="$leftover$1$LF"
59 dothis () {
60 dothis="$1$LF$LF$dothis"
63 one_topic () {
64 topic="$2" tip="$3" date="$4" merged="$1"
65 case " $topics" in *" $topic "*) return ;; esac
66 topics="$topics$topic "
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
75 ready=no label=
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
85 if current=$(git rev-parse --verify -q "$topic^0") &&
86 test "$current" = "$tip"
87 then
88 ready=yes
89 label="$topic"
90 elif test -z "$current"
91 then
92 ready=yes
93 label="$tip"
96 case "$mergeable,$ready" in
97 no,*)
98 comment="# $topic: not mergeable ($master_count vs $maint_count)"
99 comment="$comment$LF# $merged"
100 defer "$comment"
102 yes,no)
103 topic_count=$(git rev-list "$base..$current" | wc -l)
105 comment="# $topic: not ready ($master_count vs $topic_count)"
106 comment="$comment$LF# $merged"
107 defer "$comment"
109 yes,yes)
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"
117 insn="$insn$LF$(git log --oneline "maint..$tip" | sed -e "s/^/# /")"
118 dothis "$insn"
120 esac
123 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
127 case " $ignores" in *" $commit "*) continue ;; esac
128 topic=$(expr "$subject" : "Merge branch '\(.*\)'$") || {
129 defer "# ignoring $commit ($subject)"
130 continue
132 one_topic "$commit" "$topic" "$tip" "$date"
133 done
134 echo "$leftover"
135 echo "$dothis"