What's cooking (2010/08 #05)
[alt-git.git] / Reintegrate
blob30065f21221c489eaf1332061200c9026fcc57de
1 #!/bin/sh
3 accept_rerere=t generate=no update= diff=
4 while case "$#,$1" in 0,*) break;; *,-*) ;; esac
5 do
6 case "$1" in
7 -n) accept_rerere= ;;
8 -d) update=${2?"diff with what?"}
9 diff=yes
10 generate=yes
11 shift ;;
12 -u) update=${2?"update what?"}
13 generate=yes
14 shift ;;
15 *) generate=yes
16 break ;;
17 esac
18 shift
19 done
21 case "$generate" in
22 no)
23 accept_rerere () {
24 if test -z "$accept_rerere"
25 then
26 return 1
28 if git diff |
29 grep -e "^.+" -e "^+." |
30 grep -e "^..<<<<<<<" -e "^..=======" -e "^..>>>>>>>" >/dev/null
31 then
32 return 1
33 else
34 EDITOR=: git commit -a --no-verify
35 echo "Accepted previous resolution"
36 return 0
40 while read branch eh
42 case "$branch" in '#'*) continue ;; esac
43 case "$eh" in
44 "")
45 save=$(git rev-parse --verify HEAD)
47 echo >&2 "* $branch"
48 git merge "$branch" || accept_rerere || exit
50 this=$(git rev-parse --verify HEAD)
51 if test "$this" = "$save"
52 then
54 elif git show-ref -q --verify "refs/merge-fix/$branch"
55 then
56 git cherry-pick --no-commit "refs/merge-fix/$branch" &&
57 EDITOR=: git commit --amend -a
60 pick" "*)
61 echo >&2 "* $eh"
62 git cherry-pick "$branch" || exit ;;
63 *) echo >&2 "Eh? $branch $eh"; exit ;;
64 esac
65 done
66 exit
67 esac
69 if test -n "$update" && test $# = 0
70 then
71 set x $(sed -n -e '2s/^# //p' <"$update") &&
72 shift
75 # Generation (or updating)
77 x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
78 x40="$x40$x40$x40$x40$x40$x40$x40$x40"
79 LF='
82 show_merge () {
83 case "$msg" in
84 "Merge branch '"*"'"*)
85 branch=$(expr "$msg" : "Merge branch '\(.*\)'")
86 merge_hier=heads/
88 "Merge remote branch '"*"'"*)
89 branch=$(expr "$msg" : "Merge remote branch '\(.*\)'")
90 merge_hier=
93 echo 2>&1 "Huh?: $msg"
94 return
96 esac &&
97 tip=$(git rev-parse --verify "refs/$merge_hier$branch" 2>/dev/null) &&
98 merged=$(git name-rev --refs="refs/$merge_hier$branch" "$other" 2>/dev/null) &&
99 merged=$(expr "$merged" : "$x40 \(.*\)") &&
100 test "$merged" != undefined || {
101 other=$(git log -1 --pretty='format:%s' $other) &&
102 merged="$branch :rebased? $other"
106 show_pick () {
107 merged="$(git rev-parse --verify "$commit") pick $msg"
110 generate () {
111 PROGRAM=$1
112 shift
113 echo '#!/bin/sh'
114 echo "# $1"
115 echo 'case "$#,$1" in'
116 echo '1,-u|1,-d)'
117 echo " exec $PROGRAM" '"$1" "$0"'
118 echo 'esac'
119 echo "$PROGRAM" '"$@" <<\EOF'
120 git log --pretty=oneline --first-parent "$1" |
122 series=
123 while read commit msg
125 if other=$(git rev-parse -q --verify "$commit^2")
126 then
127 show_merge
128 else
129 show_pick
132 if test -z "$series"
133 then
134 series="$merged"
135 else
136 series="$merged$LF$series"
138 done
139 echo "$series"
141 echo EOF
144 if test -z "$update"
145 then
146 generate "$0" "$@"
147 elif test -z "$diff"
148 then
149 generate "$0" "$@" | diff -u "$update" -
150 if test $? = 0
151 then
152 echo >&2 "No changes."
153 else
154 echo >&2 -n "Update [Y/n]? "
155 read yesno
156 case "$yesno" in
157 [Yy]*)
158 generate "$0" "$@" |
159 sed -e 's/ :rebased?.*//' >"$update" ;;
161 echo >&2 "No update then." ;;
162 esac
164 else
165 generate "$0" "$@" | diff -u "$update" -