@@ -116,10 +116,30 @@ call_merge () {
116
116
}
117
117
118
118
finish_rb_merge () {
119
+ if test -f " $dotest /stash"
120
+ then
121
+ stash=$( cat " $dotest /stash" )
122
+ git stash apply --index " $stash "
123
+ fi
119
124
rm -r " $dotest "
120
125
echo " All done."
121
126
}
122
127
128
+ read_stash () {
129
+ if test -f " $1 "
130
+ then
131
+ cat " $1 "
132
+ fi
133
+ }
134
+ unstash_and_exit () {
135
+ err=$?
136
+ if test -f " $1 " && test $err = 0
137
+ then
138
+ git stash apply --index " $1 "
139
+ fi
140
+ exit $err
141
+ }
142
+
123
143
is_interactive () {
124
144
test -f " $dotest " /interactive ||
125
145
while case $# ," $1 " in 0,|* ,-i|* ,--interactive) break ;; esac
154
174
finish_rb_merge
155
175
exit
156
176
fi
177
+ stash=$( read_stash " .dotest/stash" )
157
178
git am --resolved --3way --resolvemsg=" $RESOLVEMSG "
158
- exit
179
+ unstash_and_exit " $stash "
159
180
;;
160
181
--skip)
161
182
if test -d " $dotest "
174
195
finish_rb_merge
175
196
exit
176
197
fi
198
+ stash=$( read_stash " .dotest/stash" )
177
199
git am -3 --skip --resolvemsg=" $RESOLVEMSG "
178
- exit
200
+ unstash_and_exit " $stash "
179
201
;;
180
202
--abort)
181
203
git rerere clear
182
204
if test -d " $dotest "
183
205
then
206
+ if test -f " $dotest /stash"
207
+ then
208
+ stash=$( cat " $dotest /stash" )
209
+ fi
184
210
rm -r " $dotest "
185
211
elif test -d .dotest
186
212
then
213
+ if test -f " .dotest/stash"
214
+ then
215
+ stash=$( cat " .dotest/stash" )
216
+ fi
187
217
rm -r .dotest
188
218
else
189
219
die " No rebase in progress?"
190
220
fi
191
221
git reset --hard ORIG_HEAD
222
+ test -z " $stash " || git stash apply --index " $stash "
192
223
exit
193
224
;;
194
225
--onto)
@@ -254,16 +285,6 @@ else
254
285
fi
255
286
fi
256
287
257
- # The tree must be really really clean.
258
- git update-index --refresh || exit
259
- diff=$( git diff-index --cached --name-status -r HEAD)
260
- case " $diff " in
261
- ?* ) echo " cannot rebase: your index is not up-to-date"
262
- echo " $diff "
263
- exit 1
264
- ;;
265
- esac
266
-
267
288
# The upstream head must be given. Make sure it is valid.
268
289
upstream_name=" $1 "
269
290
upstream=` git rev-parse --verify " ${upstream_name} ^0" ` ||
@@ -273,11 +294,19 @@ upstream=`git rev-parse --verify "${upstream_name}^0"` ||
273
294
onto_name=${newbase-" $upstream_name " }
274
295
onto=$( git rev-parse --verify " ${onto_name} ^0" ) || exit
275
296
297
+ # The tree must be clean enough for us to create a stash
298
+ stash=$( git stash create) || exit
299
+ if test -n " $stash "
300
+ then
301
+ echo >&2 " Stashed away your working tree changes"
302
+ fi
303
+
276
304
# If a hook exists, give it a chance to interrupt
277
305
if test -x " $GIT_DIR /hooks/pre-rebase"
278
306
then
279
307
" $GIT_DIR /hooks/pre-rebase" ${1+" $@ " } || {
280
308
echo >&2 " The pre-rebase hook refused to rebase."
309
+ test -z " $stash " || git stash apply --index " $stash "
281
310
exit 1
282
311
}
283
312
fi
286
315
case " $# " in
287
316
2)
288
317
branch_name=" $2 "
289
- git-checkout " $2 " || usage
318
+ git-checkout " $2 " || {
319
+ test -z " $stash " || git stash apply --index " $stash "
320
+ usage
321
+ }
290
322
;;
291
323
* )
292
324
if branch_name=` git symbolic-ref -q HEAD`
@@ -309,6 +341,7 @@ if test "$upstream" = "$onto" && test "$mb" = "$onto" &&
309
341
! git rev-list --parents " $onto " .." $branch " | grep " .* " > /dev/null
310
342
then
311
343
echo >&2 " Current branch $branch_name is up to date."
344
+ test -z " $stash " || git stash apply --index " $stash "
312
345
exit 0
313
346
fi
314
347
@@ -328,14 +361,24 @@ git-reset --hard "$onto"
328
361
if test " $mb " = " $branch "
329
362
then
330
363
echo >&2 " Fast-forwarded $branch_name to $onto_name ."
364
+ test -z " $stash " || git stash apply --index " $stash "
331
365
exit 0
332
366
fi
333
367
334
368
if test -z " $do_merge "
335
369
then
336
370
git format-patch -k --stdout --full-index --ignore-if-in-upstream " $upstream " ..ORIG_HEAD |
337
371
git am $git_am_opt --binary -3 -k --resolvemsg=" $RESOLVEMSG "
338
- exit $?
372
+ err=$?
373
+
374
+ if test $err = 0
375
+ then
376
+ test -z " $stash " || git stash apply --index " $stash "
377
+ exit
378
+ else
379
+ test -z " $stash " || echo " $stash " > .dotest/stash
380
+ exit $err
381
+ fi
339
382
fi
340
383
341
384
# start doing a rebase with git-merge
@@ -346,6 +389,7 @@ echo "$onto" > "$dotest/onto"
346
389
echo " $onto_name " > " $dotest /onto_name"
347
390
prev_head=` git rev-parse HEAD^0`
348
391
echo " $prev_head " > " $dotest /prev_head"
392
+ test -z " $stash " || echo " $stash " > " $dotest /stash"
349
393
350
394
msgnum=0
351
395
for cmt in ` git rev-list --reverse --no-merges " $upstream " ..ORIG_HEAD`
0 commit comments