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

[PATCH 12/12] rebase -r: do not (re-)generate root commits with `--root` *and* `--onto`

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Jul 25, 2019, 10:11 UTC
Message-ID
<e6713568dc9170acd671d3c737939c829937b5b5.1564049474.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.294.git.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

When rebasing a complete commit history onto a given commit, it is pretty obvious that the root commits should be rebased on top of said given commit.

To test this, let's kill two birds with one stone and add a test case to t3427-rebase-subtree.sh that not only demonstrates that this works, but also that `git rebase -r` works with merge strategies now.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/rebase.c          |  7 +++++--
 sequencer.c               |  4 +++-
 sequencer.h               |  6 ++++++
 t/t3427-rebase-subtree.sh | 11 +++++++++++
 4 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/builtin/rebase.c b/builtin/rebase.c
index c1ea617125..6a789c4421 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -62,7 +62,7 @@ struct rebase_options {
 	const char *onto_name;
 	const char *revisions;
 	const char *switch_to;
-	int root;
+	int root, root_with_onto;
 	struct object_id *squash_onto;
 	struct commit *restrict_revision;
 	int dont_finish_rebase;
@@ -374,6 +374,7 @@ static int run_rebase_interactive(struct rebase_options *opts,
 	flags |= abbreviate_commands ? TODO_LIST_ABBREVIATE_CMDS : 0;
 	flags |= opts->rebase_merges ? TODO_LIST_REBASE_MERGES : 0;
 	flags |= opts->rebase_cousins > 0 ? TODO_LIST_REBASE_COUSINS : 0;
+	flags |= opts->root_with_onto ? TODO_LIST_ROOT_WITH_ONTO : 0;
 	flags |= command == ACTION_SHORTEN_OIDS ? TODO_LIST_SHORTEN_IDS : 0;
 
 	switch (command) {
@@ -1845,7 +1846,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 			options.squash_onto = &squash_onto;
 			options.onto_name = squash_onto_name =
 				xstrdup(oid_to_hex(&squash_onto));
-		}
+		} else
+			options.root_with_onto = 1;
+
 		options.upstream_name = NULL;
 		options.upstream = NULL;
 		if (argc > 1)
diff --git a/sequencer.c b/sequencer.c
index d228448cd8..ca119c84e5 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -4440,6 +4440,7 @@ static int make_script_with_merges(struct pretty_print_context *pp,
 {
 	int keep_empty = flags & TODO_LIST_KEEP_EMPTY;
 	int rebase_cousins = flags & TODO_LIST_REBASE_COUSINS;
+	int root_with_onto = flags & TODO_LIST_ROOT_WITH_ONTO;
 	struct strbuf buf = STRBUF_INIT, oneline = STRBUF_INIT;
 	struct strbuf label = STRBUF_INIT;
 	struct commit_list *commits = NULL, **tail = &commits, *iter;
@@ -4606,7 +4607,8 @@ static int make_script_with_merges(struct pretty_print_context *pp,
 
 		if (!commit)
 			strbuf_addf(out, "%s %s\n", cmd_reset,
-				    rebase_cousins ? "onto" : "[new root]");
+				    rebase_cousins || root_with_onto ?
+				    "onto" : "[new root]");
 		else {
 			const char *to = NULL;
 
diff --git a/sequencer.h b/sequencer.h
index 0c494b83d4..d506081d3c 100644
--- a/sequencer.h
+++ b/sequencer.h
@@ -142,6 +142,12 @@ int sequencer_remove_state(struct replay_opts *opts);
  */
 #define TODO_LIST_REBASE_COUSINS (1U << 4)
 #define TODO_LIST_APPEND_TODO_HELP (1U << 5)
+/*
+ * When generating a script that rebases merges with `--root` *and* with
+ * `--onto`, we do not want to re-generate the root commits.
+ */
+#define TODO_LIST_ROOT_WITH_ONTO (1U << 6)
+
 
 int sequencer_make_script(struct repository *r, struct strbuf *out, int argc,
 			  const char **argv, unsigned flags);
diff --git a/t/t3427-rebase-subtree.sh b/t/t3427-rebase-subtree.sh
index 7a37235768..39e348de16 100755
--- a/t/t3427-rebase-subtree.sh
+++ b/t/t3427-rebase-subtree.sh
@@ -93,4 +93,15 @@ test_expect_success 'Rebase -Xsubtree --keep-empty --onto commit' '
 	verbose test "$(commit_message HEAD)" = "Empty commit"
 '
 
+test_expect_success 'Rebase -Xsubtree --keep-empty --rebase-merges --onto commit' '
+	reset_rebase &&
+	git checkout -b rebase-merges-onto to-rebase &&
+	test_must_fail git rebase -Xsubtree=files_subtree --keep-empty --rebase-merges --onto files-master --root &&
+	: first pick results in no changes &&
+	git rebase --continue &&
+	verbose test "$(commit_message HEAD~2)" = "master4" &&
+	verbose test "$(commit_message HEAD~)" = "files_subtree/master5" &&
+	verbose test "$(commit_message HEAD)" = "Empty commit"
+'
+
 test_done
-- 
gitgitgadget
Previous: Johannes SchindelinNext: Johannes Schindelin via GitGitGadget
Message 14 of 39 in “rebase -r: support merge strategies other than recursive”
  1. 00/12 rebase -r: support merge strategies other than recursiveJohannes Schindelin via GitGitGadget, Jul 25, 2019
  2. 02/12 t3427: simplify the `setup` test case significantlyJohannes Schindelin via GitGitGadget, Jul 25, 2019
  3. 01/12 t3427: add a clarifying commentJohannes Schindelin via GitGitGadget, Jul 25, 2019
  4. 04/12 t3427: condense the unnecessarily repetitive test cases into threeJohannes Schindelin via GitGitGadget, Jul 25, 2019
  5. 05/12 t3427: fix erroneous assumptionJohannes Schindelin via GitGitGadget, Jul 25, 2019
  6. 07/12 t3427: fix another incorrect assumptionJohannes Schindelin via GitGitGadget, Jul 25, 2019
  7. 03/12 t3427: move the `filter-branch` invocation into the `setup` caseJohannes Schindelin via GitGitGadget, Jul 25, 2019
  8. 09/12 rebase -r: support merge strategies other than `recursive`Johannes Schindelin via GitGitGadget, Jul 25, 2019
  9. 10/12 t/lib-rebase: prepare for testing `git rebase --rebase-merges`Johannes Schindelin via GitGitGadget, Jul 25, 2019
  10. brian m. carlsonJul 26, 2019
  11. Johannes SchindelinJul 26, 2019
  12. brian m. carlsonJul 26, 2019
  13. Johannes SchindelinJul 31, 2019
  14. 12/12 rebase -r: do not (re-)generate root commits with `--root` *and* `--onto`Johannes Schindelin via GitGitGadget, Jul 25, 2019
  15. 08/12 t3427: mark two test cases as requiring support for `git rebase -p`Johannes Schindelin via GitGitGadget, Jul 25, 2019
  16. 11/12 t3418: test `rebase -r` with merge strategiesJohannes Schindelin via GitGitGadget, Jul 25, 2019
  17. 06/12 t3427: accommodate for the `rebase --merge` backend having been replacedJohannes Schindelin via GitGitGadget, Jul 25, 2019
  18. Junio C HamanoJul 25, 2019
  19. brian m. carlsonJul 26, 2019
  20. 00/16 rebase -r: support merge strategies other than recursiveJohannes Schindelin via GitGitGadget, Jul 31, 2019
  21. 02/16 t3400: stop referring to the scripted rebaseJohannes Schindelin via GitGitGadget, Jul 31, 2019
  22. 03/16 .gitignore: there is no longer a built-in `git-rebase--interactive`Johannes Schindelin via GitGitGadget, Jul 31, 2019
  23. 06/16 t3427: add a clarifying commentJohannes Schindelin via GitGitGadget, Jul 31, 2019
  24. 04/16 sequencer: the `am` and `rebase--interactive` scripts are goneJohannes Schindelin via GitGitGadget, Jul 31, 2019
  25. 05/16 rebase: fold git-rebase--common into the -p backendJohannes Schindelin via GitGitGadget, Jul 31, 2019
  26. 08/16 t3427: move the `filter-branch` invocation into the `setup` caseJohannes Schindelin via GitGitGadget, Jul 31, 2019
  27. 01/16 Drop unused git-rebase--am.shJohannes Schindelin via GitGitGadget, Jul 31, 2019
  28. 16/16 rebase -r: do not (re-)generate root commits with `--root` *and* `--onto`Johannes Schindelin via GitGitGadget, Jul 31, 2019
  29. 14/16 t/lib-rebase: prepare for testing `git rebase --rebase-merges`Johannes Schindelin via GitGitGadget, Jul 31, 2019
  30. 15/16 t3418: test `rebase -r` with merge strategiesJohannes Schindelin via GitGitGadget, Jul 31, 2019
  31. 13/16 rebase -r: support merge strategies other than `recursive`Johannes Schindelin via GitGitGadget, Jul 31, 2019
  32. 09/16 t3427: condense the unnecessarily repetitive test cases into threeJohannes Schindelin via GitGitGadget, Jul 31, 2019
  33. 12/16 t3427: fix another incorrect assumptionJohannes Schindelin via GitGitGadget, Jul 31, 2019
  34. 10/16 t3427: fix erroneous assumptionJohannes Schindelin via GitGitGadget, Jul 31, 2019
  35. 11/16 t3427: accommodate for the `rebase --merge` backend having been replacedJohannes Schindelin via GitGitGadget, Jul 31, 2019
  36. 07/16 t3427: simplify the `setup` test case significantlyJohannes Schindelin via GitGitGadget, Jul 31, 2019
  37. 17/16 t3427: accelerate this test by using fast-export and fast-importElijah Newren, Sep 4, 2019
  38. Johannes SchindelinSep 9, 2019
  39. Junio C HamanoSep 9, 2019

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.