Skip to content

Commit

Permalink
rebase: use the new git-rebase--preserve-merges.sh
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
agrn authored and gitster committed Jun 1, 2018
1 parent ef64bb3 commit 6d98d0c
Showing 1 changed file with 25 additions and 7 deletions.
32 changes: 25 additions & 7 deletions git-rebase.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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...")"
Expand Down

0 comments on commit 6d98d0c

Please sign in to comment.