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
resolvemsg=     override error message when patch failure occurs
J
Jeff King 已提交
28 29
continue        continue applying patches after resolving a conflict
r,resolved      synonyms for --continue
J
Junio C Hamano 已提交
30
skip            skip the current patch
N
Nanako Shiraishi 已提交
31
abort           restore the original branch and abort the patching operation.
32
committer-date-is-author-date    lie about committer date
33
ignore-date     use current timestamp for author date
34
rerere-autoupdate update the index with reused conflict resolution if possible
J
Jay Soffian 已提交
35
rebasing*       (internal use for git-rebase)"
36

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

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

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

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

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

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

    stop_here $1
}

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

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

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

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

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

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

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

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

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

153 154 155 156 157 158 159 160
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
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 198

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

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

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

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

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

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

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

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

	check_patch_format "$@"

	split_patches "$@"
448

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	go_next
done

779 780
git gc --auto

781
rm -fr "$dotest"