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

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

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

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

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

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

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

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

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

    stop_here $1
}

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

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

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

S
Stephen Boyd 已提交
137
    say Using index info to reconstruct a base tree...
138 139 140 141

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

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

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

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

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

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

183 184 185 186 187 188 189 190
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
191 192 193 194 195 196 197 198 199

	# 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

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

split_patches () {
	case "$patch_format" in
	mbox)
255
		if test -n "$rebasing" || test t = "$keepcr"
256 257 258 259 260
		then
		    keep_cr=--keep-cr
		else
		    keep_cr=
		fi
261
		git mailsplit -d"$prec" -o"$dotest" -b $keep_cr -- "$@" > "$dotest/last" ||
262
		clean_abort
263
		;;
264 265 266
	stgit-series)
		if test $# -ne 1
		then
267
			clean_abort "$(gettext "Only one StGIT patch series can be applied at once")"
268 269 270 271 272 273 274 275 276 277 278 279 280 281
		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
282
		} < "$series_file" || clean_abort
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 ; }
G
Giuseppe Bilotta 已提交
301
				elsif (/^Author:/) { s/Author/From/ ; print ;}
302 303 304 305 306 307 308 309 310
				elsif (/^(From|Date)/) { print ; }
				elsif ($subject) {
					$subject = 2 ;
					print "\n" ;
					print ;
				} else {
					print "Subject: ", $_ ;
					$subject = 1;
				}
311
			' < "$stgit" > "$dotest/$msgnum" || clean_abort
312 313 314 315 316
		done
		echo "$this" > "$dotest/last"
		this=
		msgnum=
		;;
317 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
	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=
		;;
351
	*)
352 353
		if test -n "$patch_format"
		then
354
			clean_abort "$(eval_gettext "Patch format \$patch_format is not supported.")"
355
		else
356
			clean_abort "$(gettext "Patch format detection failed.")"
357
		fi
358 359 360 361
		;;
	esac
}

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

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

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

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

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

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

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

	check_patch_format "$@"

	split_patches "$@"
528

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

554 555
git update-index -q --refresh

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

571 572 573
if test "$(cat "$dotest/utf8")" = t
then
	utf8=-u
574 575
else
	utf8=-n
576 577 578 579 580
fi
if test "$(cat "$dotest/keep")" = t
then
	keep=-k
fi
581 582 583 584 585 586
case "$(cat "$dotest/scissors")" in
t)
	scissors=--scissors ;;
f)
	scissors=--no-scissors ;;
esac
587 588 589 590 591 592
if test "$(cat "$dotest/no_inbody_headers")" = t
then
	no_inbody_headers=--no-inbody-headers
else
	no_inbody_headers=
fi
S
Stephen Boyd 已提交
593 594 595 596
if test "$(cat "$dotest/quiet")" = t
then
	GIT_QUIET=t
fi
597 598 599 600
if test "$(cat "$dotest/threeway")" = t
then
	threeway=t
fi
601
git_apply_opt=$(cat "$dotest/apply-opt")
602 603
if test "$(cat "$dotest/sign")" = t
then
604
	SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
605 606 607 608 609 610 611 612 613 614 615 616
			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 已提交
617
	resume=
618 619 620 621 622 623 624
fi

while test "$this" -le "$last"
do
	msgnum=`printf "%0${prec}d" $this`
	next=`expr "$this" + 1`
	test -f "$dotest/$msgnum" || {
J
Jan Harkes 已提交
625
		resume=
626 627 628
		go_next
		continue
	}
J
Junio C Hamano 已提交
629 630 631 632 633 634 635 636 637

	# 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.
638 639
	case "$resume" in
	'')
640
		git mailinfo $keep $no_inbody_headers $scissors $utf8 "$dotest/msg" "$dotest/patch" \
641 642
			<"$dotest/$msgnum" >"$dotest/info" ||
			stop_here $this
643 644

		# skip pine's internal folder data
645
		sane_grep '^Author: Mail System Internal Data$' \
646 647 648
			<"$dotest"/info >/dev/null &&
			go_next && continue

649
		test -s "$dotest/patch" || {
650
			eval_gettextln "Patch is empty.  Was it split wrong?
651
If you would prefer to skip this patch, instead run \"\$cmdline --skip\".
652
To restore the original branch and stop patching run \"\$cmdline --abort\"."
653 654
			stop_here $this
		}
655
		rm -f "$dotest/original-commit" "$dotest/author-script"
656 657 658 659 660 661 662
		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 已提交
663
			echo "$commit" > "$dotest/original-commit"
664
			get_author_ident_from_commit "$commit" > "$dotest/author-script"
665
		else
J
Junio C Hamano 已提交
666 667 668 669 670 671
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
672
		fi
673 674
		;;
	esac
675

676 677 678 679 680 681 682 683
	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
684

685
	if test -z "$GIT_AUTHOR_EMAIL"
686
	then
687
		gettextln "Patch does not have a valid e-mail address."
688 689 690
		stop_here $this
	fi

J
Junio C Hamano 已提交
691
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
692

693 694 695 696
	case "$resume" in
	'')
	    if test '' != "$SIGNOFF"
	    then
697
		LAST_SIGNED_OFF_BY=`
698 699
		    sed -ne '/^Signed-off-by: /p' \
		    "$dotest/msg-clean" |
700
		    sed -ne '$p'
701
		`
702 703
		ADD_SIGNOFF=`
		    test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
704 705
		    test '' = "$LAST_SIGNED_OFF_BY" && echo
		    echo "$SIGNOFF"
706 707
		}`
	    else
708
		ADD_SIGNOFF=
709 710
	    fi
	    {
711 712 713 714 715 716 717 718
		if test -s "$dotest/msg-clean"
		then
			cat "$dotest/msg-clean"
		fi
		if test '' != "$ADD_SIGNOFF"
		then
			echo "$ADD_SIGNOFF"
		fi
719 720
	    } >"$dotest/final-commit"
	    ;;
J
Junio C Hamano 已提交
721
	*)
722
		case "$resolved$interactive" in
J
Junio C Hamano 已提交
723 724
		tt)
			# This is used only for interactive view option.
725
			git diff-index -p --cached HEAD -- >"$dotest/patch"
J
Junio C Hamano 已提交
726 727
			;;
		esac
728
	esac
729

730
	resume=
731 732
	if test "$interactive" = t
	then
733
	    test -t 0 ||
734
	    die "$(gettext "cannot be interactive without stdin connected to a terminal.")"
735 736 737
	    action=again
	    while test "$action" = again
	    do
738
		gettextln "Commit Body is:"
739 740 741
		echo "--------------------------"
		cat "$dotest/final-commit"
		echo "--------------------------"
742 743 744 745
		# 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 "
746 747
		read reply
		case "$reply" in
748 749 750
		[yY]*) action=yes ;;
		[aA]*) action=yes interactive= ;;
		[nN]*) action=skip ;;
751
		[eE]*) git_editor "$dotest/final-commit"
752
		       action=again ;;
753
		[vV]*) action=again
J
Jonathan Nieder 已提交
754
		       git_pager "$dotest/patch" ;;
755
		*)     action=again ;;
756 757 758 759 760
		esac
	    done
	else
	    action=yes
	fi
761 762 763 764 765 766 767

	if test -f "$dotest/final-commit"
	then
		FIRSTLINE=$(sed 1q "$dotest/final-commit")
	else
		FIRSTLINE=""
	fi
768 769 770 771 772 773 774 775 776 777 778 779 780

	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

781
	say "$(eval_gettext "Applying: \$FIRSTLINE")"
782

J
Junio C Hamano 已提交
783 784
	case "$resolved" in
	'')
785 786 787 788 789 790 791 792
		# 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 已提交
793 794 795 796 797 798 799 800
		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=
801
		git diff-index --quiet --cached HEAD -- && {
802
			gettextln "No changes - did you forget to use 'git add'?
803
If there is nothing left to stage, chances are that something else
804
already introduced the same changes; you might want to skip this patch."
805
			stop_here_user_resolve $this
806
		}
807
		unmerged=$(git ls-files -u)
808 809
		if test -n "$unmerged"
		then
810 811
			gettextln "You still have unmerged paths in your index
did you forget to use 'git add'?"
812
			stop_here_user_resolve $this
813
		fi
J
Junio C Hamano 已提交
814
		apply_status=0
815
		git rerere
J
Junio C Hamano 已提交
816 817 818
		;;
	esac

819
	if test $apply_status != 0 && test "$threeway" = t
820
	then
821
		if (fall_back_3way)
822
		then
823 824
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
825
		    git diff-index --quiet --cached HEAD -- && {
826
			say "$(gettext "No changes -- Patch already applied.")"
827 828 829
			go_next
			continue
		    }
830 831
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
832 833 834 835
		fi
	fi
	if test $apply_status != 0
	then
836
		eval_gettextln 'Patch failed at $msgnum $FIRSTLINE'
837 838 839 840 841
		if test "$(git config --bool advice.amworkdir)" != false
		then
			eval_gettextln "The copy of the patch that failed is found in:
   $dotest/patch"
		fi
842
		stop_here_user_resolve $this
843 844 845 846 847 848 849
	fi

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

850
	tree=$(git write-tree) &&
851
	commit=$(
852 853 854 855
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
856
		parent=$(git rev-parse --verify -q HEAD) ||
857
		say >&2 "$(gettext "applying to an empty history")"
858

859 860 861 862 863
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
864
		git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
865
	) &&
866
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
867 868
	stop_here $this

T
Thomas Rast 已提交
869 870 871 872
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

873 874 875 876 877 878 879 880
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

881 882 883
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 已提交
884
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
885
    fi
T
Thomas Rast 已提交
886 887
fi

888
rm -fr "$dotest"
889
git gc --auto