git-am.sh 17.8 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
c,scissors      strip everything before a scissors line
19
whitespace=     pass it through git-apply
20 21
ignore-space-change pass it through git-apply
ignore-whitespace pass it through git-apply
22
directory=      pass it through git-apply
23 24
C=              pass it through git-apply
p=              pass it through git-apply
25
patch-format=   format the patch(es) are in
26
reject          pass it through git-apply
27 28
resolvemsg=     override error message when patch failure occurs
r,resolved      to be used after a patch failure
J
Junio C Hamano 已提交
29
skip            skip the current patch
N
Nanako Shiraishi 已提交
30
abort           restore the original branch and abort the patching operation.
31
committer-date-is-author-date    lie about committer date
32
ignore-date     use current timestamp for author date
33
rerere-autoupdate update the index with reused conflict resolution if possible
J
Jay Soffian 已提交
34
rebasing*       (internal use for git-rebase)"
35

36
. git-sh-setup
37
prefix=$(git rev-parse --show-prefix)
38
set_reflog_action am
39
require_work_tree
40
cd_to_toplevel
41

42 43
git var GIT_COMMITTER_IDENT >/dev/null ||
	die "You need to set your committer info first"
44

45 46 47 48 49 50 51
if git rev-parse --verify -q HEAD >/dev/null
then
	HAS_HEAD=yes
else
	HAS_HEAD=
fi

52
sq () {
53
	git rev-parse --sq-quote "$@"
54 55
}

56 57 58 59 60
stop_here () {
    echo "$1" >"$dotest/next"
    exit 1
}

61
stop_here_user_resolve () {
62
    if [ -n "$resolvemsg" ]; then
J
Jeff King 已提交
63
	    printf '%s\n' "$resolvemsg"
64 65
	    stop_here $1
    fi
66
    cmdline="git am"
67 68 69 70 71 72 73 74 75 76
    if test '' != "$interactive"
    then
        cmdline="$cmdline -i"
    fi
    if test '' != "$threeway"
    then
        cmdline="$cmdline -3"
    fi
    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 已提交
77
    echo "To restore the original branch and stop patching run \"$cmdline --abort\"."
78 79 80 81

    stop_here $1
}

82 83 84 85 86 87 88
go_next () {
	rm -f "$dotest/$msgnum" "$dotest/msg" "$dotest/msg-clean" \
		"$dotest/patch" "$dotest/info"
	echo "$next" >"$dotest/next"
	this=$next
}

89 90 91 92 93 94
cannot_fallback () {
	echo "$1"
	echo "Cannot fall back to three-way merge."
	exit 1
}

95 96 97 98 99 100 101
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.
102 103
    git apply --build-fake-ancestor "$dotest/patch-merge-tmp-index" \
	"$dotest/patch" &&
104
    GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
105
    git write-tree >"$dotest/patch-merge-base+" ||
106
    cannot_fallback "Repository lacks necessary blobs to fall back on 3-way merge."
107

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

    test -f "$dotest/patch-merge-index" &&
120
    his_tree=$(GIT_INDEX_FILE="$dotest/patch-merge-index" git write-tree) &&
121 122 123
    orig_tree=$(cat "$dotest/patch-merge-base") &&
    rm -fr "$dotest"/patch-merge-* || exit 1

S
Stephen Boyd 已提交
124
    say Falling back to patching base and 3-way merge...
125 126 127 128

    # 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
129
    # patch did not touch, so recursive ends up canceling them,
130 131
    # saying that we reverted all those changes.

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

146 147 148 149 150 151
clean_abort () {
	test $# = 0 || echo >&2 "$@"
	rm -fr "$dotest"
	exit 1
}

152 153 154 155 156 157 158 159
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
160 161 162 163 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

	# 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
198 199 200 201 202 203 204 205 206 207
		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...
208 209
			tr -d '\015' <"$1" |
			sed -n -e '/^$/q' -e '/^[ 	]/d' -e p |
210
			sane_egrep -v '^[!-9;-~]+:' >/dev/null ||
211 212
			patch_format=mbox
		fi
213
	} < "$1" || clean_abort
214 215 216 217 218
}

split_patches () {
	case "$patch_format" in
	mbox)
219 220 221 222 223 224 225
		case "$rebasing" in
		'')
			keep_cr= ;;
		?*)
			keep_cr=--keep-cr ;;
		esac
		git mailsplit -d"$prec" -o"$dotest" -b $keep_cr -- "$@" > "$dotest/last" ||
226
		clean_abort
227
		;;
228 229 230
	stgit-series)
		if test $# -ne 1
		then
231
			clean_abort "Only one StGIT patch series can be applied at once"
232 233 234 235 236 237 238 239 240 241 242 243 244 245
		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
246
		} < "$series_file" || clean_abort
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
		# 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;
				}
275
			' < "$stgit" > "$dotest/$msgnum" || clean_abort
276 277 278 279 280
		done
		echo "$this" > "$dotest/last"
		this=
		msgnum=
		;;
281
	*)
282 283 284 285 286
		if test -n "$parse_patch" ; then
			clean_abort "Patch format $patch_format is not supported."
		else
			clean_abort "Patch format detection failed."
		fi
287 288 289 290
		;;
	esac
}

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

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

J
Junio C Hamano 已提交
358 359
# If the dotest directory exists, but we have finished applying all the
# patches in them, clear it out.
360 361 362 363 364 365 366 367 368 369 370
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 已提交
371
	case "$#,$skip$resolved$abort" in
J
Junio C Hamano 已提交
372 373 374 375 376 377 378
	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
379
		# when there is already $dotest.  This is somewhat
J
Junio C Hamano 已提交
380 381 382
		# 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 已提交
383
		test -t 0
J
Junio C Hamano 已提交
384 385 386 387 388
		;;
	*)
		false
		;;
	esac ||
389
	die "previous rebase directory $dotest still exists but mbox given."
390
	resume=yes
N
Nanako Shiraishi 已提交
391

392
	case "$skip,$abort" in
393 394 395
	t,t)
		die "Please make up your mind. --skip or --abort?"
		;;
396 397 398 399 400 401 402 403
	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)
404 405 406 407
		if test -f "$dotest/rebasing"
		then
			exec git rebase --abort
		fi
N
Nanako Shiraishi 已提交
408
		git rerere clear
409 410 411 412
		test -f "$dotest/dirtyindex" || {
			git read-tree --reset -u HEAD ORIG_HEAD
			git reset ORIG_HEAD
		}
N
Nanako Shiraishi 已提交
413 414 415
		rm -fr "$dotest"
		exit ;;
	esac
416
	rm -f "$dotest/dirtyindex"
417
else
N
Nanako Shiraishi 已提交
418 419
	# Make sure we are not given --skip, --resolved, nor --abort
	test "$skip$resolved$abort" = "" ||
420
		die "Resolve operation not in progress, we are not resuming."
421 422 423 424

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

425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442
	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
443 444 445 446

	check_patch_format "$@"

	split_patches "$@"
447

448 449
	# -i can and must be given when resuming; everything
	# else is kept
450
	echo " $git_apply_opt" >"$dotest/apply-opt"
451
	echo "$threeway" >"$dotest/threeway"
452 453 454
	echo "$sign" >"$dotest/sign"
	echo "$utf8" >"$dotest/utf8"
	echo "$keep" >"$dotest/keep"
455
	echo "$scissors" >"$dotest/scissors"
456
	echo "$no_inbody_headers" >"$dotest/no_inbody_headers"
S
Stephen Boyd 已提交
457
	echo "$GIT_QUIET" >"$dotest/quiet"
458
	echo 1 >"$dotest/next"
J
Junio C Hamano 已提交
459 460 461 462 463
	if test -n "$rebasing"
	then
		: >"$dotest/rebasing"
	else
		: >"$dotest/applying"
464 465 466 467 468 469
		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 已提交
470
	fi
471 472
fi

J
Junio C Hamano 已提交
473 474
case "$resolved" in
'')
475 476 477 478 479 480
	case "$HAS_HEAD" in
	'')
		files=$(git ls-files) ;;
	?*)
		files=$(git diff-index --cached --name-only HEAD --) ;;
	esac || exit
481 482
	if test "$files"
	then
483
		test -n "$HAS_HEAD" && : >"$dotest/dirtyindex"
484 485
		die "Dirty index: cannot apply patches (dirty: $files)"
	fi
J
Junio C Hamano 已提交
486 487
esac

488 489 490
if test "$(cat "$dotest/utf8")" = t
then
	utf8=-u
491 492
else
	utf8=-n
493 494 495 496 497
fi
if test "$(cat "$dotest/keep")" = t
then
	keep=-k
fi
498 499 500 501 502 503
case "$(cat "$dotest/scissors")" in
t)
	scissors=--scissors ;;
f)
	scissors=--no-scissors ;;
esac
504 505 506 507 508 509
if test "$(cat "$dotest/no_inbody_headers")" = t
then
	no_inbody_headers=--no-inbody-headers
else
	no_inbody_headers=
fi
S
Stephen Boyd 已提交
510 511 512 513
if test "$(cat "$dotest/quiet")" = t
then
	GIT_QUIET=t
fi
514 515 516 517
if test "$(cat "$dotest/threeway")" = t
then
	threeway=t
fi
518
git_apply_opt=$(cat "$dotest/apply-opt")
519 520
if test "$(cat "$dotest/sign")" = t
then
521
	SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
522 523 524 525 526 527 528 529 530 531 532 533
			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 已提交
534
	resume=
535 536 537 538
fi

if test "$this" -gt "$last"
then
S
Stephen Boyd 已提交
539
	say Nothing to do.
540 541 542 543 544 545 546 547 548
	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 已提交
549
		resume=
550 551 552
		go_next
		continue
	}
J
Junio C Hamano 已提交
553 554 555 556 557 558 559 560 561

	# 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.
562 563
	case "$resume" in
	'')
564
		git mailinfo $keep $no_inbody_headers $scissors $utf8 "$dotest/msg" "$dotest/patch" \
565 566
			<"$dotest/$msgnum" >"$dotest/info" ||
			stop_here $this
567 568

		# skip pine's internal folder data
569
		sane_grep '^Author: Mail System Internal Data$' \
570 571 572
			<"$dotest"/info >/dev/null &&
			go_next && continue

573
		test -s "$dotest/patch" || {
574
			echo "Patch is empty.  Was it split wrong?"
575 576
			stop_here $this
		}
577 578 579 580 581 582 583 584
		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"
		else
J
Junio C Hamano 已提交
585 586 587 588 589 590
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
591
		fi
592 593
		;;
	esac
594 595 596 597

	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")"
598

599
	if test -z "$GIT_AUTHOR_EMAIL"
600
	then
601
		echo "Patch does not have a valid e-mail address."
602 603 604
		stop_here $this
	fi

J
Junio C Hamano 已提交
605
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
606

607 608 609 610
	case "$resume" in
	'')
	    if test '' != "$SIGNOFF"
	    then
611
		LAST_SIGNED_OFF_BY=`
612 613
		    sed -ne '/^Signed-off-by: /p' \
		    "$dotest/msg-clean" |
614
		    sed -ne '$p'
615
		`
616 617
		ADD_SIGNOFF=`
		    test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
618 619
		    test '' = "$LAST_SIGNED_OFF_BY" && echo
		    echo "$SIGNOFF"
620 621
		}`
	    else
622
		ADD_SIGNOFF=
623 624
	    fi
	    {
625 626 627 628 629 630 631 632
		if test -s "$dotest/msg-clean"
		then
			cat "$dotest/msg-clean"
		fi
		if test '' != "$ADD_SIGNOFF"
		then
			echo "$ADD_SIGNOFF"
		fi
633 634
	    } >"$dotest/final-commit"
	    ;;
J
Junio C Hamano 已提交
635
	*)
636
		case "$resolved$interactive" in
J
Junio C Hamano 已提交
637 638
		tt)
			# This is used only for interactive view option.
639
			git diff-index -p --cached HEAD -- >"$dotest/patch"
J
Junio C Hamano 已提交
640 641
			;;
		esac
642
	esac
643

644
	resume=
645 646
	if test "$interactive" = t
	then
647 648
	    test -t 0 ||
	    die "cannot be interactive without stdin connected to a terminal."
649 650 651 652 653 654 655
	    action=again
	    while test "$action" = again
	    do
		echo "Commit Body is:"
		echo "--------------------------"
		cat "$dotest/final-commit"
		echo "--------------------------"
J
Jason Riedy 已提交
656
		printf "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
657 658
		read reply
		case "$reply" in
659 660 661
		[yY]*) action=yes ;;
		[aA]*) action=yes interactive= ;;
		[nN]*) action=skip ;;
662
		[eE]*) git_editor "$dotest/final-commit"
663
		       action=again ;;
664
		[vV]*) action=again
665 666 667 668
		       : ${GIT_PAGER=$(git var GIT_PAGER)}
		       : ${LESS=-FRSX}
		       export LESS
		       $GIT_PAGER "$dotest/patch" ;;
669
		*)     action=again ;;
670 671 672 673 674
		esac
	    done
	else
	    action=yes
	fi
675
	FIRSTLINE=$(sed 1q "$dotest/final-commit")
676 677 678 679 680 681 682 683 684 685 686 687 688

	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 已提交
689
	say "Applying: $FIRSTLINE"
690

J
Junio C Hamano 已提交
691 692
	case "$resolved" in
	'')
693 694 695 696 697 698 699 700
		# 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 已提交
701 702 703 704 705 706 707 708
		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=
709
		git diff-index --quiet --cached HEAD -- && {
710
			echo "No changes - did you forget to use 'git add'?"
711
			stop_here_user_resolve $this
712
		}
713
		unmerged=$(git ls-files -u)
714 715 716
		if test -n "$unmerged"
		then
			echo "You still have unmerged paths in your index"
717
			echo "did you forget to use 'git add'?"
718
			stop_here_user_resolve $this
719
		fi
J
Junio C Hamano 已提交
720
		apply_status=0
721
		git rerere
J
Junio C Hamano 已提交
722 723 724
		;;
	esac

725 726
	if test $apply_status = 1 && test "$threeway" = t
	then
727
		if (fall_back_3way)
728
		then
729 730
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
731
		    git diff-index --quiet --cached HEAD -- && {
S
Stephen Boyd 已提交
732
			say No changes -- Patch already applied.
733 734 735
			go_next
			continue
		    }
736 737
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
738 739 740 741
		fi
	fi
	if test $apply_status != 0
	then
742
		printf 'Patch failed at %s %s\n' "$msgnum" "$FIRSTLINE"
743
		stop_here_user_resolve $this
744 745 746 747 748 749 750
	fi

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

751
	tree=$(git write-tree) &&
752
	commit=$(
753 754 755 756
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
757
		parent=$(git rev-parse --verify -q HEAD) ||
S
Stephen Boyd 已提交
758
		say >&2 "applying to an empty history"
759

760 761 762 763 764
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
765
		git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
766
	) &&
767
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
768 769 770 771 772 773 774 775 776 777
	stop_here $this

	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

778 779
git gc --auto

780
rm -fr "$dotest"