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

[PATCH v2 01/18] builtin rebase: allow selecting the rebase "backend"

From
Pratik Karki via GitGitGadget <gitgitgadget@gmail.com>
Date
Sep 4, 2018, 21:59 UTC
Message-ID
<7f751c6ce106e1ca7c4fb63ae8db5ffe339e7404.1536098386.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.33.v2.git.gitgitgadget@gmail.com>
From: Pratik Karki <predatoramigo@gmail.com>

With this commit the builtin rebase supports selecting the "rebase backends" (or "type") `interactive`, `preserve-merges`, and `merge`.

The `state_dir` was already handled according to the rebase type in a previous commit.

Note that there is one quirk in the shell script: `--interactive` followed by `--merge` won't reset the type to "merge" but keeps the type as "interactive". And as t3418 tests this explicitly, we have to support it in the builtin rebase, too.

Likewise, `--interactive` followed by `--preserve-merges` makes it an "explicitly interactive" rebase, i.e. a rebase that should show the todo list, while `--preserve-merges` alone is not interactive (and t5520 tests for this via `git pull --rebase=preserve`).

Signed-off-by: Pratik Karki <predatoramigo@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/rebase.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)
diff --git a/builtin/rebase.c b/builtin/rebase.c
index 75c4ac66e0..fc9b5a8a60 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -452,6 +452,29 @@ static int can_fast_forward(struct commit *onto, struct object_id *head_oid,
 	return res && is_linear_history(onto, head);
 }
 
+/* -i followed by -m is still -i */
+static int parse_opt_merge(const struct option *opt, const char *arg, int unset)
+{
+	struct rebase_options *opts = opt->value;
+
+	if (!is_interactive(opts))
+		opts->type = REBASE_MERGE;
+
+	return 0;
+}
+
+/* -i followed by -p is still explicitly interactive, but -p alone is not */
+static int parse_opt_interactive(const struct option *opt, const char *arg,
+				 int unset)
+{
+	struct rebase_options *opts = opt->value;
+
+	opts->type = REBASE_INTERACTIVE;
+	opts->flags |= REBASE_INTERACTIVE_EXPLICIT;
+
+	return 0;
+}
+
 int cmd_rebase(int argc, const char **argv, const char *prefix)
 {
 	struct rebase_options options = {
@@ -510,6 +533,17 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		OPT_CMDMODE(0, "show-current-patch", &action,
 			    N_("show the patch file being applied or merged"),
 			    ACTION_SHOW_CURRENT_PATCH),
+		{ OPTION_CALLBACK, 'm', "merge", &options, NULL,
+			N_("use merging strategies to rebase"),
+			PARSE_OPT_NOARG | PARSE_OPT_NONEG,
+			parse_opt_merge },
+		{ OPTION_CALLBACK, 'i', "interactive", &options, NULL,
+			N_("let the user edit the list of commits to rebase"),
+			PARSE_OPT_NOARG | PARSE_OPT_NONEG,
+			parse_opt_interactive },
+		OPT_SET_INT('p', "preserve-merges", &options.type,
+			    N_("try to recreate merges instead of ignoring "
+			       "them"), REBASE_PRESERVE_MERGES),
 		OPT_END(),
 	};
 
@@ -884,6 +918,9 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 		diff_flush(&opts);
 	}
 
+	if (is_interactive(&options))
+		goto run_rebase;
+
 	/* Detach HEAD and reset the tree */
 	if (options.flags & REBASE_NO_QUIET)
 		printf(_("First, rewinding head to replay your work on top of "
-- 
gitgitgadget
Previous: Johannes Schindelin via GitGitGadgetNext: Pratik Karki via GitGitGadget
Message 24 of 44 in “builtin rebase options”
  1. Pratik KarkiAug 8, 2018
  2. 01/18 builtin rebase: allow selecting the rebase "backend"Pratik Karki, Aug 8, 2018
  3. 02/18 builtin rebase: support --signoffPratik Karki, Aug 8, 2018
  4. 03/18 builtin rebase: support --rerere-autoupdatePratik Karki, Aug 8, 2018
  5. 04/18 builtin rebase: support --committer-date-is-author-datePratik Karki, Aug 8, 2018
  6. 05/18 builtin rebase: support `ignore-whitespace` optionPratik Karki, Aug 8, 2018
  7. 06/18 builtin rebase: support `ignore-date` optionPratik Karki, Aug 8, 2018
  8. 07/18 builtin rebase: support `keep-empty` optionPratik Karki, Aug 8, 2018
  9. Johannes SchindelinAug 24, 2018
  10. 08/18 builtin rebase: support `--autosquash`Pratik Karki, Aug 8, 2018
  11. 09/18 builtin rebase: support `--gpg-sign` optionPratik Karki, Aug 8, 2018
  12. 10/18 builtin rebase: support `-C` and `--whitespace=<type>`Pratik Karki, Aug 8, 2018
  13. 11/18 builtin rebase: support `--autostash` optionPratik Karki, Aug 8, 2018
  14. Duy NguyenAug 18, 2018
  15. Johannes SchindelinAug 24, 2018
  16. 12/18 builtin rebase: support `--exec`Pratik Karki, Aug 8, 2018
  17. 13/18 builtin rebase: support `--allow-empty-message` optionPratik Karki, Aug 8, 2018
  18. 14/18 builtin rebase: support --rebase-merges[=[no-]rebase-cousins]Pratik Karki, Aug 8, 2018
  19. 15/18 merge-base --fork-point: extract libified functionPratik Karki, Aug 8, 2018
  20. 16/18 builtin rebase: support `fork-point` optionPratik Karki, Aug 8, 2018
  21. 17/18 builtin rebase: add support for custom merge strategiesPratik Karki, Aug 8, 2018
  22. 18/18 builtin rebase: support --rootPratik Karki, Aug 8, 2018
  23. 00/18 builtin rebase optionsJohannes Schindelin via GitGitGadget, Sep 4, 2018
  24. 01/18 builtin rebase: allow selecting the rebase "backend"Pratik Karki via GitGitGadget, Sep 4, 2018
  25. 02/18 builtin rebase: support --signoffPratik Karki via GitGitGadget, Sep 4, 2018
  26. 03/18 builtin rebase: support --rerere-autoupdatePratik Karki via GitGitGadget, Sep 4, 2018
  27. 04/18 builtin rebase: support --committer-date-is-author-datePratik Karki via GitGitGadget, Sep 4, 2018
  28. 05/18 builtin rebase: support `ignore-whitespace` optionPratik Karki via GitGitGadget, Sep 4, 2018
  29. 06/18 builtin rebase: support `ignore-date` optionPratik Karki via GitGitGadget, Sep 4, 2018
  30. 07/18 builtin rebase: support `keep-empty` optionPratik Karki via GitGitGadget, Sep 4, 2018
  31. 08/18 builtin rebase: support `--autosquash`Pratik Karki via GitGitGadget, Sep 4, 2018
  32. 09/18 builtin rebase: support `--gpg-sign` optionPratik Karki via GitGitGadget, Sep 4, 2018
  33. 11/18 builtin rebase: support `--autostash` optionPratik Karki via GitGitGadget, Sep 4, 2018
  34. 10/18 builtin rebase: support `-C` and `--whitespace=<type>`Pratik Karki via GitGitGadget, Sep 4, 2018
  35. 12/18 builtin rebase: support `--exec`Pratik Karki via GitGitGadget, Sep 4, 2018
  36. 13/18 builtin rebase: support `--allow-empty-message` optionPratik Karki via GitGitGadget, Sep 4, 2018
  37. 14/18 builtin rebase: support --rebase-merges[=[no-]rebase-cousins]Pratik Karki via GitGitGadget, Sep 4, 2018
  38. 15/18 merge-base --fork-point: extract libified functionPratik Karki via GitGitGadget, Sep 4, 2018
  39. 16/18 builtin rebase: support `fork-point` optionPratik Karki via GitGitGadget, Sep 4, 2018
  40. 17/18 builtin rebase: add support for custom merge strategiesPratik Karki via GitGitGadget, Sep 4, 2018
  41. 18/18 builtin rebase: support --rootPratik Karki via GitGitGadget, Sep 4, 2018
  42. Junio C HamanoSep 6, 2018
  43. Junio C HamanoSep 6, 2018
  44. Johannes SchindelinOct 12, 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.