git-am.sh 21.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
T
Thomas Rast 已提交
18
keep-non-patch  pass -b flag to git-mailinfo
19
keep-cr         pass --keep-cr flag to git-mailsplit for mbox format
20
no-keep-cr      do not pass --keep-cr flag to git-mailsplit independent of am.keepcr
21
c,scissors      strip everything before a scissors line
22
whitespace=     pass it through git-apply
23 24
ignore-space-change pass it through git-apply
ignore-whitespace pass it through git-apply
25
directory=      pass it through git-apply
26
exclude=        pass it through git-apply
27 28
C=              pass it through git-apply
p=              pass it through git-apply
29
patch-format=   format the patch(es) are in
30
reject          pass it through git-apply
31
resolvemsg=     override error message when patch failure occurs
J
Jeff King 已提交
32 33
continue        continue applying patches after resolving a conflict
r,resolved      synonyms for --continue
J
Junio C Hamano 已提交
34
skip            skip the current patch
N
Nanako Shiraishi 已提交
35
abort           restore the original branch and abort the patching operation.
36
committer-date-is-author-date    lie about committer date
37
ignore-date     use current timestamp for author date
38
rerere-autoupdate update the index with reused conflict resolution if possible
J
Jay Soffian 已提交
39
rebasing*       (internal use for git-rebase)"
40

41
. git-sh-setup
42
. git-sh-i18n
43
prefix=$(git rev-parse --show-prefix)
44
set_reflog_action am
45
require_work_tree
46
cd_to_toplevel
47

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

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

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

68
sq () {
69
	git rev-parse --sq-quote "$@"
70 71
}

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

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

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

    stop_here $1
}

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

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

124 125 126 127 128 129 130
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.
131 132 133
    cmd="git apply $git_apply_opt --build-fake-ancestor" &&
    cmd="$cmd "'"$dotest/patch-merge-tmp-index" "$dotest/patch"' &&
    eval "$cmd" &&
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 140 141 142

    cmd='GIT_INDEX_FILE="$dotest/patch-merge-tmp-index"'
    cmd="$cmd git apply --cached $git_apply_opt"' <"$dotest/patch"'
    if eval "$cmd"
143 144 145
    then
	mv "$dotest/patch-merge-base+" "$dotest/patch-merge-base"
	mv "$dotest/patch-merge-tmp-index" "$dotest/patch-merge-index"
146
    else
147 148
	cannot_fallback "$(gettext "Did you hand edit your patch?
It does not apply to blobs recorded in its index.")"
149 150 151
    fi

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

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

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

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

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

184 185 186 187 188 189 190 191
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
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

201 202
	# otherwise, check the first few non-blank lines of the first
	# patch to try to detect its format
203
	{
204 205 206 207
		# Start from first line containing non-whitespace
		l1=
		while test -z "$l1"
		do
208
			read l1 || break
209
		done
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
		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
235 236 237 238 239 240 241 242 243 244
		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...
245 246
			tr -d '\015' <"$1" |
			sed -n -e '/^$/q' -e '/^[ 	]/d' -e p |
247
			sane_egrep -v '^[!-9;-~]+:' >/dev/null ||
248 249
			patch_format=mbox
		fi
250
	} < "$1" || clean_abort
251 252 253 254 255
}

split_patches () {
	case "$patch_format" in
	mbox)
256
		if test -n "$rebasing" || test t = "$keepcr"
257 258 259 260 261
		then
		    keep_cr=--keep-cr
		else
		    keep_cr=
		fi
262
		git mailsplit -d"$prec" -o"$dotest" -b $keep_cr -- "$@" > "$dotest/last" ||
263
		clean_abort
264
		;;
265 266 267
	stgit-series)
		if test $# -ne 1
		then
268
			clean_abort "$(gettext "Only one StGIT patch series can be applied at once")"
269 270 271 272 273 274 275 276 277 278 279 280 281 282
		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
283
		} < "$series_file" || clean_abort
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
		# 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 ; }
G
Giuseppe Bilotta 已提交
302
				elsif (/^Author:/) { s/Author/From/ ; print ;}
303 304 305 306 307 308 309 310 311
				elsif (/^(From|Date)/) { print ; }
				elsif ($subject) {
					$subject = 2 ;
					print "\n" ;
					print ;
				} else {
					print "Subject: ", $_ ;
					$subject = 1;
				}
312
			' < "$stgit" > "$dotest/$msgnum" || clean_abort
313 314 315 316 317
		done
		echo "$this" > "$dotest/last"
		this=
		msgnum=
		;;
318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
	hg)
		this=0
		for hg in "$@"
		do
			this=$(( $this + 1 ))
			msgnum=$(printf "%0${prec}d" $this)
			# hg stores changeset metadata in #-commented lines preceding
			# the commit message and diff(s). The only metadata we care about
			# are the User and Date (Node ID and Parent are hashes which are
			# only relevant to the hg repository and thus not useful to us)
			# Since we cannot guarantee that the commit message is in
			# git-friendly format, we put no Subject: line and just consume
			# all of the message as the body
			perl -M'POSIX qw(strftime)' -ne 'BEGIN { $subject = 0 }
				if ($subject) { print ; }
				elsif (/^\# User /) { s/\# User/From:/ ; print ; }
				elsif (/^\# Date /) {
					my ($hashsign, $str, $time, $tz) = split ;
					$tz = sprintf "%+05d", (0-$tz)/36;
					print "Date: " .
					      strftime("%a, %d %b %Y %H:%M:%S ",
						       localtime($time))
					      . "$tz\n";
				} elsif (/^\# /) { next ; }
				else {
					print "\n", $_ ;
					$subject = 1;
				}
			' <"$hg" >"$dotest/$msgnum" || clean_abort
		done
		echo "$this" >"$dotest/last"
		this=
		msgnum=
		;;
352
	*)
353 354
		if test -n "$patch_format"
		then
355
			clean_abort "$(eval_gettext "Patch format \$patch_format is not supported.")"
356
		else
357
			clean_abort "$(gettext "Patch format detection failed.")"
358
		fi
359 360 361 362
		;;
	esac
}

363
prec=4
364
dotest="$GIT_DIR/rebase-apply"
365
sign= utf8=t keep= keepcr= skip= interactive= resolved= rebasing= abort=
366
resolvemsg= resume= scissors= no_inbody_headers=
M
Michael S. Tsirkin 已提交
367
git_apply_opt=
368
committer_date_is_author_date=
369
ignore_date=
370
allow_rerere_autoupdate=
371

372 373 374 375 376
if test "$(git config --bool --get am.keepcr)" = true
then
    keepcr=t
fi

377
while test $# != 0
378 379
do
	case "$1" in
380 381 382
	-i|--interactive)
		interactive=t ;;
	-b|--binary)
383 384
		echo >&2 "The $1 option has been a no-op for long time, and"
		echo >&2 "it will be removed. Please do not use it anymore."
385
		;;
386 387
	-3|--3way)
		threeway=t ;;
388
	-s|--signoff)
389 390 391 392 393 394 395
		sign=t ;;
	-u|--utf8)
		utf8=t ;; # this is now default
	--no-utf8)
		utf8= ;;
	-k|--keep)
		keep=t ;;
T
Thomas Rast 已提交
396 397
	--keep-non-patch)
		keep=b ;;
398 399 400 401
	-c|--scissors)
		scissors=t ;;
	--no-scissors)
		scissors=f ;;
J
Jeff King 已提交
402
	-r|--resolved|--continue)
403 404 405
		resolved=t ;;
	--skip)
		skip=t ;;
N
Nanako Shiraishi 已提交
406 407
	--abort)
		abort=t ;;
J
Junio C Hamano 已提交
408
	--rebasing)
409
		rebasing=t threeway=t keep=t scissors=f no_inbody_headers=t ;;
410
	-d|--dotest)
411
		die "$(gettext "-d option is no longer supported.  Do not use.")"
412
		;;
413 414
	--resolvemsg)
		shift; resolvemsg=$1 ;;
415
	--whitespace|--directory|--exclude)
416
		git_apply_opt="$git_apply_opt $(sq "$1=$2")"; shift ;;
417
	-C|-p)
418
		git_apply_opt="$git_apply_opt $(sq "$1$2")"; shift ;;
419 420
	--patch-format)
		shift ; patch_format="$1" ;;
421
	--reject|--ignore-whitespace|--ignore-space-change)
422
		git_apply_opt="$git_apply_opt $1" ;;
423 424
	--committer-date-is-author-date)
		committer_date_is_author_date=t ;;
425 426
	--ignore-date)
		ignore_date=t ;;
427 428
	--rerere-autoupdate|--no-rerere-autoupdate)
		allow_rerere_autoupdate="$1" ;;
S
Stephen Boyd 已提交
429 430
	-q|--quiet)
		GIT_QUIET=t ;;
431 432
	--keep-cr)
		keepcr=t ;;
433 434
	--no-keep-cr)
		keepcr=f ;;
435
	--)
436
		shift; break ;;
437
	*)
438
		usage ;;
439
	esac
440
	shift
441 442
done

J
Junio C Hamano 已提交
443 444
# If the dotest directory exists, but we have finished applying all the
# patches in them, clear it out.
445 446 447 448 449 450 451 452 453 454 455
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 已提交
456
	case "$#,$skip$resolved$abort" in
J
Junio C Hamano 已提交
457 458 459 460 461 462 463
	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
464
		# when there is already $dotest.  This is somewhat
J
Junio C Hamano 已提交
465 466 467
		# 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 已提交
468
		test -t 0
J
Junio C Hamano 已提交
469 470 471 472 473
		;;
	*)
		false
		;;
	esac ||
474
	die "$(eval_gettext "previous rebase directory \$dotest still exists but mbox given.")"
475
	resume=yes
N
Nanako Shiraishi 已提交
476

477
	case "$skip,$abort" in
478
	t,t)
479
		die "$(gettext "Please make up your mind. --skip or --abort?")"
480
		;;
481 482 483 484 485 486 487 488
	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)
489 490 491 492
		if test -f "$dotest/rebasing"
		then
			exec git rebase --abort
		fi
N
Nanako Shiraishi 已提交
493
		git rerere clear
494 495
		if safe_to_abort
		then
496 497
			git read-tree --reset -u HEAD ORIG_HEAD
			git reset ORIG_HEAD
498
		fi
N
Nanako Shiraishi 已提交
499 500 501
		rm -fr "$dotest"
		exit ;;
	esac
502
	rm -f "$dotest/dirtyindex"
503
else
N
Nanako Shiraishi 已提交
504 505
	# Make sure we are not given --skip, --resolved, nor --abort
	test "$skip$resolved$abort" = "" ||
506
		die "$(gettext "Resolve operation not in progress, we are not resuming.")"
507 508 509 510

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

511 512 513 514 515 516 517 518 519
	if test -n "$prefix" && test $# != 0
	then
		first=t
		for arg
		do
			test -n "$first" && {
				set x
				first=
			}
520 521 522 523 524 525
			if is_absolute_path "$arg"
			then
				set "$@" "$arg"
			else
				set "$@" "$prefix$arg"
			fi
526 527 528
		done
		shift
	fi
529 530 531 532

	check_patch_format "$@"

	split_patches "$@"
533

534 535
	# -i can and must be given when resuming; everything
	# else is kept
536
	echo " $git_apply_opt" >"$dotest/apply-opt"
537
	echo "$threeway" >"$dotest/threeway"
538 539 540
	echo "$sign" >"$dotest/sign"
	echo "$utf8" >"$dotest/utf8"
	echo "$keep" >"$dotest/keep"
541
	echo "$scissors" >"$dotest/scissors"
542
	echo "$no_inbody_headers" >"$dotest/no_inbody_headers"
S
Stephen Boyd 已提交
543
	echo "$GIT_QUIET" >"$dotest/quiet"
544
	echo 1 >"$dotest/next"
J
Junio C Hamano 已提交
545 546 547 548 549
	if test -n "$rebasing"
	then
		: >"$dotest/rebasing"
	else
		: >"$dotest/applying"
550 551 552 553 554 555
		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 已提交
556
	fi
557 558
fi

559 560
git update-index -q --refresh

J
Junio C Hamano 已提交
561 562
case "$resolved" in
'')
563 564 565 566 567 568
	case "$HAS_HEAD" in
	'')
		files=$(git ls-files) ;;
	?*)
		files=$(git diff-index --cached --name-only HEAD --) ;;
	esac || exit
569 570
	if test "$files"
	then
571
		test -n "$HAS_HEAD" && : >"$dotest/dirtyindex"
572
		die "$(eval_gettext "Dirty index: cannot apply patches (dirty: \$files)")"
573
	fi
J
Junio C Hamano 已提交
574 575
esac

T
Thomas Rast 已提交
576 577 578 579
# Now, decide what command line options we will give to the git
# commands we invoke, based on the result of parsing command line
# options and previous invocation state stored in $dotest/ files.

580 581 582
if test "$(cat "$dotest/utf8")" = t
then
	utf8=-u
583 584
else
	utf8=-n
585
fi
T
Thomas Rast 已提交
586 587 588 589 590 591 592 593 594
keep=$(cat "$dotest/keep")
case "$keep" in
t)
	keep=-k ;;
b)
	keep=-b ;;
*)
	keep= ;;
esac
595 596 597 598 599 600
case "$(cat "$dotest/scissors")" in
t)
	scissors=--scissors ;;
f)
	scissors=--no-scissors ;;
esac
601 602 603 604 605 606
if test "$(cat "$dotest/no_inbody_headers")" = t
then
	no_inbody_headers=--no-inbody-headers
else
	no_inbody_headers=
fi
S
Stephen Boyd 已提交
607 608 609 610
if test "$(cat "$dotest/quiet")" = t
then
	GIT_QUIET=t
fi
611 612 613 614
if test "$(cat "$dotest/threeway")" = t
then
	threeway=t
fi
615
git_apply_opt=$(cat "$dotest/apply-opt")
616 617
if test "$(cat "$dotest/sign")" = t
then
618
	SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
619 620 621 622 623 624 625 626 627 628 629 630
			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 已提交
631
	resume=
632 633 634 635 636 637 638
fi

while test "$this" -le "$last"
do
	msgnum=`printf "%0${prec}d" $this`
	next=`expr "$this" + 1`
	test -f "$dotest/$msgnum" || {
J
Jan Harkes 已提交
639
		resume=
640 641 642
		go_next
		continue
	}
J
Junio C Hamano 已提交
643 644 645 646 647 648 649 650 651

	# 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.
652 653
	case "$resume" in
	'')
654
		git mailinfo $keep $no_inbody_headers $scissors $utf8 "$dotest/msg" "$dotest/patch" \
655 656
			<"$dotest/$msgnum" >"$dotest/info" ||
			stop_here $this
657 658

		# skip pine's internal folder data
659
		sane_grep '^Author: Mail System Internal Data$' \
660 661 662
			<"$dotest"/info >/dev/null &&
			go_next && continue

663
		test -s "$dotest/patch" || {
664
			eval_gettextln "Patch is empty.  Was it split wrong?
665
If you would prefer to skip this patch, instead run \"\$cmdline --skip\".
666
To restore the original branch and stop patching run \"\$cmdline --abort\"."
667 668
			stop_here $this
		}
669
		rm -f "$dotest/original-commit" "$dotest/author-script"
670 671 672 673 674 675 676
		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 已提交
677
			echo "$commit" > "$dotest/original-commit"
678
			get_author_ident_from_commit "$commit" > "$dotest/author-script"
679
		else
J
Junio C Hamano 已提交
680 681 682 683 684 685
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
686
		fi
687 688
		;;
	esac
689

690 691 692 693 694 695 696 697
	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
698

699
	if test -z "$GIT_AUTHOR_EMAIL"
700
	then
701
		gettextln "Patch does not have a valid e-mail address."
702 703 704
		stop_here $this
	fi

J
Junio C Hamano 已提交
705
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
706

707 708 709 710
	case "$resume" in
	'')
	    if test '' != "$SIGNOFF"
	    then
711
		LAST_SIGNED_OFF_BY=`
712 713
		    sed -ne '/^Signed-off-by: /p' \
		    "$dotest/msg-clean" |
714
		    sed -ne '$p'
715
		`
716 717
		ADD_SIGNOFF=`
		    test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
718 719
		    test '' = "$LAST_SIGNED_OFF_BY" && echo
		    echo "$SIGNOFF"
720 721
		}`
	    else
722
		ADD_SIGNOFF=
723 724
	    fi
	    {
725 726 727 728 729 730 731 732
		if test -s "$dotest/msg-clean"
		then
			cat "$dotest/msg-clean"
		fi
		if test '' != "$ADD_SIGNOFF"
		then
			echo "$ADD_SIGNOFF"
		fi
733 734
	    } >"$dotest/final-commit"
	    ;;
J
Junio C Hamano 已提交
735
	*)
736
		case "$resolved$interactive" in
J
Junio C Hamano 已提交
737 738
		tt)
			# This is used only for interactive view option.
739
			git diff-index -p --cached HEAD -- >"$dotest/patch"
J
Junio C Hamano 已提交
740 741
			;;
		esac
742
	esac
743

744
	resume=
745 746
	if test "$interactive" = t
	then
747
	    test -t 0 ||
748
	    die "$(gettext "cannot be interactive without stdin connected to a terminal.")"
749 750 751
	    action=again
	    while test "$action" = again
	    do
752
		gettextln "Commit Body is:"
753 754 755
		echo "--------------------------"
		cat "$dotest/final-commit"
		echo "--------------------------"
756 757 758 759
		# 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 "
760 761
		read reply
		case "$reply" in
762 763 764
		[yY]*) action=yes ;;
		[aA]*) action=yes interactive= ;;
		[nN]*) action=skip ;;
765
		[eE]*) git_editor "$dotest/final-commit"
766
		       action=again ;;
767
		[vV]*) action=again
J
Jonathan Nieder 已提交
768
		       git_pager "$dotest/patch" ;;
769
		*)     action=again ;;
770 771 772 773 774
		esac
	    done
	else
	    action=yes
	fi
775 776 777 778 779 780 781

	if test -f "$dotest/final-commit"
	then
		FIRSTLINE=$(sed 1q "$dotest/final-commit")
	else
		FIRSTLINE=""
	fi
782 783 784 785 786 787 788 789 790 791 792 793 794

	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

795
	say "$(eval_gettext "Applying: \$FIRSTLINE")"
796

J
Junio C Hamano 已提交
797 798
	case "$resolved" in
	'')
799 800 801 802 803 804 805 806
		# 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 已提交
807 808 809 810 811 812 813 814
		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=
815
		git diff-index --quiet --cached HEAD -- && {
816
			gettextln "No changes - did you forget to use 'git add'?
817
If there is nothing left to stage, chances are that something else
818
already introduced the same changes; you might want to skip this patch."
819
			stop_here_user_resolve $this
820
		}
821
		unmerged=$(git ls-files -u)
822 823
		if test -n "$unmerged"
		then
824 825
			gettextln "You still have unmerged paths in your index
did you forget to use 'git add'?"
826
			stop_here_user_resolve $this
827
		fi
J
Junio C Hamano 已提交
828
		apply_status=0
829
		git rerere
J
Junio C Hamano 已提交
830 831 832
		;;
	esac

833
	if test $apply_status != 0 && test "$threeway" = t
834
	then
835
		if (fall_back_3way)
836
		then
837 838
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
839
		    git diff-index --quiet --cached HEAD -- && {
840
			say "$(gettext "No changes -- Patch already applied.")"
841 842 843
			go_next
			continue
		    }
844 845
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
846 847 848 849
		fi
	fi
	if test $apply_status != 0
	then
850
		eval_gettextln 'Patch failed at $msgnum $FIRSTLINE'
851
		stop_here_user_resolve $this
852 853 854 855 856 857 858
	fi

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

859
	tree=$(git write-tree) &&
860
	commit=$(
861 862 863 864
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
865
		parent=$(git rev-parse --verify -q HEAD) ||
866
		say >&2 "$(gettext "applying to an empty history")"
867

868 869 870 871 872
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
873
		git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
874
	) &&
875
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
876 877
	stop_here $this

T
Thomas Rast 已提交
878 879 880 881
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

882 883 884 885 886 887 888 889
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

890 891 892
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 已提交
893
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
894
    fi
T
Thomas Rast 已提交
895 896
fi

897
rm -fr "$dotest"
898
git gc --auto