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

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

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

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

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

72 73
empty_tree=4b825dc642cb6eb9a060e54bf8d69288fbee4904

74
sq () {
75
	git rev-parse --sq-quote "$@"
76 77
}

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

84 85 86 87 88 89
safe_to_abort () {
	if test -f "$dotest/dirtyindex"
	then
		return 1
	fi

90
	if ! test -f "$dotest/abort-safety"
91 92 93 94 95 96 97 98 99
	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
100
	gettextln "You seem to have moved HEAD since the last 'am' failure.
101
Not rewinding to ORIG_HEAD" >&2
102 103 104
	return 1
}

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

    stop_here $1
}

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

124 125
cannot_fallback () {
	echo "$1"
126
	gettextln "Cannot fall back to three-way merge."
127 128 129
	exit 1
}

130
fall_back_3way () {
131
    O_OBJECT=$(cd "$GIT_OBJECT_DIRECTORY" && pwd)
132 133 134 135 136

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

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

144
    say "$(gettext "Using index info to reconstruct a base tree...")"
145 146

    cmd='GIT_INDEX_FILE="$dotest/patch-merge-tmp-index"'
147 148 149 150 151 152

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

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

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

168
    say "$(gettext "Falling back to patching base and 3-way merge...")"
169 170 171 172

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

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

190 191 192 193 194 195
clean_abort () {
	test $# = 0 || echo >&2 "$@"
	rm -fr "$dotest"
	exit 1
}

196 197 198 199 200 201 202 203
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
204 205 206 207 208 209 210 211 212

	# 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

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

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

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

386 387 388 389 390
if test "$(git config --bool --get am.messageid)" = true
then
    messageid=t
fi

391 392 393 394 395
if test "$(git config --bool --get am.keepcr)" = true
then
    keepcr=t
fi

396 397 398 399 400
if test "$(git config --bool --get am.threeWay)" = true
then
    threeway=t
fi

401
while test $# != 0
402 403
do
	case "$1" in
404 405 406
	-i|--interactive)
		interactive=t ;;
	-b|--binary)
407 408
		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."
409
		;;
410 411
	-3|--3way)
		threeway=t ;;
412 413
	--no-3way)
		threeway=f ;;
414
	-s|--signoff)
415 416 417 418 419
		sign=t ;;
	-u|--utf8)
		utf8=t ;; # this is now default
	--no-utf8)
		utf8= ;;
420 421 422 423
	-m|--message-id)
		messageid=t ;;
	--no-message-id)
		messageid=f ;;
424 425
	-k|--keep)
		keep=t ;;
T
Thomas Rast 已提交
426 427
	--keep-non-patch)
		keep=b ;;
428 429 430 431
	-c|--scissors)
		scissors=t ;;
	--no-scissors)
		scissors=f ;;
J
Jeff King 已提交
432
	-r|--resolved|--continue)
433 434 435
		resolved=t ;;
	--skip)
		skip=t ;;
N
Nanako Shiraishi 已提交
436 437
	--abort)
		abort=t ;;
J
Junio C Hamano 已提交
438
	--rebasing)
439
		rebasing=t threeway=t ;;
440 441 442 443 444 445 446 447
	--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=}" ;;
448
	--reject|--ignore-whitespace|--ignore-space-change)
449
		git_apply_opt="$git_apply_opt $1" ;;
450 451
	--committer-date-is-author-date)
		committer_date_is_author_date=t ;;
452 453
	--ignore-date)
		ignore_date=t ;;
454 455
	--rerere-autoupdate|--no-rerere-autoupdate)
		allow_rerere_autoupdate="$1" ;;
S
Stephen Boyd 已提交
456 457
	-q|--quiet)
		GIT_QUIET=t ;;
458 459
	--keep-cr)
		keepcr=t ;;
460 461
	--no-keep-cr)
		keepcr=f ;;
N
Nicolas Vigier 已提交
462 463 464 465
	--gpg-sign)
		gpg_sign_opt=-S ;;
	--gpg-sign=*)
		gpg_sign_opt="-S${1#--gpg-sign=}" ;;
466
	--)
467
		shift; break ;;
468
	*)
469
		usage ;;
470
	esac
471
	shift
472 473
done

J
Junio C Hamano 已提交
474 475
# If the dotest directory exists, but we have finished applying all the
# patches in them, clear it out.
476
if test -d "$dotest" &&
477 478
   test -f "$dotest/last" &&
   test -f "$dotest/next" &&
479 480 481 482 483 484 485 486
   last=$(cat "$dotest/last") &&
   next=$(cat "$dotest/next") &&
   test $# != 0 &&
   test "$next" -gt "$last"
then
   rm -fr "$dotest"
fi

487
if test -d "$dotest" && test -f "$dotest/last" && test -f "$dotest/next"
488
then
N
Nanako Shiraishi 已提交
489
	case "$#,$skip$resolved$abort" in
J
Junio C Hamano 已提交
490 491 492 493 494 495 496
	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
497
		# when there is already $dotest.  This is somewhat
J
Junio C Hamano 已提交
498 499 500
		# 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 已提交
501
		test -t 0
J
Junio C Hamano 已提交
502 503 504 505 506
		;;
	*)
		false
		;;
	esac ||
507
	die "$(eval_gettext "previous rebase directory \$dotest still exists but mbox given.")"
508
	resume=yes
N
Nanako Shiraishi 已提交
509

510
	case "$skip,$abort" in
511
	t,t)
512
		die "$(gettext "Please make up your mind. --skip or --abort?")"
513
		;;
514 515
	t,)
		git rerere clear
516 517 518 519
		head_tree=$(git rev-parse --verify -q HEAD || echo $empty_tree) &&
		git read-tree --reset -u $head_tree $head_tree &&
		index_tree=$(git write-tree) &&
		git read-tree -m -u $index_tree $head_tree
520
		git read-tree $head_tree
521 522
		;;
	,t)
523 524 525 526
		if test -f "$dotest/rebasing"
		then
			exec git rebase --abort
		fi
N
Nanako Shiraishi 已提交
527
		git rerere clear
528 529
		if safe_to_abort
		then
530 531 532 533 534
			head_tree=$(git rev-parse --verify -q HEAD || echo $empty_tree) &&
			git read-tree --reset -u $head_tree $head_tree &&
			index_tree=$(git write-tree) &&
			orig_head=$(git rev-parse --verify -q ORIG_HEAD || echo $empty_tree) &&
			git read-tree -m -u $index_tree $orig_head
535 536 537 538 539 540 541 542
			if git rev-parse --verify -q ORIG_HEAD >/dev/null 2>&1
			then
				git reset ORIG_HEAD
			else
				git read-tree $empty_tree
				curr_branch=$(git symbolic-ref HEAD 2>/dev/null) &&
				git update-ref -d $curr_branch
			fi
543
		fi
N
Nanako Shiraishi 已提交
544 545 546
		rm -fr "$dotest"
		exit ;;
	esac
547
	rm -f "$dotest/dirtyindex"
548
else
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
	# 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 已提交
566
	# Make sure we are not given --skip, --continue, or --abort
N
Nanako Shiraishi 已提交
567
	test "$skip$resolved$abort" = "" ||
568
		die "$(gettext "Resolve operation not in progress, we are not resuming.")"
569 570 571 572

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

573 574 575 576 577 578 579 580 581
	if test -n "$prefix" && test $# != 0
	then
		first=t
		for arg
		do
			test -n "$first" && {
				set x
				first=
			}
582 583 584 585 586 587
			if is_absolute_path "$arg"
			then
				set "$@" "$arg"
			else
				set "$@" "$prefix$arg"
			fi
588 589 590
		done
		shift
	fi
591 592 593 594

	check_patch_format "$@"

	split_patches "$@"
595

596 597
	# -i can and must be given when resuming; everything
	# else is kept
598
	echo " $git_apply_opt" >"$dotest/apply-opt"
599
	echo "$threeway" >"$dotest/threeway"
600 601 602
	echo "$sign" >"$dotest/sign"
	echo "$utf8" >"$dotest/utf8"
	echo "$keep" >"$dotest/keep"
603
	echo "$messageid" >"$dotest/messageid"
604
	echo "$scissors" >"$dotest/scissors"
605
	echo "$no_inbody_headers" >"$dotest/no_inbody_headers"
S
Stephen Boyd 已提交
606
	echo "$GIT_QUIET" >"$dotest/quiet"
607
	echo 1 >"$dotest/next"
J
Junio C Hamano 已提交
608 609 610 611 612
	if test -n "$rebasing"
	then
		: >"$dotest/rebasing"
	else
		: >"$dotest/applying"
613 614 615 616 617 618
		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 已提交
619
	fi
620 621
fi

622 623
git update-index -q --refresh

J
Junio C Hamano 已提交
624 625
case "$resolved" in
'')
626 627 628 629 630 631
	case "$HAS_HEAD" in
	'')
		files=$(git ls-files) ;;
	?*)
		files=$(git diff-index --cached --name-only HEAD --) ;;
	esac || exit
632 633
	if test "$files"
	then
634
		test -n "$HAS_HEAD" && : >"$dotest/dirtyindex"
635
		die "$(eval_gettext "Dirty index: cannot apply patches (dirty: \$files)")"
636
	fi
J
Junio C Hamano 已提交
637 638
esac

T
Thomas Rast 已提交
639 640 641 642
# 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.

643 644 645
if test "$(cat "$dotest/utf8")" = t
then
	utf8=-u
646 647
else
	utf8=-n
648
fi
T
Thomas Rast 已提交
649 650 651 652 653 654 655 656 657
keep=$(cat "$dotest/keep")
case "$keep" in
t)
	keep=-k ;;
b)
	keep=-b ;;
*)
	keep= ;;
esac
658 659 660 661 662 663
case "$(cat "$dotest/messageid")" in
t)
	messageid=-m ;;
f)
	messageid= ;;
esac
664 665 666 667 668 669
case "$(cat "$dotest/scissors")" in
t)
	scissors=--scissors ;;
f)
	scissors=--no-scissors ;;
esac
670 671 672 673 674 675
if test "$(cat "$dotest/no_inbody_headers")" = t
then
	no_inbody_headers=--no-inbody-headers
else
	no_inbody_headers=
fi
S
Stephen Boyd 已提交
676 677 678 679
if test "$(cat "$dotest/quiet")" = t
then
	GIT_QUIET=t
fi
680 681 682
if test "$(cat "$dotest/threeway")" = t
then
	threeway=t
683 684
else
	threeway=f
685
fi
686
git_apply_opt=$(cat "$dotest/apply-opt")
687 688
if test "$(cat "$dotest/sign")" = t
then
689
	SIGNOFF=$(git var GIT_COMMITTER_IDENT | sed -e '
690 691
			s/>.*/>/
			s/^/Signed-off-by: /'
692
		)
693 694 695 696
else
	SIGNOFF=
fi

697 698
last=$(cat "$dotest/last")
this=$(cat "$dotest/next")
699 700
if test "$skip" = t
then
701
	this=$(expr "$this" + 1)
J
Jan Harkes 已提交
702
	resume=
703 704 705 706
fi

while test "$this" -le "$last"
do
707 708
	msgnum=$(printf "%0${prec}d" $this)
	next=$(expr "$this" + 1)
709
	test -f "$dotest/$msgnum" || {
J
Jan Harkes 已提交
710
		resume=
711 712 713
		go_next
		continue
	}
J
Junio C Hamano 已提交
714 715 716 717 718 719 720 721

	# 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
722
	# by the user, or the user can tell us to do so by --continue flag.
723 724
	case "$resume" in
	'')
725 726
		if test -f "$dotest/rebasing"
		then
727 728
			commit=$(sed -e 's/^From \([0-9a-f]*\) .*/\1/' \
				-e q "$dotest/$msgnum") &&
729 730
			test "$(git cat-file -t "$commit")" = commit ||
				stop_here $this
731 732
			git cat-file commit "$commit" |
			sed -e '1,/^$/d' >"$dotest/msg-clean"
733 734
			echo "$commit" >"$dotest/original-commit"
			get_author_ident_from_commit "$commit" >"$dotest/author-script"
735
			git diff-tree --root --binary --full-index "$commit" >"$dotest/patch"
736
		else
737
			git mailinfo $keep $no_inbody_headers $messageid $scissors $utf8 "$dotest/msg" "$dotest/patch" \
738 739 740 741 742 743 744 745 746 747 748 749 750 751 752
				<"$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 已提交
753 754 755 756 757 758
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
759
		fi
760 761
		;;
	esac
762

763 764 765 766 767 768 769 770
	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
771

772
	if test -z "$GIT_AUTHOR_EMAIL"
773
	then
774
		gettextln "Patch does not have a valid e-mail address."
775 776 777
		stop_here $this
	fi

J
Junio C Hamano 已提交
778
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
779

780 781 782 783
	case "$resume" in
	'')
	    if test '' != "$SIGNOFF"
	    then
784
		LAST_SIGNED_OFF_BY=$(
785 786
		    sed -ne '/^Signed-off-by: /p' \
		    "$dotest/msg-clean" |
787
		    sed -ne '$p'
788 789
		)
		ADD_SIGNOFF=$(
790
		    test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" || {
791 792
		    test '' = "$LAST_SIGNED_OFF_BY" && echo
		    echo "$SIGNOFF"
793
		})
794
	    else
795
		ADD_SIGNOFF=
796 797
	    fi
	    {
798 799 800 801 802 803 804 805
		if test -s "$dotest/msg-clean"
		then
			cat "$dotest/msg-clean"
		fi
		if test '' != "$ADD_SIGNOFF"
		then
			echo "$ADD_SIGNOFF"
		fi
806 807
	    } >"$dotest/final-commit"
	    ;;
J
Junio C Hamano 已提交
808
	*)
809
		case "$resolved$interactive" in
J
Junio C Hamano 已提交
810 811
		tt)
			# This is used only for interactive view option.
812
			git diff-index -p --cached HEAD -- >"$dotest/patch"
J
Junio C Hamano 已提交
813 814
			;;
		esac
815
	esac
816

817
	resume=
818 819
	if test "$interactive" = t
	then
820
	    test -t 0 ||
821
	    die "$(gettext "cannot be interactive without stdin connected to a terminal.")"
822 823 824
	    action=again
	    while test "$action" = again
	    do
825
		gettextln "Commit Body is:"
826 827 828
		echo "--------------------------"
		cat "$dotest/final-commit"
		echo "--------------------------"
829 830 831 832
		# 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 "
833 834
		read reply
		case "$reply" in
835 836 837
		[yY]*) action=yes ;;
		[aA]*) action=yes interactive= ;;
		[nN]*) action=skip ;;
838
		[eE]*) git_editor "$dotest/final-commit"
839
		       action=again ;;
840
		[vV]*) action=again
J
Jonathan Nieder 已提交
841
		       git_pager "$dotest/patch" ;;
842
		*)     action=again ;;
843 844 845 846 847
		esac
	    done
	else
	    action=yes
	fi
848

849 850 851 852 853 854
	if test $action = skip
	then
		go_next
		continue
	fi

855 856
	hook="$(git rev-parse --git-path hooks/applypatch-msg)"
	if test -x "$hook"
857
	then
858
		"$hook" "$dotest/final-commit" || stop_here $this
859 860
	fi

861 862 863 864 865 866 867
	if test -f "$dotest/final-commit"
	then
		FIRSTLINE=$(sed 1q "$dotest/final-commit")
	else
		FIRSTLINE=""
	fi

868
	say "$(eval_gettext "Applying: \$FIRSTLINE")"
869

J
Junio C Hamano 已提交
870 871
	case "$resolved" in
	'')
872 873 874 875 876 877 878 879
		# 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 已提交
880 881 882 883 884 885 886 887
		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=
888
		git diff-index --quiet --cached HEAD -- && {
889
			gettextln "No changes - did you forget to use 'git add'?
890
If there is nothing left to stage, chances are that something else
891
already introduced the same changes; you might want to skip this patch."
892
			stop_here_user_resolve $this
893
		}
894
		unmerged=$(git ls-files -u)
895 896
		if test -n "$unmerged"
		then
897 898
			gettextln "You still have unmerged paths in your index
did you forget to use 'git add'?"
899
			stop_here_user_resolve $this
900
		fi
J
Junio C Hamano 已提交
901
		apply_status=0
902
		git rerere
J
Junio C Hamano 已提交
903 904 905
		;;
	esac

906
	if test $apply_status != 0 && test "$threeway" = t
907
	then
908
		if (fall_back_3way)
909
		then
910 911
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
912
		    git diff-index --quiet --cached HEAD -- && {
913
			say "$(gettext "No changes -- Patch already applied.")"
914 915 916
			go_next
			continue
		    }
917 918
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
919 920 921 922
		fi
	fi
	if test $apply_status != 0
	then
923
		eval_gettextln 'Patch failed at $msgnum $FIRSTLINE'
924 925
		if test "$(git config --bool advice.amworkdir)" != false
		then
926 927
			eval_gettextln 'The copy of the patch that failed is found in:
   $dotest/patch'
928
		fi
929
		stop_here_user_resolve $this
930 931
	fi

932 933
	hook="$(git rev-parse --git-path hooks/pre-applypatch)"
	if test -x "$hook"
934
	then
935
		"$hook" || stop_here $this
936 937
	fi

938
	tree=$(git write-tree) &&
939
	commit=$(
940 941 942 943
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
944
		parent=$(git rev-parse --verify -q HEAD) ||
945
		say >&2 "$(gettext "applying to an empty history")"
946

947 948 949 950 951
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
N
Nicolas Vigier 已提交
952 953
		git commit-tree ${parent:+-p} $parent ${gpg_sign_opt:+"$gpg_sign_opt"} $tree  \
			<"$dotest/final-commit"
954
	) &&
955
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
956 957
	stop_here $this

T
Thomas Rast 已提交
958 959 960 961
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

962 963
	hook="$(git rev-parse --git-path hooks/post-applypatch)"
	test -x "$hook" && "$hook"
964 965 966 967

	go_next
done

968 969
if test -s "$dotest"/rewritten; then
    git notes copy --for-rewrite=rebase < "$dotest"/rewritten
970 971 972
    hook="$(git rev-parse --git-path hooks/post-rewrite)"
    if test -x "$hook"; then
	"$hook" rebase < "$dotest"/rewritten
973
    fi
T
Thomas Rast 已提交
974 975
fi

976 977 978 979 980 981 982
# 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