@@ -34,7 +34,93 @@ When you have resolved this problem run \"git rebase --continue\".
34
34
If you would prefer to skip this patch, instead run \" git rebase --skip\" .
35
35
To restore the original branch and stop rebasing run \" git rebase --abort\" .
36
36
"
37
+
38
+ MRESOLVEMSG="
39
+ When you have resolved this problem run \" git rebase --continue\" .
40
+ To restore the original branch and stop rebasing run \" git rebase --abort\" .
41
+ "
37
42
unset newbase
43
+ strategy=recursive
44
+ do_merge=
45
+ dotest=$GIT_DIR /.dotest-merge
46
+ prec=4
47
+
48
+ continue_merge () {
49
+ test -n " $prev_head " || die " prev_head must be defined"
50
+ test -d " $dotest " || die " $dotest directory does not exist"
51
+
52
+ unmerged=$( git-ls-files -u)
53
+ if test -n " $unmerged "
54
+ then
55
+ echo " You still have unmerged paths in your index"
56
+ echo " did you forget update-index?"
57
+ die " $MRESOLVEMSG "
58
+ fi
59
+
60
+ if test -n " ` git-diff-index HEAD` "
61
+ then
62
+ git-commit -C " ` cat $dotest /current` "
63
+ else
64
+ echo " Previous merge succeeded automatically"
65
+ fi
66
+
67
+ prev_head=` git-rev-parse HEAD^0`
68
+
69
+ # save the resulting commit so we can read-tree on it later
70
+ echo " $prev_head " > " $dotest /cmt.$msgnum .result"
71
+ echo " $prev_head " > " $dotest /prev_head"
72
+
73
+ # onto the next patch:
74
+ msgnum=$(( $msgnum + 1 ))
75
+ echo " $msgnum " > " $dotest /msgnum"
76
+ }
77
+
78
+ call_merge () {
79
+ cmt=" $( cat $dotest /cmt.$1 ) "
80
+ echo " $cmt " > " $dotest /current"
81
+ git-merge-$strategy " $cmt ^" -- HEAD " $cmt "
82
+ rv=$?
83
+ case " $rv " in
84
+ 0)
85
+ git-commit -C " $cmt " || die " commit failed: $MRESOLVEMSG "
86
+ ;;
87
+ 1)
88
+ test -d " $GIT_DIR /rr-cache" && git-rerere
89
+ die " $MRESOLVEMSG "
90
+ ;;
91
+ 2)
92
+ echo " Strategy: $rv $strategy failed, try another" 1>&2
93
+ die " $MRESOLVEMSG "
94
+ ;;
95
+ * )
96
+ die " Unknown exit code ($rv ) from command:" \
97
+ " git-merge-$strategy $cmt ^ -- HEAD $cmt "
98
+ ;;
99
+ esac
100
+ }
101
+
102
+ finish_rb_merge () {
103
+ set -e
104
+
105
+ msgnum=1
106
+ echo " Finalizing rebased commits..."
107
+ git-reset --hard " ` cat $dotest /onto` "
108
+ end=" ` cat $dotest /end` "
109
+ while test " $msgnum " -le " $end "
110
+ do
111
+ git-read-tree ` cat " $dotest /cmt.$msgnum .result" `
112
+ git-checkout-index -q -f -u -a
113
+ git-commit -C " ` cat $dotest /cmt.$msgnum ` "
114
+
115
+ printf " Committed %0${prec} d" $msgnum
116
+ echo ' ' ` git-rev-list --pretty=oneline -1 HEAD | \
117
+ sed ' s/^[a-f0-9]\+ //' `
118
+ msgnum=$(( $msgnum + 1 ))
119
+ done
120
+ rm -r " $dotest "
121
+ echo " All done."
122
+ }
123
+
38
124
while case " $# " in 0) break ;; esac
39
125
do
40
126
case " $1 " in
46
132
exit 1
47
133
;;
48
134
esac
135
+ if test -d " $dotest "
136
+ then
137
+ prev_head=" ` cat $dotest /prev_head` "
138
+ end=" ` cat $dotest /end` "
139
+ msgnum=" ` cat $dotest /msgnum` "
140
+ onto=" ` cat $dotest /onto` "
141
+ continue_merge
142
+ while test " $msgnum " -le " $end "
143
+ do
144
+ call_merge " $msgnum "
145
+ continue_merge
146
+ done
147
+ finish_rb_merge
148
+ exit
149
+ fi
49
150
git am --resolved --3way --resolvemsg=" $RESOLVEMSG "
50
151
exit
51
152
;;
52
153
--skip)
154
+ if test -d " $dotest "
155
+ then
156
+ die " --skip is not supported when using --merge"
157
+ fi
53
158
git am -3 --skip --resolvemsg=" $RESOLVEMSG "
54
159
exit
55
160
;;
56
161
--abort)
57
- [ -d .dotest ] || die " No rebase in progress?"
162
+ if test -d " $dotest "
163
+ then
164
+ rm -r " $dotest "
165
+ elif test -d .dotest
166
+ then
167
+ rm -r .dotest
168
+ else
169
+ die " No rebase in progress?"
170
+ fi
58
171
git reset --hard ORIG_HEAD
59
- rm -r .dotest
60
172
exit
61
173
;;
62
174
--onto)
63
175
test 2 -le " $# " || usage
64
176
newbase=" $2 "
65
177
shift
66
178
;;
179
+ -M|-m|--m|--me|--mer|--merg|--merge)
180
+ do_merge=t
181
+ ;;
182
+ -s=* |--s=* |--st=* |--str=* |--stra=* |--strat=* |--strate=* |\
183
+ --strateg=* |--strategy=* |\
184
+ -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
185
+ case " $# ,$1 " in
186
+ * ,* =* )
187
+ strategy=` expr " $1 " : ' -[^=]*=\(.*\)' ` ;;
188
+ 1,* )
189
+ usage ;;
190
+ * )
191
+ strategy=" $2 "
192
+ shift ;;
193
+ esac
194
+ do_merge=t
195
+ ;;
67
196
-* )
68
197
usage
69
198
;;
75
204
done
76
205
77
206
# Make sure we do not have .dotest
78
- if mkdir .dotest
207
+ if test -z " $do_merge "
79
208
then
80
- rmdir .dotest
81
- else
82
- echo >&2 '
209
+ if mkdir .dotest
210
+ then
211
+ rmdir .dotest
212
+ else
213
+ echo >&2 '
83
214
It seems that I cannot create a .dotest directory, and I wonder if you
84
215
are in the middle of patch application or another rebase. If that is not
85
216
the case, please rm -fr .dotest and run me again. I am stopping in case
86
217
you still have something valuable there.'
87
- exit 1
218
+ exit 1
219
+ fi
220
+ else
221
+ if test -d " $dotest "
222
+ then
223
+ die " previous dotest directory $dotest still exists." \
224
+ ' try git-rebase < --continue | --abort >'
225
+ fi
88
226
fi
89
227
90
228
# The tree must be really really clean.
@@ -152,6 +290,48 @@ then
152
290
exit 0
153
291
fi
154
292
155
- git-format-patch -k --stdout --full-index " $upstream " ..ORIG_HEAD |
156
- git am --binary -3 -k --resolvemsg=" $RESOLVEMSG "
293
+ if test -z " $do_merge "
294
+ then
295
+ git-format-patch -k --stdout --full-index " $upstream " ..ORIG_HEAD |
296
+ git am --binary -3 -k --resolvemsg=" $RESOLVEMSG "
297
+ exit $?
298
+ fi
299
+
300
+ if test " @@NO_PYTHON@@" && test " $strategy " = " recursive"
301
+ then
302
+ die ' The recursive merge strategy currently relies on Python,
303
+ which this installation of git was not configured with. Please consider
304
+ a different merge strategy (e.g. octopus, resolve, stupid, ours)
305
+ or install Python and git with Python support.'
306
+
307
+ fi
308
+
309
+ # start doing a rebase with git-merge
310
+ # this is rename-aware if the recursive (default) strategy is used
311
+
312
+ mkdir -p " $dotest "
313
+ echo " $onto " > " $dotest /onto"
314
+ prev_head=` git-rev-parse HEAD^0`
315
+ echo " $prev_head " > " $dotest /prev_head"
316
+
317
+ msgnum=0
318
+ for cmt in ` git-rev-list --no-merges " $upstream " ..ORIG_HEAD \
319
+ | perl -e ' print reverse <>' `
320
+ do
321
+ msgnum=$(( $msgnum + 1 ))
322
+ echo " $cmt " > " $dotest /cmt.$msgnum "
323
+ done
324
+
325
+ echo 1 > " $dotest /msgnum"
326
+ echo $msgnum > " $dotest /end"
327
+
328
+ end=$msgnum
329
+ msgnum=1
330
+
331
+ while test " $msgnum " -le " $end "
332
+ do
333
+ call_merge " $msgnum "
334
+ continue_merge
335
+ done
157
336
337
+ finish_rb_merge
0 commit comments