Raw
1 #!/bin/sh
2 # Merge later...
3
4 : ${MASTER:=master}
5
6 : "${target:=maint}" "${here:=$MASTER}"
7
8 # Read from RelNotes and find mergeable topics
9 search_topics () {
10 tmp=/tmp/ML.$$
11 trap 'rm -f "$tmp"' 0
12 git rev-list --parents --first-parent $target..$here >"$tmp"
13
14 x40='[0-9a-f]'
15 x40="$x40$x40$x40$x40$x40"
16 x40="$x40$x40$x40$x40$x40$x40$x40$x40"
17 sed -n -e 's/^ (merge \([0-9a-f]*\) \([^ ]*\) later to maint.*/\1 \2/p' |
18 while read sha1 topic
19 do
20 if ! full_sha1=$(git rev-parse --verify "$sha1")
21 then
22 echo >&2 "Not found: $sha1 $topic"
23 continue
24 fi
25
26 comment=
27 if ! git show-ref --quiet --verify "refs/heads/$topic"
28 then
29 comment="$topic gone"
30 tip=$full_sha1 topic=$sha1
31 elif tip=$(git rev-parse --verify "refs/heads/$topic") &&
32 test "$tip" != "$full_sha1"
33 then
34 echo >&2 "$topic # $tip moved from $sha1"
35 continue
36 fi
37
38 ago= lg=-1
39 fp=$(
40 sed -ne "s/^\($x40\) $x40 $tip"'$/\1/p' "$tmp"
41 ) &&
42 test -n "$fp" &&
43 ago=$(
44 git show -s --format='%ad' --date=short $fp
45 ) &&
46 lg=$(git log --oneline $target..$tip | wc -l)
47
48 if test $lg = -1
49 then
50 echo "# $topic not yet merged to $here"
51 elif test $lg != 0
52 then
53 echo "$topic # $lg${ago+ ($ago)}${comment+ $comment}"
54 else
55 echo "# $topic already merged${ago+ ($ago)}${comment+ $comment}"
56 fi
57 done
58 }
59
60 while case "$#,$1" in
61 0,*)
62 break ;;
63 *,-t)
64 target=${2?"-t target???"}
65 git show-ref --quiet --verify "refs/heads/$target" || {
66 echo >&2 "$target: no such branch"
67 exit 1
68 }
69 shift ;;
70 *)
71 break ;;
72 esac
73 do
74 shift
75 done
76
77 case $# in
78 0)
79 search_topics
80 exit $?
81 ;;
82 esac
83
84 for topic
85 do
86 sha1=$(git rev-parse --short $topic)
87 echo " (merge $sha1 $topic later to maint)."
88 done
89