git-am.sh 19.9 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
. git-sh-i18n
41
prefix=$(git rev-parse --show-prefix)
42
set_reflog_action am
43
require_work_tree
44
cd_to_toplevel
45

46
git var GIT_COMMITTER_IDENT >/dev/null ||
47
	die "$(gettext "You need to set your committer info first")"
48

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

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

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

70 71
stop_here () {
    echo "$1" >"$dotest/next"
72
    git rev-parse --verify -q HEAD >"$dotest/abort-safety"
73 74 75
    exit 1
}

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
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
92 93 94 95 96
	(
		gettext "You seem to have moved HEAD since the last 'am' failure.
Not rewinding to ORIG_HEAD" &&
		echo
	) >&2
97 98 99
	return 1
}

100
stop_here_user_resolve () {
101
    if [ -n "$resolvemsg" ]; then
J
Jeff King 已提交
102
	    printf '%s\n' "$resolvemsg"
103 104
	    stop_here $1
    fi
105 106 107
    eval_gettext "When you have resolved this problem run \"\$cmdline --resolved\".
If you would prefer to skip this patch, instead run \"\$cmdline --skip\".
To restore the original branch and stop patching run \"\$cmdline --abort\"."; echo
108 109 110 111

    stop_here $1
}

112 113 114 115 116 117 118
go_next () {
	rm -f "$dotest/$msgnum" "$dotest/msg" "$dotest/msg-clean" \
		"$dotest/patch" "$dotest/info"
	echo "$next" >"$dotest/next"
	this=$next
}

119 120
cannot_fallback () {
	echo "$1"
121
	gettext "Cannot fall back to three-way merge."; echo
122 123 124
	exit 1
}

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

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

    test -f "$dotest/patch-merge-index" &&
150
    his_tree=$(GIT_INDEX_FILE="$dotest/patch-merge-index" git write-tree) &&
151 152 153
    orig_tree=$(cat "$dotest/patch-merge-base") &&
    rm -fr "$dotest"/patch-merge-* || exit 1

154
    say "$(gettext "Falling back to patching base and 3-way merge...")"
155 156 157 158

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

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

176 177 178 179 180 181
clean_abort () {
	test $# = 0 || echo >&2 "$@"
	rm -fr "$dotest"
	exit 1
}

182 183 184 185 186 187 188 189
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
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 224 225 226 227

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

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

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

330 331 332 333 334
if test "$(git config --bool --get am.keepcr)" = true
then
    keepcr=t
fi

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

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

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

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

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

	check_patch_format "$@"

	split_patches "$@"
487

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

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

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

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

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

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

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

640 641 642 643 644 645 646 647
	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
648

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

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

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

694
	resume=
695 696
	if test "$interactive" = t
	then
697
	    test -t 0 ||
698
	    die "$(gettext "cannot be interactive without stdin connected to a terminal.")"
699 700 701
	    action=again
	    while test "$action" = again
	    do
702
		gettext "Commit Body is:"; echo
703 704 705
		echo "--------------------------"
		cat "$dotest/final-commit"
		echo "--------------------------"
706 707 708 709
		# TRANSLATORS: Make sure to include [y], [n], [e], [v] and [a]
		# in your translation. The program will only accept English
		# input at this point.
		gettext "Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all "
710 711
		read reply
		case "$reply" in
712 713 714
		[yY]*) action=yes ;;
		[aA]*) action=yes interactive= ;;
		[nN]*) action=skip ;;
715
		[eE]*) git_editor "$dotest/final-commit"
716
		       action=again ;;
717
		[vV]*) action=again
J
Jonathan Nieder 已提交
718
		       git_pager "$dotest/patch" ;;
719
		*)     action=again ;;
720 721 722 723 724
		esac
	    done
	else
	    action=yes
	fi
725 726 727 728 729 730 731

	if test -f "$dotest/final-commit"
	then
		FIRSTLINE=$(sed 1q "$dotest/final-commit")
	else
		FIRSTLINE=""
	fi
732 733 734 735 736 737 738 739 740 741 742 743 744

	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

745
	say "$(eval_gettext "Applying: \$FIRSTLINE")"
746

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

783
	if test $apply_status != 0 && test "$threeway" = t
784
	then
785
		if (fall_back_3way)
786
		then
787 788
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
789
		    git diff-index --quiet --cached HEAD -- && {
790
			say "$(gettext "No changes -- Patch already applied.")"
791 792 793
			go_next
			continue
		    }
794 795
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
796 797 798 799
		fi
	fi
	if test $apply_status != 0
	then
800
		eval_gettext 'Patch failed at $msgnum $FIRSTLINE'; echo
801
		stop_here_user_resolve $this
802 803 804 805 806 807 808
	fi

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

809
	tree=$(git write-tree) &&
810
	commit=$(
811 812 813 814
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
815
		parent=$(git rev-parse --verify -q HEAD) ||
816
		say >&2 "$(gettext "applying to an empty history")"
817

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

T
Thomas Rast 已提交
828 829 830 831
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

832 833 834 835 836 837 838 839
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

840 841 842
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 已提交
843
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
844
    fi
T
Thomas Rast 已提交
845 846
fi

847
rm -fr "$dotest"
848
git gc --auto