git-am.sh 19.5 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="\
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
stop_here () {
    echo "$1" >"$dotest/next"
71
    git rev-parse --verify -q HEAD >"$dotest/abort-safety"
72 73 74
    exit 1
}

75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
safe_to_abort () {
	if test -f "$dotest/dirtyindex"
	then
		return 1
	fi

	if ! test -s "$dotest/abort-safety"
	then
		return 0
	fi

	abort_safety=$(cat "$dotest/abort-safety")
	if test "z$(git rev-parse --verify -q HEAD)" = "z$abort_safety"
	then
		return 0
	fi
	echo >&2 "You seem to have moved HEAD since the last 'am' failure."
	echo >&2 "Not rewinding to ORIG_HEAD"
	return 1
}

96
stop_here_user_resolve () {
97
    if [ -n "$resolvemsg" ]; then
J
Jeff King 已提交
98
	    printf '%s\n' "$resolvemsg"
99 100
	    stop_here $1
    fi
101 102
    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 已提交
103
    echo "To restore the original branch and stop patching run \"$cmdline --abort\"."
104 105 106 107

    stop_here $1
}

108 109 110 111 112 113 114
go_next () {
	rm -f "$dotest/$msgnum" "$dotest/msg" "$dotest/msg-clean" \
		"$dotest/patch" "$dotest/info"
	echo "$next" >"$dotest/next"
	this=$next
}

115 116 117 118 119 120
cannot_fallback () {
	echo "$1"
	echo "Cannot fall back to three-way merge."
	exit 1
}

121 122 123 124 125 126 127
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.
128 129
    git apply --build-fake-ancestor "$dotest/patch-merge-tmp-index" \
	"$dotest/patch" &&
130
    GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
131
    git write-tree >"$dotest/patch-merge-base+" ||
132
    cannot_fallback "Repository lacks necessary blobs to fall back on 3-way merge."
133

S
Stephen Boyd 已提交
134
    say Using index info to reconstruct a base tree...
135
    if GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
S
Stephan Beyer 已提交
136
	git apply --cached <"$dotest/patch"
137 138 139
    then
	mv "$dotest/patch-merge-base+" "$dotest/patch-merge-base"
	mv "$dotest/patch-merge-tmp-index" "$dotest/patch-merge-index"
140 141 142
    else
        cannot_fallback "Did you hand edit your patch?
It does not apply to blobs recorded in its index."
143 144 145
    fi

    test -f "$dotest/patch-merge-index" &&
146
    his_tree=$(GIT_INDEX_FILE="$dotest/patch-merge-index" git write-tree) &&
147 148 149
    orig_tree=$(cat "$dotest/patch-merge-base") &&
    rm -fr "$dotest"/patch-merge-* || exit 1

S
Stephen Boyd 已提交
150
    say Falling back to patching base and 3-way merge...
151 152 153 154

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

158
    eval GITHEAD_$his_tree='"$FIRSTLINE"'
159
    export GITHEAD_$his_tree
S
Stephen Boyd 已提交
160 161
    if test -n "$GIT_QUIET"
    then
162
	    GIT_MERGE_VERBOSITY=0 && export GIT_MERGE_VERBOSITY
S
Stephen Boyd 已提交
163
    fi
164
    git-merge-recursive $orig_tree -- HEAD $his_tree || {
165
	    git rerere $allow_rerere_autoupdate
166 167 168
	    echo Failed to merge in the changes.
	    exit 1
    }
169
    unset GITHEAD_$his_tree
170 171
}

172 173 174 175 176 177
clean_abort () {
	test $# = 0 || echo >&2 "$@"
	rm -fr "$dotest"
	exit 1
}

178 179 180 181 182 183 184 185
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
186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223

	# 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
224 225 226 227 228 229 230 231 232 233
		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...
234 235
			tr -d '\015' <"$1" |
			sed -n -e '/^$/q' -e '/^[ 	]/d' -e p |
236
			sane_egrep -v '^[!-9;-~]+:' >/dev/null ||
237 238
			patch_format=mbox
		fi
239
	} < "$1" || clean_abort
240 241 242 243 244
}

split_patches () {
	case "$patch_format" in
	mbox)
245
		if test -n "$rebasing" || test t = "$keepcr"
246 247 248 249 250
		then
		    keep_cr=--keep-cr
		else
		    keep_cr=
		fi
251
		git mailsplit -d"$prec" -o"$dotest" -b $keep_cr -- "$@" > "$dotest/last" ||
252
		clean_abort
253
		;;
254 255 256
	stgit-series)
		if test $# -ne 1
		then
257
			clean_abort "Only one StGIT patch series can be applied at once"
258 259 260 261 262 263 264 265 266 267 268 269 270 271
		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
272
		} < "$series_file" || clean_abort
273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
		# 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;
				}
301
			' < "$stgit" > "$dotest/$msgnum" || clean_abort
302 303 304 305 306
		done
		echo "$this" > "$dotest/last"
		this=
		msgnum=
		;;
307
	*)
308 309
		if test -n "$patch_format"
		then
310 311 312 313
			clean_abort "Patch format $patch_format is not supported."
		else
			clean_abort "Patch format detection failed."
		fi
314 315 316 317
		;;
	esac
}

318
prec=4
319
dotest="$GIT_DIR/rebase-apply"
320
sign= utf8=t keep= keepcr= skip= interactive= resolved= rebasing= abort=
321
resolvemsg= resume= scissors= no_inbody_headers=
M
Michael S. Tsirkin 已提交
322
git_apply_opt=
323
committer_date_is_author_date=
324
ignore_date=
325
allow_rerere_autoupdate=
326

327 328 329 330 331
if test "$(git config --bool --get am.keepcr)" = true
then
    keepcr=t
fi

332
while test $# != 0
333 334
do
	case "$1" in
335 336 337
	-i|--interactive)
		interactive=t ;;
	-b|--binary)
S
Stephan Beyer 已提交
338
		: ;;
339 340
	-3|--3way)
		threeway=t ;;
341
	-s|--signoff)
342 343 344 345 346 347 348
		sign=t ;;
	-u|--utf8)
		utf8=t ;; # this is now default
	--no-utf8)
		utf8= ;;
	-k|--keep)
		keep=t ;;
349 350 351 352
	-c|--scissors)
		scissors=t ;;
	--no-scissors)
		scissors=f ;;
J
Jeff King 已提交
353
	-r|--resolved|--continue)
354 355 356
		resolved=t ;;
	--skip)
		skip=t ;;
N
Nanako Shiraishi 已提交
357 358
	--abort)
		abort=t ;;
J
Junio C Hamano 已提交
359
	--rebasing)
360
		rebasing=t threeway=t keep=t scissors=f no_inbody_headers=t ;;
361
	-d|--dotest)
362 363
		die "-d option is no longer supported.  Do not use."
		;;
364 365
	--resolvemsg)
		shift; resolvemsg=$1 ;;
366 367
	--whitespace|--directory)
		git_apply_opt="$git_apply_opt $(sq "$1=$2")"; shift ;;
368
	-C|-p)
369
		git_apply_opt="$git_apply_opt $(sq "$1$2")"; shift ;;
370 371
	--patch-format)
		shift ; patch_format="$1" ;;
372
	--reject|--ignore-whitespace|--ignore-space-change)
373
		git_apply_opt="$git_apply_opt $1" ;;
374 375
	--committer-date-is-author-date)
		committer_date_is_author_date=t ;;
376 377
	--ignore-date)
		ignore_date=t ;;
378 379
	--rerere-autoupdate|--no-rerere-autoupdate)
		allow_rerere_autoupdate="$1" ;;
S
Stephen Boyd 已提交
380 381
	-q|--quiet)
		GIT_QUIET=t ;;
382 383
	--keep-cr)
		keepcr=t ;;
384 385
	--no-keep-cr)
		keepcr=f ;;
386
	--)
387
		shift; break ;;
388
	*)
389
		usage ;;
390
	esac
391
	shift
392 393
done

J
Junio C Hamano 已提交
394 395
# If the dotest directory exists, but we have finished applying all the
# patches in them, clear it out.
396 397 398 399 400 401 402 403 404 405 406
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 已提交
407
	case "$#,$skip$resolved$abort" in
J
Junio C Hamano 已提交
408 409 410 411 412 413 414
	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
415
		# when there is already $dotest.  This is somewhat
J
Junio C Hamano 已提交
416 417 418
		# 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 已提交
419
		test -t 0
J
Junio C Hamano 已提交
420 421 422 423 424
		;;
	*)
		false
		;;
	esac ||
425
	die "previous rebase directory $dotest still exists but mbox given."
426
	resume=yes
N
Nanako Shiraishi 已提交
427

428
	case "$skip,$abort" in
429 430 431
	t,t)
		die "Please make up your mind. --skip or --abort?"
		;;
432 433 434 435 436 437 438 439
	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)
440 441 442 443
		if test -f "$dotest/rebasing"
		then
			exec git rebase --abort
		fi
N
Nanako Shiraishi 已提交
444
		git rerere clear
445 446
		if safe_to_abort
		then
447 448
			git read-tree --reset -u HEAD ORIG_HEAD
			git reset ORIG_HEAD
449
		fi
N
Nanako Shiraishi 已提交
450 451 452
		rm -fr "$dotest"
		exit ;;
	esac
453
	rm -f "$dotest/dirtyindex"
454
else
N
Nanako Shiraishi 已提交
455 456
	# Make sure we are not given --skip, --resolved, nor --abort
	test "$skip$resolved$abort" = "" ||
457
		die "Resolve operation not in progress, we are not resuming."
458 459 460 461

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

462 463 464 465 466 467 468 469 470
	if test -n "$prefix" && test $# != 0
	then
		first=t
		for arg
		do
			test -n "$first" && {
				set x
				first=
			}
471 472 473 474 475 476
			if is_absolute_path "$arg"
			then
				set "$@" "$arg"
			else
				set "$@" "$prefix$arg"
			fi
477 478 479
		done
		shift
	fi
480 481 482 483

	check_patch_format "$@"

	split_patches "$@"
484

485 486
	# -i can and must be given when resuming; everything
	# else is kept
487
	echo " $git_apply_opt" >"$dotest/apply-opt"
488
	echo "$threeway" >"$dotest/threeway"
489 490 491
	echo "$sign" >"$dotest/sign"
	echo "$utf8" >"$dotest/utf8"
	echo "$keep" >"$dotest/keep"
492
	echo "$keepcr" >"$dotest/keepcr"
493
	echo "$scissors" >"$dotest/scissors"
494
	echo "$no_inbody_headers" >"$dotest/no_inbody_headers"
S
Stephen Boyd 已提交
495
	echo "$GIT_QUIET" >"$dotest/quiet"
496
	echo 1 >"$dotest/next"
J
Junio C Hamano 已提交
497 498 499 500 501
	if test -n "$rebasing"
	then
		: >"$dotest/rebasing"
	else
		: >"$dotest/applying"
502 503 504 505 506 507
		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 已提交
508
	fi
509 510
fi

511 512
git update-index -q --refresh

J
Junio C Hamano 已提交
513 514
case "$resolved" in
'')
515 516 517 518 519 520
	case "$HAS_HEAD" in
	'')
		files=$(git ls-files) ;;
	?*)
		files=$(git diff-index --cached --name-only HEAD --) ;;
	esac || exit
521 522
	if test "$files"
	then
523
		test -n "$HAS_HEAD" && : >"$dotest/dirtyindex"
524 525
		die "Dirty index: cannot apply patches (dirty: $files)"
	fi
J
Junio C Hamano 已提交
526 527
esac

528 529 530
if test "$(cat "$dotest/utf8")" = t
then
	utf8=-u
531 532
else
	utf8=-n
533 534 535 536 537
fi
if test "$(cat "$dotest/keep")" = t
then
	keep=-k
fi
538 539 540 541 542 543
case "$(cat "$dotest/keepcr")" in
t)
	keepcr=--keep-cr ;;
f)
	keepcr=--no-keep-cr ;;
esac
544 545 546 547 548 549
case "$(cat "$dotest/scissors")" in
t)
	scissors=--scissors ;;
f)
	scissors=--no-scissors ;;
esac
550 551 552 553 554 555
if test "$(cat "$dotest/no_inbody_headers")" = t
then
	no_inbody_headers=--no-inbody-headers
else
	no_inbody_headers=
fi
S
Stephen Boyd 已提交
556 557 558 559
if test "$(cat "$dotest/quiet")" = t
then
	GIT_QUIET=t
fi
560 561 562 563
if test "$(cat "$dotest/threeway")" = t
then
	threeway=t
fi
564
git_apply_opt=$(cat "$dotest/apply-opt")
565 566
if test "$(cat "$dotest/sign")" = t
then
567
	SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
568 569 570 571 572 573 574 575 576 577 578 579
			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 已提交
580
	resume=
581 582 583 584 585 586 587
fi

while test "$this" -le "$last"
do
	msgnum=`printf "%0${prec}d" $this`
	next=`expr "$this" + 1`
	test -f "$dotest/$msgnum" || {
J
Jan Harkes 已提交
588
		resume=
589 590 591
		go_next
		continue
	}
J
Junio C Hamano 已提交
592 593 594 595 596 597 598 599 600

	# 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.
601 602
	case "$resume" in
	'')
603
		git mailinfo $keep $no_inbody_headers $scissors $utf8 "$dotest/msg" "$dotest/patch" \
604 605
			<"$dotest/$msgnum" >"$dotest/info" ||
			stop_here $this
606 607

		# skip pine's internal folder data
608
		sane_grep '^Author: Mail System Internal Data$' \
609 610 611
			<"$dotest"/info >/dev/null &&
			go_next && continue

612
		test -s "$dotest/patch" || {
613
			echo "Patch is empty.  Was it split wrong?"
614 615
			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\"."
616 617
			stop_here $this
		}
618
		rm -f "$dotest/original-commit" "$dotest/author-script"
619 620 621 622 623 624 625
		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 已提交
626
			echo "$commit" > "$dotest/original-commit"
627
			get_author_ident_from_commit "$commit" > "$dotest/author-script"
628
		else
J
Junio C Hamano 已提交
629 630 631 632 633 634
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
635
		fi
636 637
		;;
	esac
638

639 640 641 642 643 644 645 646
	if test -f "$dotest/author-script"
	then
		eval $(cat "$dotest/author-script")
	else
		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")"
	fi
647

648
	if test -z "$GIT_AUTHOR_EMAIL"
649
	then
650
		echo "Patch does not have a valid e-mail address."
651 652 653
		stop_here $this
	fi

J
Junio C Hamano 已提交
654
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
655

656 657 658 659
	case "$resume" in
	'')
	    if test '' != "$SIGNOFF"
	    then
660
		LAST_SIGNED_OFF_BY=`
661 662
		    sed -ne '/^Signed-off-by: /p' \
		    "$dotest/msg-clean" |
663
		    sed -ne '$p'
664
		`
665 666
		ADD_SIGNOFF=`
		    test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
667 668
		    test '' = "$LAST_SIGNED_OFF_BY" && echo
		    echo "$SIGNOFF"
669 670
		}`
	    else
671
		ADD_SIGNOFF=
672 673
	    fi
	    {
674 675 676 677 678 679 680 681
		if test -s "$dotest/msg-clean"
		then
			cat "$dotest/msg-clean"
		fi
		if test '' != "$ADD_SIGNOFF"
		then
			echo "$ADD_SIGNOFF"
		fi
682 683
	    } >"$dotest/final-commit"
	    ;;
J
Junio C Hamano 已提交
684
	*)
685
		case "$resolved$interactive" in
J
Junio C Hamano 已提交
686 687
		tt)
			# This is used only for interactive view option.
688
			git diff-index -p --cached HEAD -- >"$dotest/patch"
J
Junio C Hamano 已提交
689 690
			;;
		esac
691
	esac
692

693
	resume=
694 695
	if test "$interactive" = t
	then
696 697
	    test -t 0 ||
	    die "cannot be interactive without stdin connected to a terminal."
698 699 700 701 702 703 704
	    action=again
	    while test "$action" = again
	    do
		echo "Commit Body is:"
		echo "--------------------------"
		cat "$dotest/final-commit"
		echo "--------------------------"
J
Jason Riedy 已提交
705
		printf "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
706 707
		read reply
		case "$reply" in
708 709 710
		[yY]*) action=yes ;;
		[aA]*) action=yes interactive= ;;
		[nN]*) action=skip ;;
711
		[eE]*) git_editor "$dotest/final-commit"
712
		       action=again ;;
713
		[vV]*) action=again
J
Jonathan Nieder 已提交
714
		       git_pager "$dotest/patch" ;;
715
		*)     action=again ;;
716 717 718 719 720
		esac
	    done
	else
	    action=yes
	fi
721 722 723 724 725 726 727

	if test -f "$dotest/final-commit"
	then
		FIRSTLINE=$(sed 1q "$dotest/final-commit")
	else
		FIRSTLINE=""
	fi
728 729 730 731 732 733 734 735 736 737 738 739 740

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

J
Junio C Hamano 已提交
743 744
	case "$resolved" in
	'')
745 746 747 748 749 750 751 752
		# 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 已提交
753 754 755 756 757 758 759 760
		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=
761
		git diff-index --quiet --cached HEAD -- && {
762
			echo "No changes - did you forget to use 'git add'?"
763 764
			echo "If there is nothing left to stage, chances are that something else"
			echo "already introduced the same changes; you might want to skip this patch."
765
			stop_here_user_resolve $this
766
		}
767
		unmerged=$(git ls-files -u)
768 769 770
		if test -n "$unmerged"
		then
			echo "You still have unmerged paths in your index"
771
			echo "did you forget to use 'git add'?"
772
			stop_here_user_resolve $this
773
		fi
J
Junio C Hamano 已提交
774
		apply_status=0
775
		git rerere
J
Junio C Hamano 已提交
776 777 778
		;;
	esac

779
	if test $apply_status != 0 && test "$threeway" = t
780
	then
781
		if (fall_back_3way)
782
		then
783 784
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
785
		    git diff-index --quiet --cached HEAD -- && {
S
Stephen Boyd 已提交
786
			say No changes -- Patch already applied.
787 788 789
			go_next
			continue
		    }
790 791
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
792 793 794 795
		fi
	fi
	if test $apply_status != 0
	then
796
		printf 'Patch failed at %s %s\n' "$msgnum" "$FIRSTLINE"
797
		stop_here_user_resolve $this
798 799 800 801 802 803 804
	fi

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

805
	tree=$(git write-tree) &&
806
	commit=$(
807 808 809 810
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
811
		parent=$(git rev-parse --verify -q HEAD) ||
S
Stephen Boyd 已提交
812
		say >&2 "applying to an empty history"
813

814 815 816 817 818
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
819
		git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
820
	) &&
821
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
822 823
	stop_here $this

T
Thomas Rast 已提交
824 825 826 827
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

828 829 830 831 832 833 834 835
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

836 837 838
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 已提交
839
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
840
    fi
T
Thomas Rast 已提交
841 842
fi

843
rm -fr "$dotest"
844
git gc --auto