git-am.sh 22.7 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
N
Nicolas Vigier 已提交
41
S,gpg-sign?     GPG-sign commits
J
Jay Soffian 已提交
42
rebasing*       (internal use for git-rebase)"
43

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

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

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

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

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

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

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

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

    stop_here $1
}

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

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

127
fall_back_3way () {
128
    O_OBJECT=$(cd "$GIT_OBJECT_DIRECTORY" && pwd)
129 130 131 132 133

    rm -fr "$dotest"/patch-merge-*
    mkdir "$dotest/patch-merge-tmp-dir"

    # First see if the patch records the index info that we can use.
134 135 136
    cmd="git apply $git_apply_opt --build-fake-ancestor" &&
    cmd="$cmd "'"$dotest/patch-merge-tmp-index" "$dotest/patch"' &&
    eval "$cmd" &&
137
    GIT_INDEX_FILE="$dotest/patch-merge-tmp-index" \
138
    git write-tree >"$dotest/patch-merge-base+" ||
139
    cannot_fallback "$(gettext "Repository lacks necessary blobs to fall back on 3-way merge.")"
140

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

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

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

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

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

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

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

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

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

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

	# 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

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

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

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

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

386
while test $# != 0
387 388
do
	case "$1" in
389 390 391
	-i|--interactive)
		interactive=t ;;
	-b|--binary)
392 393
		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."
394
		;;
395 396
	-3|--3way)
		threeway=t ;;
397
	-s|--signoff)
398 399 400 401 402 403 404
		sign=t ;;
	-u|--utf8)
		utf8=t ;; # this is now default
	--no-utf8)
		utf8= ;;
	-k|--keep)
		keep=t ;;
T
Thomas Rast 已提交
405 406
	--keep-non-patch)
		keep=b ;;
407 408 409 410
	-c|--scissors)
		scissors=t ;;
	--no-scissors)
		scissors=f ;;
J
Jeff King 已提交
411
	-r|--resolved|--continue)
412 413 414
		resolved=t ;;
	--skip)
		skip=t ;;
N
Nanako Shiraishi 已提交
415 416
	--abort)
		abort=t ;;
J
Junio C Hamano 已提交
417
	--rebasing)
418
		rebasing=t threeway=t ;;
419 420 421 422 423 424 425 426
	--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=}" ;;
427
	--reject|--ignore-whitespace|--ignore-space-change)
428
		git_apply_opt="$git_apply_opt $1" ;;
429 430
	--committer-date-is-author-date)
		committer_date_is_author_date=t ;;
431 432
	--ignore-date)
		ignore_date=t ;;
433 434
	--rerere-autoupdate|--no-rerere-autoupdate)
		allow_rerere_autoupdate="$1" ;;
S
Stephen Boyd 已提交
435 436
	-q|--quiet)
		GIT_QUIET=t ;;
437 438
	--keep-cr)
		keepcr=t ;;
439 440
	--no-keep-cr)
		keepcr=f ;;
N
Nicolas Vigier 已提交
441 442 443 444
	--gpg-sign)
		gpg_sign_opt=-S ;;
	--gpg-sign=*)
		gpg_sign_opt="-S${1#--gpg-sign=}" ;;
445
	--)
446
		shift; break ;;
447
	*)
448
		usage ;;
449
	esac
450
	shift
451 452
done

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

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

489
	case "$skip,$abort" in
490
	t,t)
491
		die "$(gettext "Please make up your mind. --skip or --abort?")"
492
		;;
493 494 495 496 497 498 499 500
	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)
501 502 503 504
		if test -f "$dotest/rebasing"
		then
			exec git rebase --abort
		fi
N
Nanako Shiraishi 已提交
505
		git rerere clear
506 507
		if safe_to_abort
		then
508 509
			git read-tree --reset -u HEAD ORIG_HEAD
			git reset ORIG_HEAD
510
		fi
N
Nanako Shiraishi 已提交
511 512 513
		rm -fr "$dotest"
		exit ;;
	esac
514
	rm -f "$dotest/dirtyindex"
515
else
516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
	# 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

J
Justin Lebar 已提交
533
	# Make sure we are not given --skip, --continue, or --abort
N
Nanako Shiraishi 已提交
534
	test "$skip$resolved$abort" = "" ||
535
		die "$(gettext "Resolve operation not in progress, we are not resuming.")"
536 537 538 539

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

540 541 542 543 544 545 546 547 548
	if test -n "$prefix" && test $# != 0
	then
		first=t
		for arg
		do
			test -n "$first" && {
				set x
				first=
			}
549 550 551 552 553 554
			if is_absolute_path "$arg"
			then
				set "$@" "$arg"
			else
				set "$@" "$prefix$arg"
			fi
555 556 557
		done
		shift
	fi
558 559 560 561

	check_patch_format "$@"

	split_patches "$@"
562

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

588 589
git update-index -q --refresh

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

T
Thomas Rast 已提交
605 606 607 608
# 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.

609 610 611
if test "$(cat "$dotest/utf8")" = t
then
	utf8=-u
612 613
else
	utf8=-n
614
fi
T
Thomas Rast 已提交
615 616 617 618 619 620 621 622 623
keep=$(cat "$dotest/keep")
case "$keep" in
t)
	keep=-k ;;
b)
	keep=-b ;;
*)
	keep= ;;
esac
624 625 626 627 628 629
case "$(cat "$dotest/scissors")" in
t)
	scissors=--scissors ;;
f)
	scissors=--no-scissors ;;
esac
630 631 632 633 634 635
if test "$(cat "$dotest/no_inbody_headers")" = t
then
	no_inbody_headers=--no-inbody-headers
else
	no_inbody_headers=
fi
S
Stephen Boyd 已提交
636 637 638 639
if test "$(cat "$dotest/quiet")" = t
then
	GIT_QUIET=t
fi
640 641 642 643
if test "$(cat "$dotest/threeway")" = t
then
	threeway=t
fi
644
git_apply_opt=$(cat "$dotest/apply-opt")
645 646
if test "$(cat "$dotest/sign")" = t
then
647
	SIGNOFF=$(git var GIT_COMMITTER_IDENT | sed -e '
648 649
			s/>.*/>/
			s/^/Signed-off-by: /'
650
		)
651 652 653 654
else
	SIGNOFF=
fi

655 656
last=$(cat "$dotest/last")
this=$(cat "$dotest/next")
657 658
if test "$skip" = t
then
659
	this=$(expr "$this" + 1)
J
Jan Harkes 已提交
660
	resume=
661 662 663 664
fi

while test "$this" -le "$last"
do
665 666
	msgnum=$(printf "%0${prec}d" $this)
	next=$(expr "$this" + 1)
667
	test -f "$dotest/$msgnum" || {
J
Jan Harkes 已提交
668
		resume=
669 670 671
		go_next
		continue
	}
J
Junio C Hamano 已提交
672 673 674 675 676 677 678 679

	# 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
680
	# by the user, or the user can tell us to do so by --continue flag.
681 682
	case "$resume" in
	'')
683 684
		if test -f "$dotest/rebasing"
		then
685 686
			commit=$(sed -e 's/^From \([0-9a-f]*\) .*/\1/' \
				-e q "$dotest/$msgnum") &&
687 688
			test "$(git cat-file -t "$commit")" = commit ||
				stop_here $this
689 690
			git cat-file commit "$commit" |
			sed -e '1,/^$/d' >"$dotest/msg-clean"
691 692
			echo "$commit" >"$dotest/original-commit"
			get_author_ident_from_commit "$commit" >"$dotest/author-script"
693
			git diff-tree --root --binary --full-index "$commit" >"$dotest/patch"
694
		else
695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
			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 已提交
711 712 713 714 715 716
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
717
		fi
718 719
		;;
	esac
720

721 722 723 724 725 726 727 728
	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
729

730
	if test -z "$GIT_AUTHOR_EMAIL"
731
	then
732
		gettextln "Patch does not have a valid e-mail address."
733 734 735
		stop_here $this
	fi

J
Junio C Hamano 已提交
736
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
737

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

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

807 808 809 810 811 812 813 814 815 816 817 818
	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

819 820 821 822 823 824 825
	if test -f "$dotest/final-commit"
	then
		FIRSTLINE=$(sed 1q "$dotest/final-commit")
	else
		FIRSTLINE=""
	fi

826
	say "$(eval_gettext "Applying: \$FIRSTLINE")"
827

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

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

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

895
	tree=$(git write-tree) &&
896
	commit=$(
897 898 899 900
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
901
		parent=$(git rev-parse --verify -q HEAD) ||
902
		say >&2 "$(gettext "applying to an empty history")"
903

904 905 906 907 908
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
N
Nicolas Vigier 已提交
909 910
		git commit-tree ${parent:+-p} $parent ${gpg_sign_opt:+"$gpg_sign_opt"} $tree  \
			<"$dotest/final-commit"
911
	) &&
912
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
913 914
	stop_here $this

T
Thomas Rast 已提交
915 916 917 918
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

919 920 921 922 923 924 925 926
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

927 928 929
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 已提交
930
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
931
    fi
T
Thomas Rast 已提交
932 933
fi

934 935 936 937 938 939 940
# 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