mirror of
https://github.com/git/git.git
synced 2025-03-15 04:52:19 +00:00
rebase: use the new git-rebase--preserve-merges.sh
Create a new type of rebase, "preserve-merges", used when rebase is called with -p. Before that, the type for preserve-merges was "interactive", and some places of this script compared $type to "interactive". Instead, the code now checks if $interactive_rebase is empty or not, as it is set to "explicit" when calling an interactive rebase (and, possibly, one of its submodes), and "implied" when calling one of its submodes (eg. preserve-merges) *without* interactive rebase. It also detects the presence of the directory "$merge_dir"/rewritten left by the preserve-merges script when calling rebase --continue, --skip, etc., and, if it exists, sets the rebase mode to preserve-merges. In this case, interactive_rebase is set to "explicit", as "implied" would break some tests. Signed-off-by: Alban Gruin <alban.gruin@gmail.com>
This commit is contained in:
parent
ef64bb328d
commit
6d98d0c018
@ -207,7 +207,14 @@ run_specific_rebase () {
|
||||
autosquash=
|
||||
fi
|
||||
. git-rebase--$type
|
||||
git_rebase__$type${preserve_merges:+__preserve_merges}
|
||||
|
||||
if test -z "$preserve_merges"
|
||||
then
|
||||
git_rebase__$type
|
||||
else
|
||||
git_rebase__preserve_merges
|
||||
fi
|
||||
|
||||
ret=$?
|
||||
if test $ret -eq 0
|
||||
then
|
||||
@ -239,7 +246,12 @@ then
|
||||
state_dir="$apply_dir"
|
||||
elif test -d "$merge_dir"
|
||||
then
|
||||
if test -f "$merge_dir"/interactive
|
||||
if test -d "$merge_dir"/rewritten
|
||||
then
|
||||
type=preserve-merges
|
||||
interactive_rebase=explicit
|
||||
preserve_merges=t
|
||||
elif test -f "$merge_dir"/interactive
|
||||
then
|
||||
type=interactive
|
||||
interactive_rebase=explicit
|
||||
@ -402,14 +414,14 @@ if test -n "$action"
|
||||
then
|
||||
test -z "$in_progress" && die "$(gettext "No rebase in progress?")"
|
||||
# Only interactive rebase uses detailed reflog messages
|
||||
if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
|
||||
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 "$type" != "interactive"
|
||||
if test "$action" = "edit-todo" && test -z "$interactive_rebase"
|
||||
then
|
||||
die "$(gettext "The --edit-todo action can only be used during interactive rebase.")"
|
||||
fi
|
||||
@ -487,7 +499,13 @@ fi
|
||||
|
||||
if test -n "$interactive_rebase"
|
||||
then
|
||||
type=interactive
|
||||
if test -z "$preserve_merges"
|
||||
then
|
||||
type=interactive
|
||||
else
|
||||
type=preserve-merges
|
||||
fi
|
||||
|
||||
state_dir="$merge_dir"
|
||||
elif test -n "$do_merge"
|
||||
then
|
||||
@ -647,7 +665,7 @@ require_clean_work_tree "rebase" "$(gettext "Please commit or stash them.")"
|
||||
# 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 "$type" != interactive && test "$upstream" = "$onto" &&
|
||||
if test -z "$interactive_rebase" && test "$upstream" = "$onto" &&
|
||||
test "$mb" = "$onto" && test -z "$restrict_revision" &&
|
||||
# linear history?
|
||||
! (git rev-list --parents "$onto".."$orig_head" | sane_grep " .* ") > /dev/null
|
||||
@ -691,7 +709,7 @@ then
|
||||
GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
|
||||
fi
|
||||
|
||||
test "$type" = interactive && run_specific_rebase
|
||||
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...")"
|
||||
|
Loading…
x
Reference in New Issue
Block a user