git-am.sh 21.8 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
Jay Soffian's avatar
Jay Soffian committed
12
b,binary*       (historical option -- no-op)
13
3,3way          allow fall back on 3way merging if needed
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-non-patch  pass -b flag to git-mailinfo
19
keep-cr         pass --keep-cr flag to git-mailsplit for mbox format
20
no-keep-cr      do not pass --keep-cr flag to git-mailsplit independent of am.keepcr
21
c,scissors      strip everything before a scissors line
22
whitespace=     pass it through git-apply
23 24
ignore-space-change pass it through git-apply
ignore-whitespace pass it through git-apply
25
directory=      pass it through git-apply
26
exclude=        pass it through git-apply
Johannes Berg's avatar
Johannes Berg committed
27
include=        pass it through git-apply
28 29
C=              pass it through git-apply
p=              pass it through git-apply
30
patch-format=   format the patch(es) are in
31
reject          pass it through git-apply
32
resolvemsg=     override error message when patch failure occurs
33 34
continue        continue applying patches after resolving a conflict
r,resolved      synonyms for --continue
Junio C Hamano's avatar
Junio C Hamano committed
35
skip            skip the current patch
Nanako Shiraishi's avatar
Nanako Shiraishi committed
36
abort           restore the original branch and abort the patching operation.
37
committer-date-is-author-date    lie about committer date
38
ignore-date     use current timestamp for author date
39
rerere-autoupdate update the index with reused conflict resolution if possible
Jay Soffian's avatar
Jay Soffian committed
40
rebasing*       (internal use for git-rebase)"
41

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

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

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

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

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

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

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

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

    stop_here $1
}

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

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

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

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

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

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

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

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

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

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

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

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

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

	# 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

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

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

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

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

383
while test $# != 0
384 385
do
	case "$1" in
386 387 388
	-i|--interactive)
		interactive=t ;;
	-b|--binary)
389 390
		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."
391
		;;
392 393
	-3|--3way)
		threeway=t ;;
394
	-s|--signoff)
395 396 397 398 399 400 401
		sign=t ;;
	-u|--utf8)
		utf8=t ;; # this is now default
	--no-utf8)
		utf8= ;;
	-k|--keep)
		keep=t ;;
402 403
	--keep-non-patch)
		keep=b ;;
404 405 406 407
	-c|--scissors)
		scissors=t ;;
	--no-scissors)
		scissors=f ;;
408
	-r|--resolved|--continue)
409 410 411
		resolved=t ;;
	--skip)
		skip=t ;;
Nanako Shiraishi's avatar
Nanako Shiraishi committed
412 413
	--abort)
		abort=t ;;
Junio C Hamano's avatar
Junio C Hamano committed
414
	--rebasing)
415
		rebasing=t threeway=t ;;
416 417
	--resolvemsg)
		shift; resolvemsg=$1 ;;
Johannes Berg's avatar
Johannes Berg committed
418
	--whitespace|--directory|--exclude|--include)
419
		git_apply_opt="$git_apply_opt $(sq "$1=$2")"; shift ;;
420
	-C|-p)
421
		git_apply_opt="$git_apply_opt $(sq "$1$2")"; shift ;;
422 423
	--patch-format)
		shift ; patch_format="$1" ;;
424
	--reject|--ignore-whitespace|--ignore-space-change)
425
		git_apply_opt="$git_apply_opt $1" ;;
426 427
	--committer-date-is-author-date)
		committer_date_is_author_date=t ;;
428 429
	--ignore-date)
		ignore_date=t ;;
430 431
	--rerere-autoupdate|--no-rerere-autoupdate)
		allow_rerere_autoupdate="$1" ;;
432 433
	-q|--quiet)
		GIT_QUIET=t ;;
434 435
	--keep-cr)
		keepcr=t ;;
436 437
	--no-keep-cr)
		keepcr=f ;;
438
	--)
439
		shift; break ;;
440
	*)
441
		usage ;;
442
	esac
443
	shift
444 445
done

Junio C Hamano's avatar
Junio C Hamano committed
446 447
# If the dotest directory exists, but we have finished applying all the
# patches in them, clear it out.
448 449 450 451 452 453 454 455 456 457 458
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
Nanako Shiraishi's avatar
Nanako Shiraishi committed
459
	case "$#,$skip$resolved$abort" in
Junio C Hamano's avatar
Junio C Hamano committed
460 461 462 463 464 465 466
	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
467
		# when there is already $dotest.  This is somewhat
Junio C Hamano's avatar
Junio C Hamano committed
468 469 470
		# unreliable -- stdin could be /dev/null for example
		# and the caller did not intend to feed us a patch but
		# wanted to continue unattended.
Jay Soffian's avatar
Jay Soffian committed
471
		test -t 0
Junio C Hamano's avatar
Junio C Hamano committed
472 473 474 475 476
		;;
	*)
		false
		;;
	esac ||
477
	die "$(eval_gettext "previous rebase directory \$dotest still exists but mbox given.")"
478
	resume=yes
Nanako Shiraishi's avatar
Nanako Shiraishi committed
479

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

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

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

	check_patch_format "$@"

	split_patches "$@"
536

537 538
	# -i can and must be given when resuming; everything
	# else is kept
539
	echo " $git_apply_opt" >"$dotest/apply-opt"
540
	echo "$threeway" >"$dotest/threeway"
541 542 543
	echo "$sign" >"$dotest/sign"
	echo "$utf8" >"$dotest/utf8"
	echo "$keep" >"$dotest/keep"
544
	echo "$scissors" >"$dotest/scissors"
545
	echo "$no_inbody_headers" >"$dotest/no_inbody_headers"
546
	echo "$GIT_QUIET" >"$dotest/quiet"
547
	echo 1 >"$dotest/next"
Junio C Hamano's avatar
Junio C Hamano committed
548 549 550 551 552
	if test -n "$rebasing"
	then
		: >"$dotest/rebasing"
	else
		: >"$dotest/applying"
553 554 555 556 557 558
		if test -n "$HAS_HEAD"
		then
			git update-ref ORIG_HEAD HEAD
		else
			git update-ref -d ORIG_HEAD >/dev/null 2>&1
		fi
Junio C Hamano's avatar
Junio C Hamano committed
559
	fi
560 561
fi

562 563
git update-index -q --refresh

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

579 580 581 582
# 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.

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

while test "$this" -le "$last"
do
	msgnum=`printf "%0${prec}d" $this`
	next=`expr "$this" + 1`
	test -f "$dotest/$msgnum" || {
Jan Harkes's avatar
Jan Harkes committed
642
		resume=
643 644 645
		go_next
		continue
	}
Junio C Hamano's avatar
Junio C Hamano committed
646 647 648 649 650 651 652 653 654

	# 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.
655 656
	case "$resume" in
	'')
657 658
		if test -f "$dotest/rebasing"
		then
659 660
			commit=$(sed -e 's/^From \([0-9a-f]*\) .*/\1/' \
				-e q "$dotest/$msgnum") &&
661 662
			test "$(git cat-file -t "$commit")" = commit ||
				stop_here $this
663 664
			git cat-file commit "$commit" |
			sed -e '1,/^$/d' >"$dotest/msg-clean"
665 666
			echo "$commit" >"$dotest/original-commit"
			get_author_ident_from_commit "$commit" >"$dotest/author-script"
667
			git diff-tree --root --binary --full-index "$commit" >"$dotest/patch"
668
		else
669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684
			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"
685 686 687 688 689 690
			{
				sed -n '/^Subject/ s/Subject: //p' "$dotest/info"
				echo
				cat "$dotest/msg"
			} |
			git stripspace > "$dotest/msg-clean"
691
		fi
692 693
		;;
	esac
694

695 696 697 698 699 700 701 702
	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
703

704
	if test -z "$GIT_AUTHOR_EMAIL"
705
	then
706
		gettextln "Patch does not have a valid e-mail address."
707 708 709
		stop_here $this
	fi

710
	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
711

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

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

781 782 783 784 785 786 787 788 789 790 791 792
	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

793 794 795 796 797 798 799
	if test -f "$dotest/final-commit"
	then
		FIRSTLINE=$(sed 1q "$dotest/final-commit")
	else
		FIRSTLINE=""
	fi

800
	say "$(eval_gettext "Applying: \$FIRSTLINE")"
801

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

838
	if test $apply_status != 0 && test "$threeway" = t
839
	then
840
		if (fall_back_3way)
841
		then
842 843
		    # Applying the patch to an earlier tree and merging the
		    # result may have produced the same tree as ours.
844
		    git diff-index --quiet --cached HEAD -- && {
845
			say "$(gettext "No changes -- Patch already applied.")"
846 847 848
			go_next
			continue
		    }
849 850
		    # clear apply_status -- we have successfully merged.
		    apply_status=0
851 852 853 854
		fi
	fi
	if test $apply_status != 0
	then
855
		eval_gettextln 'Patch failed at $msgnum $FIRSTLINE'
856 857
		if test "$(git config --bool advice.amworkdir)" != false
		then
858 859
			eval_gettextln 'The copy of the patch that failed is found in:
   $dotest/patch'
860
		fi
861
		stop_here_user_resolve $this
862 863 864 865 866 867 868
	fi

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

869
	tree=$(git write-tree) &&
870
	commit=$(
871 872 873 874
		if test -n "$ignore_date"
		then
			GIT_AUTHOR_DATE=
		fi
875
		parent=$(git rev-parse --verify -q HEAD) ||
876
		say >&2 "$(gettext "applying to an empty history")"
877

878 879 880 881 882
		if test -n "$committer_date_is_author_date"
		then
			GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
			export GIT_COMMITTER_DATE
		fi &&
883
		git commit-tree $tree ${parent:+-p} $parent <"$dotest/final-commit"
884
	) &&
885
	git update-ref -m "$GIT_REFLOG_ACTION: $FIRSTLINE" HEAD $commit $parent ||
886 887
	stop_here $this

888 889 890 891
	if test -f "$dotest/original-commit"; then
		echo "$(cat "$dotest/original-commit") $commit" >> "$dotest/rewritten"
	fi

892 893 894 895 896 897 898 899
	if test -x "$GIT_DIR"/hooks/post-applypatch
	then
		"$GIT_DIR"/hooks/post-applypatch
	fi

	go_next
done

900 901 902
if test -s "$dotest"/rewritten; then
    git notes copy --for-rewrite=rebase < "$dotest"/rewritten
    if test -x "$GIT_DIR"/hooks/post-rewrite; then
903
	"$GIT_DIR"/hooks/post-rewrite rebase < "$dotest"/rewritten
904
    fi
905 906
fi

907
rm -fr "$dotest"
908
git gc --auto