git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[GSoC][PATCH v2 3/4] rebase: use the new git-rebase--preserve-merges.sh

From
Alban Gruin <alban.gruin@gmail.com>
Date
May 22, 2018, 21:16 UTC
Message-ID
<20180522211625.23893-4-alban.gruin@gmail.com>
In-Reply-To
<20180522211625.23893-1-alban.gruin@gmail.com>

Creates 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>
---
 git-rebase.sh | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)
diff --git a/git-rebase.sh b/git-rebase.sh
index 40be59ecc..19bdebb48 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -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...")"
-- 
2.16.1
Previous: Alban GruinNext: Alban Gruin
Message 11 of 26 in “rebase: split rebase -p from rebase -i”
  1. Alban GruinMay 22, 2018
  2. [GSoC][PATCH 1/4] rebase: duplicate git-rebase--interactive.sh to git-rebase--preserve-merges.shAlban Gruin, May 22, 2018
  3. Stefan BellerMay 22, 2018
  4. Alban GruinMay 22, 2018
  5. [GSoC][PATCH 2/4] rebase: strip unused code in git-rebase--preserve-merges.shAlban Gruin, May 22, 2018
  6. [GSoC][PATCH 3/4] rebase: use the new git-rebase--preserve-merges.shAlban Gruin, May 22, 2018
  7. [GSoC][PATCH 4/4] rebase: remove -p code from git-rebase--interactive.shAlban Gruin, May 22, 2018
  8. Stefan BellerMay 22, 2018
  9. [GSoC][PATCH v2 0/4] rebase: split rebase -p from rebase -iAlban Gruin, May 22, 2018
  10. [GSoC][PATCH v2 2/4] rebase: strip unused code in git-rebase--preserve-merges.shAlban Gruin, May 22, 2018
  11. [GSoC][PATCH v2 3/4] rebase: use the new git-rebase--preserve-merges.shAlban Gruin, May 22, 2018
  12. [GSoC][PATCH v2 1/4] rebase: duplicate git-rebase--interactive.sh to git-rebase--preserve-merges.shAlban Gruin, May 22, 2018
  13. [GSoC][PATCH v2 4/4] rebase: remove -p code from git-rebase--interactive.shAlban Gruin, May 22, 2018
  14. [GSoC][PATCH v3 0/4] rebase: split rebase -p from rebase -iAlban Gruin, May 24, 2018
  15. [GSoC][PATCH v3 4/4] rebase: remove -p code from git-rebase--interactive.shAlban Gruin, May 24, 2018
  16. [GSoC][PATCH v3 3/4] rebase: use the new git-rebase--preserve-merges.shAlban Gruin, May 24, 2018
  17. [GSoC][PATCH v3 2/4] rebase: strip unused code in git-rebase--preserve-merges.shAlban Gruin, May 24, 2018
  18. [GSoC][PATCH v3 1/4] rebase: duplicate git-rebase--interactive.sh to git-rebase--preserve-merges.shAlban Gruin, May 24, 2018
  19. Junio C HamanoMay 26, 2018
  20. Alban GruinMay 24, 2018
  21. Johannes SchindelinMay 25, 2018
  22. [GSoC][PATCH v4 0/4] rebase: split rebase -p from rebase -iAlban Gruin, May 28, 2018
  23. [GSoC][PATCH v4 1/4] rebase: introduce a dedicated backend for --preserve-mergesAlban Gruin, May 28, 2018
  24. [GSoC][PATCH v4 2/4] rebase: strip unused code in git-rebase--preserve-merges.shAlban Gruin, May 28, 2018
  25. [GSoC][PATCH v4 3/4] rebase: use the new git-rebase--preserve-merges.shAlban Gruin, May 28, 2018
  26. [GSoC][PATCH v4 4/4] rebase: remove -p code from git-rebase--interactive.shAlban Gruin, May 28, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.