git-am.sh 18.6 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
sq () {
56
	git rev-parse --sq-quote "$@"
57 58
}

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

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

    stop_here $1
}

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

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

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

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

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

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

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

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

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

155 156 157 158 159 160 161 162
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
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 199 200

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

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

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

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

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

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

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

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

437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
	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
455 456 457 458

	check_patch_format "$@"

	split_patches "$@"
459

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

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

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

if test "$this" -gt "$last"
then
S
Stephen Boyd 已提交
558
	say Nothing to do.
559 560 561 562 563 564 565 566 567
	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 已提交
568
		resume=
569 570 571
		go_next
		continue
	}
J
Junio C Hamano 已提交
572 573 574 575 576 577 578 579 580

	# 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.
581 582
	case "$resume" in
	'')
583
		git mailinfo $keep $no_inbody_headers $scissors $utf8 "$dotest/msg" "$dotest/patch" \
584 585
			<"$dotest/$msgnum" >"$dotest/info" ||
			stop_here $this
586 587

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

592
		test -s "$dotest/patch" || {
593
			echo "Patch is empty.  Was it split wrong?"
594 595
			stop_here $this
		}
T
Thomas Rast 已提交
596
		rm -f "$dotest/original-commit"
597 598 599 600 601 602 603
		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 已提交
604
			echo "$commit" > "$dotest/original-commit"
605
		else
J
Junio C Hamano 已提交
606 607 608 609 610 611
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
612
		fi
613 614
		;;
	esac
615 616 617 618

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

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

J
Junio C Hamano 已提交
626
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
627

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

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

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

J
Junio C Hamano 已提交
709 710
	case "$resolved" in
	'')
711 712 713 714 715 716 717 718
		# 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 已提交
719 720 721 722 723 724 725 726
		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=
727
		git diff-index --quiet --cached HEAD -- && {
728
			echo "No changes - did you forget to use 'git add'?"
729
			stop_here_user_resolve $this
730
		}
731
		unmerged=$(git ls-files -u)
732 733 734
		if test -n "$unmerged"
		then
			echo "You still have unmerged paths in your index"
735
			echo "did you forget to use 'git add'?"
736
			stop_here_user_resolve $this
737
		fi
J
Junio C Hamano 已提交
738
		apply_status=0
739
		git rerere
J
Junio C Hamano 已提交
740 741 742
		;;
	esac

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

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

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

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

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

792 793 794 795 796 797 798 799
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

800 801 802
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 已提交
803
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
804
    fi
T
Thomas Rast 已提交
805 806
fi

807
rm -fr "$dotest"
808
git gc --auto