#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano.
#

SUBDIRECTORY_OK=Yes
OPTIONS_KEEPDASHDASH=
OPTIONS_STUCKLONG=t
OPTIONS_SPEC="\
git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>]
git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
git rebase --continue | --abort | --skip | --edit-todo
--
 Available options are
v,verbose!         display a diffstat of what changed upstream
q,quiet!           be quiet. implies --no-stat
autostash          automatically stash/stash pop before and after
fork-point         use 'merge-base --fork-point' to refine upstream
onto=!             rebase onto given branch instead of upstream
r,rebase-merges?   try to rebase merges instead of skipping them
p,preserve-merges! try to recreate merges instead of ignoring them
s,strategy=!       use the given merge strategy
X,strategy-option=! pass the argument through to the merge strategy
no-ff!             cherry-pick all commits, even if unchanged
f,force-rebase!    cherry-pick all commits, even if unchanged
m,merge!           use merging strategies to rebase
i,interactive!     let the user edit the list of commits to rebase
x,exec=!           add exec lines after each commit of the editable list
y=!                same as --reschedule-failed-exec -x
k,keep-empty	   preserve empty commits during rebase
allow-empty-message allow rebasing commits with empty messages
stat!              display a diffstat of what changed upstream
n,no-stat!         do not show diffstat of what changed upstream
verify             allow pre-rebase hook to run
rerere-autoupdate  allow rerere to update index with resolved conflicts
root!              rebase all reachable commits up to the root(s)
autosquash         move commits that begin with squash!/fixup! under -i
signoff            add a Signed-off-by: line to each commit
committer-date-is-author-date! passed to 'git am'
ignore-date!       passed to 'git am'
whitespace=!       passed to 'git apply'
ignore-whitespace! passed to 'git apply'
C=!                passed to 'git apply'
S,gpg-sign?        GPG-sign commits
 Actions:
continue!          continue
abort!             abort and check out the original branch
skip!              skip current patch and continue
edit-todo!         edit the todo list during an interactive rebase
quit!              abort but keep HEAD where it is
show-current-patch! show the patch file being applied or merged
reschedule-failed-exec automatically reschedule failed exec commands
"
. git-sh-setup
set_reflog_action rebase
require_work_tree_exists
cd_to_toplevel

LF='
'
ok_to_skip_pre_rebase=

squash_onto=
unset onto
unset restrict_revision
cmd=
strategy=
strategy_opts=
do_merge=
merge_dir="$GIT_DIR"/rebase-merge
apply_dir="$GIT_DIR"/rebase-apply
verbose=
diffstat=
test "$(git config --bool rebase.stat)" = true && diffstat=t
autostash="$(git config --bool rebase.autostash || echo false)"
fork_point=auto
git_am_opt=
git_format_patch_opt=
rebase_root=
force_rebase=
allow_rerere_autoupdate=
# Non-empty if a rebase was in progress when 'git rebase' was invoked
in_progress=
# One of {am, merge, interactive}
type=
# One of {"$GIT_DIR"/rebase-apply, "$GIT_DIR"/rebase-merge}
state_dir=
# One of {'', continue, skip, abort}, as parsed from command line
action=
rebase_merges=
rebase_cousins=
preserve_merges=
autosquash=
keep_empty=
allow_empty_message=--allow-empty-message
signoff=
reschedule_failed_exec=
test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
case "$(git config --bool commit.gpgsign)" in
true)	gpg_sign_opt=-S ;;
*)	gpg_sign_opt= ;;
esac
test "$(git config --bool rebase.reschedulefailedexec)" = "true" &&
reschedule_failed_exec=--reschedule-failed-exec
. git-rebase--common

read_basic_state () {
	test -f "$state_dir/head-name" &&
	test -f "$state_dir/onto" &&
	head_name=$(cat "$state_dir"/head-name) &&
	onto=$(cat "$state_dir"/onto) &&
	# We always write to orig-head, but interactive rebase used to write to
	# head. Fall back to reading from head to cover for the case that the
	# user upgraded git with an ongoing interactive rebase.
	if test -f "$state_dir"/orig-head
	then
		orig_head=$(cat "$state_dir"/orig-head)
	else
		orig_head=$(cat "$state_dir"/head)
	fi &&
	test -f "$state_dir"/quiet && GIT_QUIET=t
	test -f "$state_dir"/verbose && verbose=t
	test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
	test -f "$state_dir"/strategy_opts &&
		strategy_opts="$(cat "$state_dir"/strategy_opts)"
	test -f "$state_dir"/allow_rerere_autoupdate &&
		allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
	test -f "$state_dir"/gpg_sign_opt &&
		gpg_sign_opt="$(cat "$state_dir"/gpg_sign_opt)"
	test -f "$state_dir"/signoff && {
		signoff="$(cat "$state_dir"/signoff)"
		force_rebase=t
	}
	test -f "$state_dir"/reschedule-failed-exec &&
		reschedule_failed_exec=t
}

finish_rebase () {
	rm -f "$(git rev-parse --git-path REBASE_HEAD)"
	apply_autostash &&
	{ git gc --auto || true; } &&
	rm -rf "$state_dir"
}

run_interactive () {
	GIT_CHERRY_PICK_HELP="$resolvemsg"
	export GIT_CHERRY_PICK_HELP

	test -n "$keep_empty" && keep_empty="--keep-empty"
	test -n "$rebase_merges" && rebase_merges="--rebase-merges"
	test -n "$rebase_cousins" && rebase_cousins="--rebase-cousins"
	test -n "$autosquash" && autosquash="--autosquash"
	test -n "$verbose" && verbose="--verbose"
	test -n "$force_rebase" && force_rebase="--no-ff"
	test -n "$restrict_revision" && \
		restrict_revision="--restrict-revision=^$restrict_revision"
	test -n "$upstream" && upstream="--upstream=$upstream"
	test -n "$onto" && onto="--onto=$onto"
	test -n "$squash_onto" && squash_onto="--squash-onto=$squash_onto"
	test -n "$onto_name" && onto_name="--onto-name=$onto_name"
	test -n "$head_name" && head_name="--head-name=$head_name"
	test -n "$strategy" && strategy="--strategy=$strategy"
	test -n "$strategy_opts" && strategy_opts="--strategy-opts=$strategy_opts"
	test -n "$switch_to" && switch_to="--switch-to=$switch_to"
	test -n "$cmd" && cmd="--cmd=$cmd"
	test -n "$action" && action="--$action"

	exec git rebase--interactive "$action" "$keep_empty" "$rebase_merges" "$rebase_cousins" \
		"$upstream" "$onto" "$squash_onto" "$restrict_revision" \
		"$allow_empty_message" "$autosquash" "$verbose" \
		"$force_rebase" "$onto_name" "$head_name" "$strategy" \
		"$strategy_opts" "$cmd" "$switch_to" \
		"$allow_rerere_autoupdate" "$gpg_sign_opt" "$signoff" \
		"$reschedule_failed_exec"
}

run_specific_rebase () {
	if [ "$interactive_rebase" = implied ]; then
		GIT_SEQUENCE_EDITOR=:
		export GIT_SEQUENCE_EDITOR
		autosquash=
	fi

	if test -n "$interactive_rebase" -a -z "$preserve_merges"
	then
		run_interactive
	else
		. git-rebase--$type

		if test -z "$preserve_merges"
		then
			git_rebase__$type
		else
			git_rebase__preserve_merges
		fi
	fi

	ret=$?
	if test $ret -eq 0
	then
		finish_rebase
	elif test $ret -eq 2 # special exit status for rebase -p
	then
		apply_autostash &&
		rm -rf "$state_dir" &&
		die "Nothing to do"
	fi
	exit $ret
}

run_pre_rebase_hook () {
	if test -z "$ok_to_skip_pre_rebase" &&
	   test -x "$(git rev-parse --git-path hooks/pre-rebase)"
	then
		"$(git rev-parse --git-path hooks/pre-rebase)" ${1+"$@"} ||
		die "$(gettext "The pre-rebase hook refused to rebase.")"
	fi
}

test -f "$apply_dir"/applying &&
	die "$(gettext "It looks like 'git am' is in progress. Cannot rebase.")"

if test -d "$apply_dir"
then
	type=am
	state_dir="$apply_dir"
elif test -d "$merge_dir"
then
	type=interactive
	if test -d "$merge_dir"/rewritten
	then
		type=preserve-merges
		interactive_rebase=explicit
		preserve_merges=t
	elif test -f "$merge_dir"/interactive
	then
		interactive_rebase=explicit
	fi
	state_dir="$merge_dir"
fi
test -n "$type" && in_progress=t

total_argc=$#
while test $# != 0
do
	case "$1" in
	--no-verify)
		ok_to_skip_pre_rebase=yes
		;;
	--verify)
		ok_to_skip_pre_rebase=
		;;
	--continue|--skip|--abort|--quit|--edit-todo|--show-current-patch)
		test $total_argc -eq 2 || usage
		action=${1##--}
		;;
	--onto=*)
		onto="${1#--onto=}"
		;;
	--exec=*)
		cmd="${cmd}exec ${1#--exec=}${LF}"
		test -z "$interactive_rebase" && interactive_rebase=implied
		;;
	-y*)
		reschedule_failed_exec=--reschedule-failed-exec
		cmd="${cmd}exec ${1#-y}${LF}"
		test -z "$interactive_rebase" && interactive_rebase=implied
		;;
	--interactive)
		interactive_rebase=explicit
		;;
	--keep-empty)
		keep_empty=yes
		;;
	--allow-empty-message)
		allow_empty_message=--allow-empty-message
		;;
	--no-keep-empty)
		keep_empty=
		;;
	--rebase-merges)
		rebase_merges=t
		test -z "$interactive_rebase" && interactive_rebase=implied
		;;
	--rebase-merges=*)
		rebase_merges=t
		case "${1#*=}" in
		rebase-cousins) rebase_cousins=t;;
		no-rebase-cousins) rebase_cousins=;;
		*) die "Unknown mode: $1";;
		esac
		test -z "$interactive_rebase" && interactive_rebase=implied
		;;
	--preserve-merges)
		preserve_merges=t
		test -z "$interactive_rebase" && interactive_rebase=implied
		;;
	--autosquash)
		autosquash=t
		;;
	--no-autosquash)
		autosquash=
		;;
	--fork-point)
		fork_point=t
		;;
	--no-fork-point)
		fork_point=
		;;
	--merge)
		do_merge=t
		;;
	--strategy-option=*)
		strategy_opts="$strategy_opts $(git rev-parse --sq-quote "--${1#--strategy-option=}" | sed -e s/^.//)"
		do_merge=t
		test -z "$strategy" && strategy=recursive
		;;
	--strategy=*)
		strategy="${1#--strategy=}"
		do_merge=t
		;;
	--no-stat)
		diffstat=
		;;
	--stat)
		diffstat=t
		;;
	--autostash)
		autostash=true
		;;
	--no-autostash)
		autostash=false
		;;
	--verbose)
		verbose=t
		diffstat=t
		GIT_QUIET=
		;;
	--quiet)
		GIT_QUIET=t
		git_am_opt="$git_am_opt -q"
		verbose=
		diffstat=
		;;
	--whitespace=*)
		git_am_opt="$git_am_opt --whitespace=${1#--whitespace=}"
		case "${1#--whitespace=}" in
		fix|strip)
			force_rebase=t
			;;
		warn|nowarn|error|error-all)
			;; # okay, known whitespace option
		*)
			die "fatal: Invalid whitespace option: '${1#*=}'"
			;;
		esac
		;;
	--ignore-whitespace)
		git_am_opt="$git_am_opt $1"
		;;
	--signoff)
		signoff=--signoff
		;;
	--no-signoff)
		signoff=
		;;
	--committer-date-is-author-date|--ignore-date)
		git_am_opt="$git_am_opt $1"
		force_rebase=t
		;;
	-C*[!0-9]*)
		die "fatal: switch \`C' expects a numerical value"
		;;
	-C*)
		git_am_opt="$git_am_opt $1"
		;;
	--root)
		rebase_root=t
		;;
	--force-rebase|--no-ff)
		force_rebase=t
		;;
	--rerere-autoupdate|--no-rerere-autoupdate)
		allow_rerere_autoupdate="$1"
		;;
	--gpg-sign)
		gpg_sign_opt=-S
		;;
	--gpg-sign=*)
		gpg_sign_opt="-S${1#--gpg-sign=}"
		;;
	--reschedule-failed-exec)
		reschedule_failed_exec=--reschedule-failed-exec
		;;
	--no-reschedule-failed-exec)
		reschedule_failed_exec=
		;;
	--)
		shift
		break
		;;
	*)
		usage
		;;
	esac
	shift
done
test $# -gt 2 && usage

if test -n "$action"
then
	test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
	# Only interactive rebase uses detailed reflog messages
	if test -n "$interactive_rebase" && test "$GIT_REFLOG_ACTION" = rebase
	then
		GIT_REFLOG_ACTION="rebase -i ($action)"
		export GIT_REFLOG_ACTION
	fi
fi

if test "$action" = "edit-todo" && test -z "$interactive_rebase"
then
	die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
fi

case "$action" in
continue)
	# Sanity check
	git rev-parse --verify HEAD >/dev/null ||
		die "$(gettext "Cannot read HEAD")"
	git update-index --ignore-submodules --refresh &&
	git diff-files --quiet --ignore-submodules || {
		echo "$(gettext "You must edit all merge conflicts and then
mark them as resolved using git add")"
		exit 1
	}
	read_basic_state
	run_specific_rebase
	;;
skip)
	output git reset --hard HEAD || exit $?
	read_basic_state
	run_specific_rebase
	;;
abort)
	git rerere clear
	read_basic_state
	case "$head_name" in
	refs/*)
		git symbolic-ref -m "rebase: aborting" HEAD $head_name ||
		die "$(eval_gettext "Could not move back to \$head_name")"
		;;
	esac
	output git reset --hard $orig_head
	finish_rebase
	exit
	;;
quit)
	exec rm -rf "$state_dir"
	;;
edit-todo)
	run_specific_rebase
	;;
show-current-patch)
	run_specific_rebase
	die "BUG: run_specific_rebase is not supposed to return here"
	;;
esac

# Make sure no rebase is in progress
if test -n "$in_progress"
then
	state_dir_base=${state_dir##*/}
	cmd_live_rebase="git rebase (--continue | --abort | --skip)"
	cmd_clear_stale_rebase="rm -fr \"$state_dir\""
	die "
$(eval_gettext 'It seems that there is already a $state_dir_base directory, and
I wonder if you are in the middle of another rebase.  If that is the
case, please try
	$cmd_live_rebase
If that is not the case, please
	$cmd_clear_stale_rebase
and run me again.  I am stopping in case you still have something
valuable there.')"
fi

if test -n "$rebase_root" && test -z "$onto"
then
	test -z "$interactive_rebase" && interactive_rebase=implied
fi

if test -n "$keep_empty"
then
	test -z "$interactive_rebase" && interactive_rebase=implied
fi

actually_interactive=
if test -n "$interactive_rebase"
then
	if test -z "$preserve_merges"
	then
		type=interactive
	else
		type=preserve-merges
	fi
	actually_interactive=t
	state_dir="$merge_dir"
elif test -n "$do_merge"
then
	interactive_rebase=implied
	type=interactive
	state_dir="$merge_dir"
else
	type=am
	state_dir="$apply_dir"
fi

if test -t 2 && test -z "$GIT_QUIET"
then
	git_format_patch_opt="$git_format_patch_opt --progress"
fi

incompatible_opts=$(echo " $git_am_opt " | \
		    sed -e 's/ -q / /g' -e 's/^ \(.*\) $/\1/')
if test -n "$incompatible_opts"
then
	if test -n "$actually_interactive" || test "$do_merge"
	then
		die "$(gettext "fatal: cannot combine am options with either interactive or merge options")"
	fi
fi

if test -n "$signoff"
then
	test -n "$preserve_merges" &&
		die "$(gettext "fatal: cannot combine '--signoff' with '--preserve-merges'")"
	git_am_opt="$git_am_opt $signoff"
	force_rebase=t
fi

if test -n "$preserve_merges"
then
	# Note: incompatibility with --signoff handled in signoff block above
	# Note: incompatibility with --interactive is just a strong warning;
	#       git-rebase.txt caveats with "unless you know what you are doing"
	test -n "$rebase_merges" &&
		die "$(gettext "fatal: cannot combine '--preserve-merges' with '--rebase-merges'")"

	test -n "$reschedule_failed_exec" &&
		die "$(gettext "error: cannot combine '--preserve-merges' with '--reschedule-failed-exec'")"
fi

if test -n "$rebase_merges"
then
	test -n "$strategy_opts" &&
		die "$(gettext "fatal: cannot combine '--rebase-merges' with '--strategy-option'")"
	test -n "$strategy" &&
		die "$(gettext "fatal: cannot combine '--rebase-merges' with '--strategy'")"
fi

if test -z "$rebase_root"
then
	case "$#" in
	0)
		if ! upstream_name=$(git rev-parse --symbolic-full-name \
			--verify -q @{upstream} 2>/dev/null)
		then
			. git-parse-remote
			error_on_missing_default_upstream "rebase" "rebase" \
				"against" "git rebase $(gettext '<branch>')"
		fi

		test "$fork_point" = auto && fork_point=t
		;;
	*)	upstream_name="$1"
		if test "$upstream_name" = "-"
		then
			upstream_name="@{-1}"
		fi
		shift
		;;
	esac
	upstream=$(peel_committish "${upstream_name}") ||
	die "$(eval_gettext "invalid upstream '\$upstream_name'")"
	upstream_arg="$upstream_name"
else
	if test -z "$onto"
	then
		empty_tree=$(git hash-object -t tree /dev/null)
		onto=$(git commit-tree $empty_tree </dev/null)
		squash_onto="$onto"
	fi
	unset upstream_name
	unset upstream
	test $# -gt 1 && usage
	upstream_arg=--root
fi

# Make sure the branch to rebase onto is valid.
onto_name=${onto-"$upstream_name"}
case "$onto_name" in
*...*)
	if	left=${onto_name%...*} right=${onto_name#*...} &&
		onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
	then
		case "$onto" in
		?*"$LF"?*)
			die "$(eval_gettext "\$onto_name: there are more than one merge bases")"
			;;
		'')
			die "$(eval_gettext "\$onto_name: there is no merge base")"
			;;
		esac
	else
		die "$(eval_gettext "\$onto_name: there is no merge base")"
	fi
	;;
*)
	onto=$(peel_committish "$onto_name") ||
	die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
	;;
esac

# If the branch to rebase is given, that is the branch we will rebase
# $branch_name -- branch/commit being rebased, or HEAD (already detached)
# $orig_head -- commit object name of tip of the branch before rebasing
# $head_name -- refs/heads/<that-branch> or "detached HEAD"
switch_to=
case "$#" in
1)
	# Is it "rebase other $branchname" or "rebase other $commit"?
	branch_name="$1"
	switch_to="$1"

	# Is it a local branch?
	if git show-ref --verify --quiet -- "refs/heads/$branch_name" &&
	   orig_head=$(git rev-parse -q --verify "refs/heads/$branch_name")
	then
		head_name="refs/heads/$branch_name"
	# If not is it a valid ref (branch or commit)?
	elif orig_head=$(git rev-parse -q --verify "$branch_name")
	then
		head_name="detached HEAD"

	else
		die "$(eval_gettext "fatal: no such branch/commit '\$branch_name'")"
	fi
	;;
0)
	# Do not need to switch branches, we are already on it.
	if branch_name=$(git symbolic-ref -q HEAD)
	then
		head_name=$branch_name
		branch_name=$(expr "z$branch_name" : 'zrefs/heads/\(.*\)')
	else
		head_name="detached HEAD"
		branch_name=HEAD
	fi
	orig_head=$(git rev-parse --verify HEAD) || exit
	;;
*)
	die "BUG: unexpected number of arguments left to parse"
	;;
esac

if test "$fork_point" = t
then
	new_upstream=$(git merge-base --fork-point "$upstream_name" \
			"${switch_to:-HEAD}")
	if test -n "$new_upstream"
	then
		restrict_revision=$new_upstream
	fi
fi

if test "$autostash" = true && ! (require_clean_work_tree) 2>/dev/null
then
	stash_sha1=$(git stash create "autostash") ||
	die "$(gettext 'Cannot autostash')"

	mkdir -p "$state_dir" &&
	echo $stash_sha1 >"$state_dir/autostash" &&
	stash_abbrev=$(git rev-parse --short $stash_sha1) &&
	echo "$(eval_gettext 'Created autostash: $stash_abbrev')" &&
	git reset --hard
fi

require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"

# Now we are rebasing commits $upstream..$orig_head (or with --root,
# everything leading up to $orig_head) on top of $onto

# Check if we are already based on $onto with linear history,
# but this should be done only when upstream and onto are the same
# and if this is not an interactive rebase.
mb=$(git merge-base "$onto" "$orig_head")
if test -z "$actually_interactive" && test "$upstream" = "$onto" &&
	test "$mb" = "$onto" && test -z "$restrict_revision" &&
	# linear history?
	! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
then
	if test -z "$force_rebase"
	then
		# Lazily switch to the target branch if needed...
		test -z "$switch_to" ||
		GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to" \
			git checkout -q "$switch_to" --
		if test "$branch_name" = "HEAD" &&
			 ! git symbolic-ref -q HEAD
		then
			say "$(eval_gettext "HEAD is up to date.")"
		else
			say "$(eval_gettext "Current branch \$branch_name is up to date.")"
		fi
		finish_rebase
		exit 0
	else
		if test "$branch_name" = "HEAD" &&
			 ! git symbolic-ref -q HEAD
		then
			say "$(eval_gettext "HEAD is up to date, rebase forced.")"
		else
			say "$(eval_gettext "Current branch \$branch_name is up to date, rebase forced.")"
		fi
	fi
fi

# If a hook exists, give it a chance to interrupt
run_pre_rebase_hook "$upstream_arg" "$@"

if test -n "$diffstat"
then
	if test -n "$verbose"
	then
		if test -z "$mb"
		then
			echo "$(eval_gettext "Changes to \$onto:")"
		else
			echo "$(eval_gettext "Changes from \$mb to \$onto:")"
		fi
	fi
	mb_tree="${mb:-$(git hash-object -t tree /dev/null)}"
	# We want color (if set), but no pager
	GIT_PAGER='' git diff --stat --summary "$mb_tree" "$onto"
fi

if test -z "$actually_interactive" && test "$mb" = "$orig_head"
then
	say "$(eval_gettext "Fast-forwarded \$branch_name to \$onto_name.")"
	GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
		git checkout -q "$onto^0" || die "could not detach HEAD"
	# If the $onto is a proper descendant of the tip of the branch, then
	# we just fast-forwarded.
	git update-ref ORIG_HEAD $orig_head
	move_to_original_branch
	finish_rebase
	exit 0
fi

test -n "$interactive_rebase" && run_specific_rebase

# Detach HEAD and reset the tree
say "$(gettext "First, rewinding head to replay your work on top of it...")"

GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name" \
	git checkout -q "$onto^0" || die "could not detach HEAD"
git update-ref ORIG_HEAD $orig_head

if test -n "$rebase_root"
then
	revisions="$onto..$orig_head"
else
	revisions="${restrict_revision-$upstream}..$orig_head"
fi

run_specific_rebase
