git-am.sh 18.7 KB
Newer Older
1 2
#!/bin/sh
#
3
# Copyright (c) 2005, 2006 Junio C Hamano
4

5
SUBDIRECTORY_OK=Yes
6 7
OPTIONS_KEEPDASHDASH=
OPTIONS_SPEC="\
J
Junio C Hamano 已提交
8
git am [options] [<mbox>|<Maildir>...]
9
git am [options] (--resolved | --skip | --abort)
10
--
11
i,interactive   run interactively
J
Jay Soffian 已提交
12
b,binary*       (historical option -- no-op)
13
3,3way          allow fall back on 3way merging if needed
S
Stephen Boyd 已提交
14
q,quiet         be quiet
15 16
s,signoff       add a Signed-off-by line to the commit message
u,utf8          recode into utf8 (default)
17
k,keep          pass -k flag to git-mailinfo
18
keep-cr         pass --keep-cr flag to git-mailsplit for mbox format
19
no-keep-cr      do not pass --keep-cr flag to git-mailsplit independent of am.keepcr
20
c,scissors      strip everything before a scissors line
21
whitespace=     pass it through git-apply
22 23
ignore-space-change pass it through git-apply
ignore-whitespace pass it through git-apply
24
directory=      pass it through git-apply
25 26
C=              pass it through git-apply
p=              pass it through git-apply
27
patch-format=   format the patch(es) are in
28
reject          pass it through git-apply
29
resolvemsg=     override error message when patch failure occurs
J
Jeff King 已提交
30 31
continue        continue applying patches after resolving a conflict
r,resolved      synonyms for --continue
J
Junio C Hamano 已提交
32
skip            skip the current patch
N
Nanako Shiraishi 已提交
33
abort           restore the original branch and abort the patching operation.
34
committer-date-is-author-date    lie about committer date
35
ignore-date     use current timestamp for author date
36
rerere-autoupdate update the index with reused conflict resolution if possible
J
Jay Soffian 已提交
37
rebasing*       (internal use for git-rebase)"
38

39
. git-sh-setup
40
prefix=$(git rev-parse --show-prefix)
41
set_reflog_action am
42
require_work_tree
43
cd_to_toplevel
44

45 46
git var GIT_COMMITTER_IDENT >/dev/null ||
	die "You need to set your committer info first"
47

48 49 50 51 52 53 54
if git rev-parse --verify -q HEAD >/dev/null
then
	HAS_HEAD=yes
else
	HAS_HEAD=
fi

55 56 57 58 59 60 61 62 63 64
cmdline="git am"
if test '' != "$interactive"
then
	cmdline="$cmdline -i"
fi
if test '' != "$threeway"
then
	cmdline="$cmdline -3"
fi

65
sq () {
66
	git rev-parse --sq-quote "$@"
67 68
}

69 70 71 72 73
stop_here () {
    echo "$1" >"$dotest/next"
    exit 1
}

74
stop_here_user_resolve () {
75
    if [ -n "$resolvemsg" ]; then
J
Jeff King 已提交
76
	    printf '%s\n' "$resolvemsg"
77 78
	    stop_here $1
    fi
79 80
    echo "When you have resolved this problem run \"$cmdline --resolved\"."
    echo "If you would prefer to skip this patch, instead run \"$cmdline --skip\"."
N
Nanako Shiraishi 已提交
81
    echo "To restore the original branch and stop patching run \"$cmdline --abort\"."
82 83 84 85

    stop_here $1
}

86 87 88 89 90 91 92
go_next () {
	rm -f "$dotest/$msgnum" "$dotest/msg" "$dotest/msg-clean" \
		"$dotest/patch" "$dotest/info"
	echo "$next" >"$dotest/next"
	this=$next
}

93 94 95 96 97 98
cannot_fallback () {
	echo "$1"
	echo "Cannot fall back to three-way merge."
	exit 1
}

99 100 101 102 103 104 105
fall_back_3way () {
    O_OBJECT=`cd "$GIT_OBJECT_DIRECTORY" && pwd`

    rm -fr "$dotest"/patch-merge-*
    mkdir "$dotest/patch-merge-tmp-dir"

    # First see if the patch records the index info that we can use.
106 107
    git apply --build-fake-ancestor "$dotest/patch-merge-tmp-index" \
	"$dotest/patch" &&
108
    GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
109
    git write-tree >"$dotest/patch-merge-base+" ||
110
    cannot_fallback "Repository lacks necessary blobs to fall back on 3-way merge."
111

S
Stephen Boyd 已提交
112
    say Using index info to reconstruct a base tree...
113
    if GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
S
Stephan Beyer 已提交
114
	git apply --cached <"$dotest/patch"
115 116 117
    then
	mv "$dotest/patch-merge-base+" "$dotest/patch-merge-base"
	mv "$dotest/patch-merge-tmp-index" "$dotest/patch-merge-index"
118 119 120
    else
        cannot_fallback "Did you hand edit your patch?
It does not apply to blobs recorded in its index."
121 122 123
    fi

    test -f "$dotest/patch-merge-index" &&
124
    his_tree=$(GIT_INDEX_FILE="$dotest/patch-merge-index" git write-tree) &&
125 126 127
    orig_tree=$(cat "$dotest/patch-merge-base") &&
    rm -fr "$dotest"/patch-merge-* || exit 1

S
Stephen Boyd 已提交
128
    say Falling back to patching base and 3-way merge...
129 130 131 132

    # This is not so wrong.  Depending on which base we picked,
    # orig_tree may be wildly different from ours, but his_tree
    # has the same set of wildly different changes in parts the
133
    # patch did not touch, so recursive ends up canceling them,
134 135
    # saying that we reverted all those changes.

136
    eval GITHEAD_$his_tree='"$FIRSTLINE"'
137
    export GITHEAD_$his_tree
S
Stephen Boyd 已提交
138 139 140 141
    if test -n "$GIT_QUIET"
    then
	    export GIT_MERGE_VERBOSITY=0
    fi
142
    git-merge-recursive $orig_tree -- HEAD $his_tree || {
143
	    git rerere $allow_rerere_autoupdate
144 145 146
	    echo Failed to merge in the changes.
	    exit 1
    }
147
    unset GITHEAD_$his_tree
148 149
}

150 151 152 153 154 155
clean_abort () {
	test $# = 0 || echo >&2 "$@"
	rm -fr "$dotest"
	exit 1
}

156 157 158 159 160 161 162 163
patch_format=

check_patch_format () {
	# early return if patch_format was set from the command line
	if test -n "$patch_format"
	then
		return 0
	fi
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201

	# we default to mbox format if input is from stdin and for
	# directories
	if test $# = 0 || test "x$1" = "x-" || test -d "$1"
	then
		patch_format=mbox
		return 0
	fi

	# otherwise, check the first few lines of the first patch to try
	# to detect its format
	{
		read l1
		read l2
		read l3
		case "$l1" in
		"From "* | "From: "*)
			patch_format=mbox
			;;
		'# This series applies on GIT commit'*)
			patch_format=stgit-series
			;;
		"# HG changeset patch")
			patch_format=hg
			;;
		*)
			# if the second line is empty and the third is
			# a From, Author or Date entry, this is very
			# likely an StGIT patch
			case "$l2,$l3" in
			,"From: "* | ,"Author: "* | ,"Date: "*)
				patch_format=stgit
				;;
			*)
				;;
			esac
			;;
		esac
202 203 204 205 206 207 208 209 210 211
		if test -z "$patch_format" &&
			test -n "$l1" &&
			test -n "$l2" &&
			test -n "$l3"
		then
			# This begins with three non-empty lines.  Is this a
			# piece of e-mail a-la RFC2822?  Grab all the headers,
			# discarding the indented remainder of folded lines,
			# and see if it looks like that they all begin with the
			# header field names...
212 213
			tr -d '\015' <"$1" |
			sed -n -e '/^$/q' -e '/^[ 	]/d' -e p |
214
			sane_egrep -v '^[!-9;-~]+:' >/dev/null ||
215 216
			patch_format=mbox
		fi
217
	} < "$1" || clean_abort
218 219 220 221 222
}

split_patches () {
	case "$patch_format" in
	mbox)
223
		if test -n "$rebasing" || test t = "$keepcr"
224 225 226 227 228
		then
		    keep_cr=--keep-cr
		else
		    keep_cr=
		fi
229
		git mailsplit -d"$prec" -o"$dotest" -b $keep_cr -- "$@" > "$dotest/last" ||
230
		clean_abort
231
		;;
232 233 234
	stgit-series)
		if test $# -ne 1
		then
235
			clean_abort "Only one StGIT patch series can be applied at once"
236 237 238 239 240 241 242 243 244 245 246 247 248 249
		fi
		series_dir=`dirname "$1"`
		series_file="$1"
		shift
		{
			set x
			while read filename
			do
				set "$@" "$series_dir/$filename"
			done
			# remove the safety x
			shift
			# remove the arg coming from the first-line comment
			shift
250
		} < "$series_file" || clean_abort
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278
		# set the patch format appropriately
		patch_format=stgit
		# now handle the actual StGIT patches
		split_patches "$@"
		;;
	stgit)
		this=0
		for stgit in "$@"
		do
			this=`expr "$this" + 1`
			msgnum=`printf "%0${prec}d" $this`
			# Perl version of StGIT parse_patch. The first nonemptyline
			# not starting with Author, From or Date is the
			# subject, and the body starts with the next nonempty
			# line not starting with Author, From or Date
			perl -ne 'BEGIN { $subject = 0 }
				if ($subject > 1) { print ; }
				elsif (/^\s+$/) { next ; }
				elsif (/^Author:/) { print s/Author/From/ ; }
				elsif (/^(From|Date)/) { print ; }
				elsif ($subject) {
					$subject = 2 ;
					print "\n" ;
					print ;
				} else {
					print "Subject: ", $_ ;
					$subject = 1;
				}
279
			' < "$stgit" > "$dotest/$msgnum" || clean_abort
280 281 282 283 284
		done
		echo "$this" > "$dotest/last"
		this=
		msgnum=
		;;
285
	*)
286 287 288 289 290
		if test -n "$parse_patch" ; then
			clean_abort "Patch format $patch_format is not supported."
		else
			clean_abort "Patch format detection failed."
		fi
291 292 293 294
		;;
	esac
}

295
prec=4
296
dotest="$GIT_DIR/rebase-apply"
297
sign= utf8=t keep= keepcr= skip= interactive= resolved= rebasing= abort=
298
resolvemsg= resume= scissors= no_inbody_headers=
M
Michael S. Tsirkin 已提交
299
git_apply_opt=
300
committer_date_is_author_date=
301
ignore_date=
302
allow_rerere_autoupdate=
303

304 305 306 307 308
if test "$(git config --bool --get am.keepcr)" = true
then
    keepcr=t
fi

309
while test $# != 0
310 311
do
	case "$1" in
312 313 314
	-i|--interactive)
		interactive=t ;;
	-b|--binary)
S
Stephan Beyer 已提交
315
		: ;;
316 317
	-3|--3way)
		threeway=t ;;
318
	-s|--signoff)
319 320 321 322 323 324 325
		sign=t ;;
	-u|--utf8)
		utf8=t ;; # this is now default
	--no-utf8)
		utf8= ;;
	-k|--keep)
		keep=t ;;
326 327 328 329
	-c|--scissors)
		scissors=t ;;
	--no-scissors)
		scissors=f ;;
J
Jeff King 已提交
330
	-r|--resolved|--continue)
331 332 333
		resolved=t ;;
	--skip)
		skip=t ;;
N
Nanako Shiraishi 已提交
334 335
	--abort)
		abort=t ;;
J
Junio C Hamano 已提交
336
	--rebasing)
337
		rebasing=t threeway=t keep=t scissors=f no_inbody_headers=t ;;
338
	-d|--dotest)
339 340
		die "-d option is no longer supported.  Do not use."
		;;
341 342
	--resolvemsg)
		shift; resolvemsg=$1 ;;
343 344
	--whitespace|--directory)
		git_apply_opt="$git_apply_opt $(sq "$1=$2")"; shift ;;
345
	-C|-p)
346
		git_apply_opt="$git_apply_opt $(sq "$1$2")"; shift ;;
347 348
	--patch-format)
		shift ; patch_format="$1" ;;
349
	--reject|--ignore-whitespace|--ignore-space-change)
350
		git_apply_opt="$git_apply_opt $1" ;;
351 352
	--committer-date-is-author-date)
		committer_date_is_author_date=t ;;
353 354
	--ignore-date)
		ignore_date=t ;;
355 356
	--rerere-autoupdate|--no-rerere-autoupdate)
		allow_rerere_autoupdate="$1" ;;
S
Stephen Boyd 已提交
357 358
	-q|--quiet)
		GIT_QUIET=t ;;
359 360
	--keep-cr)
		keepcr=t ;;
361 362
	--no-keep-cr)
		keepcr=f ;;
363
	--)
364
		shift; break ;;
365
	*)
366
		usage ;;
367
	esac
368
	shift
369 370
done

J
Junio C Hamano 已提交
371 372
# If the dotest directory exists, but we have finished applying all the
# patches in them, clear it out.
373 374 375 376 377 378 379 380 381 382 383
if test -d "$dotest" &&
   last=$(cat "$dotest/last") &&
   next=$(cat "$dotest/next") &&
   test $# != 0 &&
   test "$next" -gt "$last"
then
   rm -fr "$dotest"
fi

if test -d "$dotest"
then
N
Nanako Shiraishi 已提交
384
	case "$#,$skip$resolved$abort" in
J
Junio C Hamano 已提交
385 386 387 388 389 390 391
	0,*t*)
		# Explicit resume command and we do not have file, so
		# we are happy.
		: ;;
	0,)
		# No file input but without resume parameters; catch
		# user error to feed us a patch from standard input
392
		# when there is already $dotest.  This is somewhat
J
Junio C Hamano 已提交
393 394 395
		# unreliable -- stdin could be /dev/null for example
		# and the caller did not intend to feed us a patch but
		# wanted to continue unattended.
J
Jay Soffian 已提交
396
		test -t 0
J
Junio C Hamano 已提交
397 398 399 400 401
		;;
	*)
		false
		;;
	esac ||
402
	die "previous rebase directory $dotest still exists but mbox given."
403
	resume=yes
N
Nanako Shiraishi 已提交
404

405
	case "$skip,$abort" in
406 407 408
	t,t)
		die "Please make up your mind. --skip or --abort?"
		;;
409 410 411 412 413 414 415 416
	t,)
		git rerere clear
		git read-tree --reset -u HEAD HEAD
		orig_head=$(cat "$GIT_DIR/ORIG_HEAD")
		git reset HEAD
		git update-ref ORIG_HEAD $orig_head
		;;
	,t)
417 418 419 420
		if test -f "$dotest/rebasing"
		then
			exec git rebase --abort
		fi
N
Nanako Shiraishi 已提交
421
		git rerere clear
422 423 424 425
		test -f "$dotest/dirtyindex" || {
			git read-tree --reset -u HEAD ORIG_HEAD
			git reset ORIG_HEAD
		}
N
Nanako Shiraishi 已提交
426 427 428
		rm -fr "$dotest"
		exit ;;
	esac
429
	rm -f "$dotest/dirtyindex"
430
else
N
Nanako Shiraishi 已提交
431 432
	# Make sure we are not given --skip, --resolved, nor --abort
	test "$skip$resolved$abort" = "" ||
433
		die "Resolve operation not in progress, we are not resuming."
434 435 436 437

	# Start afresh.
	mkdir -p "$dotest" || exit

438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455
	if test -n "$prefix" && test $# != 0
	then
		first=t
		for arg
		do
			test -n "$first" && {
				set x
				first=
			}
			case "$arg" in
			/*)
				set "$@" "$arg" ;;
			*)
				set "$@" "$prefix$arg" ;;
			esac
		done
		shift
	fi
456 457 458 459

	check_patch_format "$@"

	split_patches "$@"
460

461 462
	# -i can and must be given when resuming; everything
	# else is kept
463
	echo " $git_apply_opt" >"$dotest/apply-opt"
464
	echo "$threeway" >"$dotest/threeway"
465 466 467
	echo "$sign" >"$dotest/sign"
	echo "$utf8" >"$dotest/utf8"
	echo "$keep" >"$dotest/keep"
468
	echo "$keepcr" >"$dotest/keepcr"
469
	echo "$scissors" >"$dotest/scissors"
470
	echo "$no_inbody_headers" >"$dotest/no_inbody_headers"
S
Stephen Boyd 已提交
471
	echo "$GIT_QUIET" >"$dotest/quiet"
472
	echo 1 >"$dotest/next"
J
Junio C Hamano 已提交
473 474 475 476 477
	if test -n "$rebasing"
	then
		: >"$dotest/rebasing"
	else
		: >"$dotest/applying"
478 479 480 481 482 483
		if test -n "$HAS_HEAD"
		then
			git update-ref ORIG_HEAD HEAD
		else
			git update-ref -d ORIG_HEAD >/dev/null 2>&1
		fi
J
Junio C Hamano 已提交
484
	fi
485 486
fi

J
Junio C Hamano 已提交
487 488
case "$resolved" in
'')
489 490 491 492 493 494
	case "$HAS_HEAD" in
	'')
		files=$(git ls-files) ;;
	?*)
		files=$(git diff-index --cached --name-only HEAD --) ;;
	esac || exit
495 496
	if test "$files"
	then
497
		test -n "$HAS_HEAD" && : >"$dotest/dirtyindex"
498 499
		die "Dirty index: cannot apply patches (dirty: $files)"
	fi
J
Junio C Hamano 已提交
500 501
esac

502 503 504
if test "$(cat "$dotest/utf8")" = t
then
	utf8=-u
505 506
else
	utf8=-n
507 508 509 510 511
fi
if test "$(cat "$dotest/keep")" = t
then
	keep=-k
fi
512 513 514 515 516 517
case "$(cat "$dotest/keepcr")" in
t)
	keepcr=--keep-cr ;;
f)
	keepcr=--no-keep-cr ;;
esac
518 519 520 521 522 523
case "$(cat "$dotest/scissors")" in
t)
	scissors=--scissors ;;
f)
	scissors=--no-scissors ;;
esac
524 525 526 527 528 529
if test "$(cat "$dotest/no_inbody_headers")" = t
then
	no_inbody_headers=--no-inbody-headers
else
	no_inbody_headers=
fi
S
Stephen Boyd 已提交
530 531 532 533
if test "$(cat "$dotest/quiet")" = t
then
	GIT_QUIET=t
fi
534 535 536 537
if test "$(cat "$dotest/threeway")" = t
then
	threeway=t
fi
538
git_apply_opt=$(cat "$dotest/apply-opt")
539 540
if test "$(cat "$dotest/sign")" = t
then
541
	SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
542 543 544 545 546 547 548 549 550 551 552 553
			s/>.*/>/
			s/^/Signed-off-by: /'
		`
else
	SIGNOFF=
fi

last=`cat "$dotest/last"`
this=`cat "$dotest/next"`
if test "$skip" = t
then
	this=`expr "$this" + 1`
J
Jan Harkes 已提交
554
	resume=
555 556 557 558
fi

if test "$this" -gt "$last"
then
S
Stephen Boyd 已提交
559
	say Nothing to do.
560 561 562 563 564 565 566 567 568
	rm -fr "$dotest"
	exit
fi

while test "$this" -le "$last"
do
	msgnum=`printf "%0${prec}d" $this`
	next=`expr "$this" + 1`
	test -f "$dotest/$msgnum" || {
J
Jan Harkes 已提交
569
		resume=
570 571 572
		go_next
		continue
	}
J
Junio C Hamano 已提交
573 574 575 576 577 578 579 580 581

	# If we are not resuming, parse and extract the patch information
	# into separate files:
	#  - info records the authorship and title
	#  - msg is the rest of commit log message
	#  - patch is the patch body.
	#
	# When we are resuming, these files are either already prepared
	# by the user, or the user can tell us to do so by --resolved flag.
582 583
	case "$resume" in
	'')
584
		git mailinfo $keep $no_inbody_headers $scissors $utf8 "$dotest/msg" "$dotest/patch" \
585 586
			<"$dotest/$msgnum" >"$dotest/info" ||
			stop_here $this
587 588

		# skip pine's internal folder data
589
		sane_grep '^Author: Mail System Internal Data$' \
590 591 592
			<"$dotest"/info >/dev/null &&
			go_next && continue

593
		test -s "$dotest/patch" || {
594
			echo "Patch is empty.  Was it split wrong?"
595 596
			echo "If you would prefer to skip this patch, instead run \"$cmdline --skip\"."
			echo "To restore the original branch and stop patching run \"$cmdline --abort\"."
597 598
			stop_here $this
		}
T
Thomas Rast 已提交
599
		rm -f "$dotest/original-commit"
600 601 602 603 604 605 606
		if test -f "$dotest/rebasing" &&
			commit=$(sed -e 's/^From \([0-9a-f]*\) .*/\1/' \
				-e q "$dotest/$msgnum") &&
			test "$(git cat-file -t "$commit")" = commit
		then
			git cat-file commit "$commit" |
			sed -e '1,/^$/d' >"$dotest/msg-clean"
T
Thomas Rast 已提交
607
			echo "$commit" > "$dotest/original-commit"
608
		else
J
Junio C Hamano 已提交
609 610 611 612 613 614
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
615
		fi
616 617
		;;
	esac
618 619 620 621

	GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$dotest/info")"
	GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$dotest/info")"
	GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
622

623
	if test -z "$GIT_AUTHOR_EMAIL"
624
	then
625
		echo "Patch does not have a valid e-mail address."
626 627 628
		stop_here $this
	fi

J
Junio C Hamano 已提交
629
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
630

631 632 633 634
	case "$resume" in
	'')
	    if test '' != "$SIGNOFF"
	    then
635
		LAST_SIGNED_OFF_BY=`
636 637
		    sed -ne '/^Signed-off-by: /p' \
		    "$dotest/msg-clean" |
638
		    sed -ne '$p'
639
		`
640 641
		ADD_SIGNOFF=`
		    test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
642 643
		    test '' = "$LAST_SIGNED_OFF_BY" && echo
		    echo "$SIGNOFF"
644 645
		}`
	    else
646
		ADD_SIGNOFF=
647 648
	    fi
	    {
649 650 651 652 653 654 655 656
		if test -s "$dotest/msg-clean"
		then
			cat "$dotest/msg-clean"
		fi
		if test '' != "$ADD_SIGNOFF"
		then
			echo "$ADD_SIGNOFF"
		fi
657 658
	    } >"$dotest/final-commit"
	    ;;
J
Junio C Hamano 已提交
659
	*)
660
		case "$resolved$interactive" in
J
Junio C Hamano 已提交
661 662
		tt)
			# This is used only for interactive view option.
663
			git diff-index -p --cached HEAD -- >"$dotest/patch"
J
Junio C Hamano 已提交
664 665
			;;
		esac
666
	esac
667

668
	resume=
669 670
	if test "$interactive" = t
	then
671 672
	    test -t 0 ||
	    die "cannot be interactive without stdin connected to a terminal."
673 674 675 676 677 678 679
	    action=again
	    while test "$action" = again
	    do
		echo "Commit Body is:"
		echo "--------------------------"
		cat "$dotest/final-commit"
		echo "--------------------------"
J
Jason Riedy 已提交
680
		printf "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
681 682
		read reply
		case "$reply" in
683 684 685
		[yY]*) action=yes ;;
		[aA]*) action=yes interactive= ;;
		[nN]*) action=skip ;;
686
		[eE]*) git_editor "$dotest/final-commit"
687
		       action=again ;;
688
		[vV]*) action=again
J
Jonathan Nieder 已提交
689
		       git_pager "$dotest/patch" ;;
690
		*)     action=again ;;
691 692 693 694 695
		esac
	    done
	else
	    action=yes
	fi
696
	FIRSTLINE=$(sed 1q "$dotest/final-commit")
697 698 699 700 701 702 703 704 705 706 707 708 709

	if test $action = skip
	then
		go_next
		continue
	fi

	if test -x "$GIT_DIR"/hooks/applypatch-msg
	then
		"$GIT_DIR"/hooks/applypatch-msg "$dotest/final-commit" ||
		stop_here $this
	fi

S
Stephen Boyd 已提交
710
	say "Applying: $FIRSTLINE"
711

J
Junio C Hamano 已提交
712 713
	case "$resolved" in
	'')
714 715 716 717 718 719 720 721
		# When we are allowed to fall back to 3-way later, don't give
		# false errors during the initial attempt.
		squelch=
		if test "$threeway" = t
		then
			squelch='>/dev/null 2>&1 '
		fi
		eval "git apply $squelch$git_apply_opt"' --index "$dotest/patch"'
J
Junio C Hamano 已提交
722 723 724 725 726 727 728 729
		apply_status=$?
		;;
	t)
		# Resolved means the user did all the hard work, and
		# we do not have to do any patch application.  Just
		# trust what the user has in the index file and the
		# working tree.
		resolved=
730
		git diff-index --quiet --cached HEAD -- && {
731
			echo "No changes - did you forget to use 'git add'?"
732
			stop_here_user_resolve $this
733
		}
734
		unmerged=$(git ls-files -u)
735 736 737
		if test -n "$unmerged"
		then
			echo "You still have unmerged paths in your index"
738
			echo "did you forget to use 'git add'?"
739
			stop_here_user_resolve $this
740
		fi
J
Junio C Hamano 已提交
741
		apply_status=0
742
		git rerere
J
Junio C Hamano 已提交
743 744 745
		;;
	esac

746
	if test $apply_status != 0 && test "$threeway" = t
747
	then
748
		if (fall_back_3way)
749
		then
750 751
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
752
		    git diff-index --quiet --cached HEAD -- && {
S
Stephen Boyd 已提交
753
			say No changes -- Patch already applied.
754 755 756
			go_next
			continue
		    }
757 758
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
759 760 761 762
		fi
	fi
	if test $apply_status != 0
	then
763
		printf 'Patch failed at %s %s\n' "$msgnum" "$FIRSTLINE"
764
		stop_here_user_resolve $this
765 766 767 768 769 770 771
	fi

	if test -x "$GIT_DIR"/hooks/pre-applypatch
	then
		"$GIT_DIR"/hooks/pre-applypatch || stop_here $this
	fi

772
	tree=$(git write-tree) &&
773
	commit=$(
774 775 776 777
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
778
		parent=$(git rev-parse --verify -q HEAD) ||
S
Stephen Boyd 已提交
779
		say >&2 "applying to an empty history"
780

781 782 783 784 785
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
786
		git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
787
	) &&
788
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
789 790
	stop_here $this

T
Thomas Rast 已提交
791 792 793 794
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

795 796 797 798 799 800 801 802
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

803 804 805
if test -s "$dotest"/rewritten; then
    git notes copy --for-rewrite=rebase < "$dotest"/rewritten
    if test -x "$GIT_DIR"/hooks/post-rewrite; then
T
Thomas Rast 已提交
806
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
807
    fi
T
Thomas Rast 已提交
808 809
fi

810
rm -fr "$dotest"
811
git gc --auto