git-am.sh 22.5 KB
Newer Older
1 2
#!/bin/sh
#
3
# Copyright (c) 2005, 2006 Junio C Hamano
4

5
SUBDIRECTORY_OK=Yes
6
OPTIONS_KEEPDASHDASH=
7
OPTIONS_STUCKLONG=t
8
OPTIONS_SPEC="\
9
git am [options] [(<mbox>|<Maildir>)...]
10
git am [options] (--continue | --skip | --abort)
11
--
12
i,interactive   run interactively
J
Jay Soffian 已提交
13
b,binary*       (historical option -- no-op)
14
3,3way          allow fall back on 3way merging if needed
S
Stephen Boyd 已提交
15
q,quiet         be quiet
16 17
s,signoff       add a Signed-off-by line to the commit message
u,utf8          recode into utf8 (default)
18
k,keep          pass -k flag to git-mailinfo
T
Thomas Rast 已提交
19
keep-non-patch  pass -b flag to git-mailinfo
20
keep-cr         pass --keep-cr flag to git-mailsplit for mbox format
21
no-keep-cr      do not pass --keep-cr flag to git-mailsplit independent of am.keepcr
22
c,scissors      strip everything before a scissors line
23
whitespace=     pass it through git-apply
24 25
ignore-space-change pass it through git-apply
ignore-whitespace pass it through git-apply
26
directory=      pass it through git-apply
27
exclude=        pass it through git-apply
J
Johannes Berg 已提交
28
include=        pass it through git-apply
29 30
C=              pass it through git-apply
p=              pass it through git-apply
31
patch-format=   format the patch(es) are in
32
reject          pass it through git-apply
33
resolvemsg=     override error message when patch failure occurs
J
Jeff King 已提交
34 35
continue        continue applying patches after resolving a conflict
r,resolved      synonyms for --continue
J
Junio C Hamano 已提交
36
skip            skip the current patch
N
Nanako Shiraishi 已提交
37
abort           restore the original branch and abort the patching operation.
38
committer-date-is-author-date    lie about committer date
39
ignore-date     use current timestamp for author date
40
rerere-autoupdate update the index with reused conflict resolution if possible
J
Jay Soffian 已提交
41
rebasing*       (internal use for git-rebase)"
42

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

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

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

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

70
sq () {
71
	git rev-parse --sq-quote "$@"
72 73
}

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

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
96
	gettextln "You seem to have moved HEAD since the last 'am' failure.
97
Not rewinding to ORIG_HEAD" >&2
98 99 100
	return 1
}

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

    stop_here $1
}

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

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

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

140
    say "$(gettext "Using index info to reconstruct a base tree...")"
141 142

    cmd='GIT_INDEX_FILE="$dotest/patch-merge-tmp-index"'
143 144 145 146 147 148

    if test -z "$GIT_QUIET"
    then
	eval "$cmd git diff-index --cached --diff-filter=AM --name-status HEAD"
    fi

149 150
    cmd="$cmd git apply --cached $git_apply_opt"' <"$dotest/patch"'
    if eval "$cmd"
151 152 153
    then
	mv "$dotest/patch-merge-base+" "$dotest/patch-merge-base"
	mv "$dotest/patch-merge-tmp-index" "$dotest/patch-merge-index"
154
    else
155 156
	cannot_fallback "$(gettext "Did you hand edit your patch?
It does not apply to blobs recorded in its index.")"
157 158 159
    fi

    test -f "$dotest/patch-merge-index" &&
160
    his_tree=$(GIT_INDEX_FILE="$dotest/patch-merge-index" git write-tree) &&
161 162 163
    orig_tree=$(cat "$dotest/patch-merge-base") &&
    rm -fr "$dotest"/patch-merge-* || exit 1

164
    say "$(gettext "Falling back to patching base and 3-way merge...")"
165 166 167 168

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

172
    eval GITHEAD_$his_tree='"$FIRSTLINE"'
173
    export GITHEAD_$his_tree
S
Stephen Boyd 已提交
174 175
    if test -n "$GIT_QUIET"
    then
176
	    GIT_MERGE_VERBOSITY=0 && export GIT_MERGE_VERBOSITY
S
Stephen Boyd 已提交
177
    fi
178
    git-merge-recursive $orig_tree -- HEAD $his_tree || {
179
	    git rerere $allow_rerere_autoupdate
180
	    die "$(gettext "Failed to merge in the changes.")"
181
    }
182
    unset GITHEAD_$his_tree
183 184
}

185 186 187 188 189 190
clean_abort () {
	test $# = 0 || echo >&2 "$@"
	rm -fr "$dotest"
	exit 1
}

191 192 193 194 195 196 197 198
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
199 200 201 202 203 204 205 206 207

	# 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

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

split_patches () {
	case "$patch_format" in
	mbox)
263
		if test t = "$keepcr"
264 265 266 267 268
		then
		    keep_cr=--keep-cr
		else
		    keep_cr=
		fi
269
		git mailsplit -d"$prec" -o"$dotest" -b $keep_cr -- "$@" > "$dotest/last" ||
270
		clean_abort
271
		;;
272 273 274
	stgit-series)
		if test $# -ne 1
		then
275
			clean_abort "$(gettext "Only one StGIT patch series can be applied at once")"
276 277 278 279 280 281 282 283 284 285 286 287 288 289
		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
290
		} < "$series_file" || clean_abort
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
		# 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
J
Jeff King 已提交
306
			@@PERL@@ -ne 'BEGIN { $subject = 0 }
307 308
				if ($subject > 1) { print ; }
				elsif (/^\s+$/) { next ; }
G
Giuseppe Bilotta 已提交
309
				elsif (/^Author:/) { s/Author/From/ ; print ;}
310 311 312 313 314 315 316 317 318
				elsif (/^(From|Date)/) { print ; }
				elsif ($subject) {
					$subject = 2 ;
					print "\n" ;
					print ;
				} else {
					print "Subject: ", $_ ;
					$subject = 1;
				}
319
			' < "$stgit" > "$dotest/$msgnum" || clean_abort
320 321 322 323 324
		done
		echo "$this" > "$dotest/last"
		this=
		msgnum=
		;;
325 326 327 328 329 330 331 332 333 334 335 336 337
	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
J
Jeff King 已提交
338
			LANG=C LC_ALL=C @@PERL@@ -M'POSIX qw(strftime)' -ne 'BEGIN { $subject = 0 }
339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
				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=
		;;
359
	*)
360 361
		if test -n "$patch_format"
		then
362
			clean_abort "$(eval_gettext "Patch format \$patch_format is not supported.")"
363
		else
364
			clean_abort "$(gettext "Patch format detection failed.")"
365
		fi
366 367 368 369
		;;
	esac
}

370
prec=4
371
dotest="$GIT_DIR/rebase-apply"
372
sign= utf8=t keep= keepcr= skip= interactive= resolved= rebasing= abort=
373
resolvemsg= resume= scissors= no_inbody_headers=
M
Michael S. Tsirkin 已提交
374
git_apply_opt=
375
committer_date_is_author_date=
376
ignore_date=
377
allow_rerere_autoupdate=
378

379 380 381 382 383
if test "$(git config --bool --get am.keepcr)" = true
then
    keepcr=t
fi

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

J
Junio C Hamano 已提交
447 448
# If the dotest directory exists, but we have finished applying all the
# patches in them, clear it out.
449
if test -d "$dotest" &&
450 451
   test -f "$dotest/last" &&
   test -f "$dotest/next" &&
452 453 454 455 456 457 458 459
   last=$(cat "$dotest/last") &&
   next=$(cat "$dotest/next") &&
   test $# != 0 &&
   test "$next" -gt "$last"
then
   rm -fr "$dotest"
fi

460
if test -d "$dotest" && test -f "$dotest/last" && test -f "$dotest/next"
461
then
N
Nanako Shiraishi 已提交
462
	case "$#,$skip$resolved$abort" in
J
Junio C Hamano 已提交
463 464 465 466 467 468 469
	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
470
		# when there is already $dotest.  This is somewhat
J
Junio C Hamano 已提交
471 472 473
		# 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 已提交
474
		test -t 0
J
Junio C Hamano 已提交
475 476 477 478 479
		;;
	*)
		false
		;;
	esac ||
480
	die "$(eval_gettext "previous rebase directory \$dotest still exists but mbox given.")"
481
	resume=yes
N
Nanako Shiraishi 已提交
482

483
	case "$skip,$abort" in
484
	t,t)
485
		die "$(gettext "Please make up your mind. --skip or --abort?")"
486
		;;
487 488 489 490 491 492 493 494
	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)
495 496 497 498
		if test -f "$dotest/rebasing"
		then
			exec git rebase --abort
		fi
N
Nanako Shiraishi 已提交
499
		git rerere clear
500 501
		if safe_to_abort
		then
502 503
			git read-tree --reset -u HEAD ORIG_HEAD
			git reset ORIG_HEAD
504
		fi
N
Nanako Shiraishi 已提交
505 506 507
		rm -fr "$dotest"
		exit ;;
	esac
508
	rm -f "$dotest/dirtyindex"
509
else
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526
	# Possible stray $dotest directory in the independent-run
	# case; in the --rebasing case, it is upto the caller
	# (git-rebase--am) to take care of stray directories.
	if test -d "$dotest" && test -z "$rebasing"
	then
		case "$skip,$resolved,$abort" in
		,,t)
			rm -fr "$dotest"
			exit 0
			;;
		*)
			die "$(eval_gettext "Stray \$dotest directory found.
Use \"git am --abort\" to remove it.")"
			;;
		esac
	fi

527
	# Make sure we are not given --skip, --continue, nor --abort
N
Nanako Shiraishi 已提交
528
	test "$skip$resolved$abort" = "" ||
529
		die "$(gettext "Resolve operation not in progress, we are not resuming.")"
530 531 532 533

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

534 535 536 537 538 539 540 541 542
	if test -n "$prefix" && test $# != 0
	then
		first=t
		for arg
		do
			test -n "$first" && {
				set x
				first=
			}
543 544 545 546 547 548
			if is_absolute_path "$arg"
			then
				set "$@" "$arg"
			else
				set "$@" "$prefix$arg"
			fi
549 550 551
		done
		shift
	fi
552 553 554 555

	check_patch_format "$@"

	split_patches "$@"
556

557 558
	# -i can and must be given when resuming; everything
	# else is kept
559
	echo " $git_apply_opt" >"$dotest/apply-opt"
560
	echo "$threeway" >"$dotest/threeway"
561 562 563
	echo "$sign" >"$dotest/sign"
	echo "$utf8" >"$dotest/utf8"
	echo "$keep" >"$dotest/keep"
564
	echo "$scissors" >"$dotest/scissors"
565
	echo "$no_inbody_headers" >"$dotest/no_inbody_headers"
S
Stephen Boyd 已提交
566
	echo "$GIT_QUIET" >"$dotest/quiet"
567
	echo 1 >"$dotest/next"
J
Junio C Hamano 已提交
568 569 570 571 572
	if test -n "$rebasing"
	then
		: >"$dotest/rebasing"
	else
		: >"$dotest/applying"
573 574 575 576 577 578
		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 已提交
579
	fi
580 581
fi

582 583
git update-index -q --refresh

J
Junio C Hamano 已提交
584 585
case "$resolved" in
'')
586 587 588 589 590 591
	case "$HAS_HEAD" in
	'')
		files=$(git ls-files) ;;
	?*)
		files=$(git diff-index --cached --name-only HEAD --) ;;
	esac || exit
592 593
	if test "$files"
	then
594
		test -n "$HAS_HEAD" && : >"$dotest/dirtyindex"
595
		die "$(eval_gettext "Dirty index: cannot apply patches (dirty: \$files)")"
596
	fi
J
Junio C Hamano 已提交
597 598
esac

T
Thomas Rast 已提交
599 600 601 602
# 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.

603 604 605
if test "$(cat "$dotest/utf8")" = t
then
	utf8=-u
606 607
else
	utf8=-n
608
fi
T
Thomas Rast 已提交
609 610 611 612 613 614 615 616 617
keep=$(cat "$dotest/keep")
case "$keep" in
t)
	keep=-k ;;
b)
	keep=-b ;;
*)
	keep= ;;
esac
618 619 620 621 622 623
case "$(cat "$dotest/scissors")" in
t)
	scissors=--scissors ;;
f)
	scissors=--no-scissors ;;
esac
624 625 626 627 628 629
if test "$(cat "$dotest/no_inbody_headers")" = t
then
	no_inbody_headers=--no-inbody-headers
else
	no_inbody_headers=
fi
S
Stephen Boyd 已提交
630 631 632 633
if test "$(cat "$dotest/quiet")" = t
then
	GIT_QUIET=t
fi
634 635 636 637
if test "$(cat "$dotest/threeway")" = t
then
	threeway=t
fi
638
git_apply_opt=$(cat "$dotest/apply-opt")
639 640
if test "$(cat "$dotest/sign")" = t
then
641
	SIGNOFF=`git var GIT_COMMITTER_IDENT | sed -e '
642 643 644 645 646 647 648 649 650 651 652 653
			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 已提交
654
	resume=
655 656 657 658 659 660 661
fi

while test "$this" -le "$last"
do
	msgnum=`printf "%0${prec}d" $this`
	next=`expr "$this" + 1`
	test -f "$dotest/$msgnum" || {
J
Jan Harkes 已提交
662
		resume=
663 664 665
		go_next
		continue
	}
J
Junio C Hamano 已提交
666 667 668 669 670 671 672 673

	# 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
674
	# by the user, or the user can tell us to do so by --continue flag.
675 676
	case "$resume" in
	'')
677 678
		if test -f "$dotest/rebasing"
		then
679 680
			commit=$(sed -e 's/^From \([0-9a-f]*\) .*/\1/' \
				-e q "$dotest/$msgnum") &&
681 682
			test "$(git cat-file -t "$commit")" = commit ||
				stop_here $this
683 684
			git cat-file commit "$commit" |
			sed -e '1,/^$/d' >"$dotest/msg-clean"
685 686
			echo "$commit" >"$dotest/original-commit"
			get_author_ident_from_commit "$commit" >"$dotest/author-script"
687
			git diff-tree --root --binary --full-index "$commit" >"$dotest/patch"
688
		else
689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
			git mailinfo $keep $no_inbody_headers $scissors $utf8 "$dotest/msg" "$dotest/patch" \
				<"$dotest/$msgnum" >"$dotest/info" ||
				stop_here $this

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

			test -s "$dotest/patch" || {
				eval_gettextln "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\"."
				stop_here $this
			}
			rm -f "$dotest/original-commit" "$dotest/author-script"
J
Junio C Hamano 已提交
705 706 707 708 709 710
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
711
		fi
712 713
		;;
	esac
714

715 716 717 718 719 720 721 722
	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
723

724
	if test -z "$GIT_AUTHOR_EMAIL"
725
	then
726
		gettextln "Patch does not have a valid e-mail address."
727 728 729
		stop_here $this
	fi

J
Junio C Hamano 已提交
730
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
731

732 733 734 735
	case "$resume" in
	'')
	    if test '' != "$SIGNOFF"
	    then
736
		LAST_SIGNED_OFF_BY=`
737 738
		    sed -ne '/^Signed-off-by: /p' \
		    "$dotest/msg-clean" |
739
		    sed -ne '$p'
740
		`
741 742
		ADD_SIGNOFF=`
		    test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
743 744
		    test '' = "$LAST_SIGNED_OFF_BY" && echo
		    echo "$SIGNOFF"
745 746
		}`
	    else
747
		ADD_SIGNOFF=
748 749
	    fi
	    {
750 751 752 753 754 755 756 757
		if test -s "$dotest/msg-clean"
		then
			cat "$dotest/msg-clean"
		fi
		if test '' != "$ADD_SIGNOFF"
		then
			echo "$ADD_SIGNOFF"
		fi
758 759
	    } >"$dotest/final-commit"
	    ;;
J
Junio C Hamano 已提交
760
	*)
761
		case "$resolved$interactive" in
J
Junio C Hamano 已提交
762 763
		tt)
			# This is used only for interactive view option.
764
			git diff-index -p --cached HEAD -- >"$dotest/patch"
J
Junio C Hamano 已提交
765 766
			;;
		esac
767
	esac
768

769
	resume=
770 771
	if test "$interactive" = t
	then
772
	    test -t 0 ||
773
	    die "$(gettext "cannot be interactive without stdin connected to a terminal.")"
774 775 776
	    action=again
	    while test "$action" = again
	    do
777
		gettextln "Commit Body is:"
778 779 780
		echo "--------------------------"
		cat "$dotest/final-commit"
		echo "--------------------------"
781 782 783 784
		# 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 "
785 786
		read reply
		case "$reply" in
787 788 789
		[yY]*) action=yes ;;
		[aA]*) action=yes interactive= ;;
		[nN]*) action=skip ;;
790
		[eE]*) git_editor "$dotest/final-commit"
791
		       action=again ;;
792
		[vV]*) action=again
J
Jonathan Nieder 已提交
793
		       git_pager "$dotest/patch" ;;
794
		*)     action=again ;;
795 796 797 798 799
		esac
	    done
	else
	    action=yes
	fi
800

801 802 803 804 805 806 807 808 809 810 811 812
	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

813 814 815 816 817 818 819
	if test -f "$dotest/final-commit"
	then
		FIRSTLINE=$(sed 1q "$dotest/final-commit")
	else
		FIRSTLINE=""
	fi

820
	say "$(eval_gettext "Applying: \$FIRSTLINE")"
821

J
Junio C Hamano 已提交
822 823
	case "$resolved" in
	'')
824 825 826 827 828 829 830 831
		# 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 已提交
832 833 834 835 836 837 838 839
		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=
840
		git diff-index --quiet --cached HEAD -- && {
841
			gettextln "No changes - did you forget to use 'git add'?
842
If there is nothing left to stage, chances are that something else
843
already introduced the same changes; you might want to skip this patch."
844
			stop_here_user_resolve $this
845
		}
846
		unmerged=$(git ls-files -u)
847 848
		if test -n "$unmerged"
		then
849 850
			gettextln "You still have unmerged paths in your index
did you forget to use 'git add'?"
851
			stop_here_user_resolve $this
852
		fi
J
Junio C Hamano 已提交
853
		apply_status=0
854
		git rerere
J
Junio C Hamano 已提交
855 856 857
		;;
	esac

858
	if test $apply_status != 0 && test "$threeway" = t
859
	then
860
		if (fall_back_3way)
861
		then
862 863
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
864
		    git diff-index --quiet --cached HEAD -- && {
865
			say "$(gettext "No changes -- Patch already applied.")"
866 867 868
			go_next
			continue
		    }
869 870
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
871 872 873 874
		fi
	fi
	if test $apply_status != 0
	then
875
		eval_gettextln 'Patch failed at $msgnum $FIRSTLINE'
876 877
		if test "$(git config --bool advice.amworkdir)" != false
		then
878 879
			eval_gettextln 'The copy of the patch that failed is found in:
   $dotest/patch'
880
		fi
881
		stop_here_user_resolve $this
882 883 884 885 886 887 888
	fi

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

889
	tree=$(git write-tree) &&
890
	commit=$(
891 892 893 894
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
895
		parent=$(git rev-parse --verify -q HEAD) ||
896
		say >&2 "$(gettext "applying to an empty history")"
897

898 899 900 901 902
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
903
		git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
904
	) &&
905
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
906 907
	stop_here $this

T
Thomas Rast 已提交
908 909 910 911
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

912 913 914 915 916 917 918 919
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

920 921 922
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 已提交
923
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
924
    fi
T
Thomas Rast 已提交
925 926
fi

927 928 929 930 931 932 933
# If am was called with --rebasing (from git-rebase--am), it's up to
# the caller to take care of housekeeping.
if ! test -f "$dotest/rebasing"
then
	rm -fr "$dotest"
	git gc --auto
fi