{"thread":{"id":"43980","subject":"[PATCH 0/2] Let the sequencer handle the grunt work of rebase -i","startedAt":"2016-09-02T08:36:16Z","lastAt":"2017-02-09T22:40:43Z","messageCount":7,"participants":["Johannes Schindelin","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"300870","messageId":"cover.1472805251.git.johannes.schindelin@gmx.de","threadId":"43980","inReplyTo":null,"subject":"[PATCH 0/2] Let the sequencer handle the grunt work of rebase -i","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2016-09-02T08:34:25Z","receivedAt":"2016-09-02T08:36:16Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"After all of these patch series y'all had to review, this is finally the\none that switches things over.\n\nPlease note that it does not (yet) handle the `git rebase -i --root`\ninvocation; I tried to focus on the common case, and I rarely use --root\nmyself.\n\nPlease note also that --preserve-merges is *not* handled.\n\nThe way I designed --preserve-merges is totally stupid and idiotic and I\ndo not want to spend any further time on it. You cannot \"pick\" merges\nand hope to be able to reorder commits, for example.\n\nAnd please finally note that this pair of patches does not yet yield the\nfull speed improvement that I promised earlier. After these patches, the\ntime is dominated by pre- and post-processing the todo script, at least\non Windows, so there is another patch series that ports those bits and\npieces into the rebase--helper, too.\n\n\nJohannes Schindelin (2):\n  Add a builtin helper for interactive rebases\n  rebase -i: use the rebase--helper builtin\n\n .gitignore                 |  1 +\n Makefile                   |  1 +\n builtin.h                  |  1 +\n builtin/rebase--helper.c   | 40 ++++++++++++++++++++++++++++++++++++++++\n git-rebase--interactive.sh | 13 +++++++++++++\n git.c                      |  1 +\n 6 files changed, 57 insertions(+)\n create mode 100644 builtin/rebase--helper.c\n\nBased-On: sequencer-i at https://github.com/dscho/git\nFetch-Base-Via: git fetch https://github.com/dscho/git sequencer-i\nPublished-As: https://github.com/dscho/git/releases/tag/rebase--helper-v1\nFetch-It-Via: git fetch https://github.com/dscho/git rebase--helper-v1\n\n-- \n2.9.3.windows.3\n\nbase-commit: bbec81903b5e46c481fdc0cfe6f10166423526f1\n"},{"id":"300871","messageId":"5a174968fa6410acc2f7987f3cb526d8d1ce6082.1472805251.git.johannes.schindelin@gmx.de","threadId":"43980","inReplyTo":"cover.1472805251.git.johannes.schindelin@gmx.de","subject":"[PATCH 2/2] rebase -i: use the rebase--helper builtin","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2016-09-02T08:34:34Z","receivedAt":"2016-09-02T08:36:20Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Now that the sequencer learned to process a \"normal\" interactive rebase,\nwe use it. The original shell script is still used for \"non-normal\"\ninteractive rebases, i.e. when --root or --preserve-merges was passed.\n\nPlease note that the --root option (via the $squash_onto variable) needs\nspecial handling only for the very first command, hence it is still okay\nto use the helper upon continue/skip.\n\nAlso please note that the --no-ff setting is volatile, i.e. when the\ninteractive rebase is interrupted at any stage, there is no record of\nit. Therefore, we have to pass it from the shell script to the\nrebase--helper.\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n git-rebase--interactive.sh | 13 +++++++++++++\n 1 file changed, 13 insertions(+)\n\ndiff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh\nindex 7e558b0..022766b 100644\n--- a/git-rebase--interactive.sh\n+++ b/git-rebase--interactive.sh\n@@ -1059,6 +1059,10 @@ git_rebase__interactive () {\n \n case \"$action\" in\n continue)\n+\tif test ! -d \"$rewritten\"\n+\tthen\n+\t\texec git rebase--helper ${force_rebase:+--no-ff} --continue\n+\tfi\n \t# do we have anything to commit?\n \tif git diff-index --cached --quiet HEAD --\n \tthen\n@@ -1118,6 +1122,10 @@ first and then run 'git rebase --continue' again.\")\"\n skip)\n \tgit rerere clear\n \n+\tif test ! -d \"$rewritten\"\n+\tthen\n+\t\texec git rebase--helper ${force_rebase:+--no-ff} --continue\n+\tfi\n \tdo_rest\n \treturn 0\n \t;;\n@@ -1307,6 +1315,11 @@ expand_todo_ids\n test -d \"$rewritten\" || test -n \"$force_rebase\" || skip_unnecessary_picks\n \n checkout_onto\n+if test -z \"$rebase_root\" && test ! -d \"$rewritten\"\n+then\n+\trequire_clean_work_tree \"rebase\"\n+\texec git rebase--helper ${force_rebase:+--no-ff} --continue\n+fi\n do_rest\n \n }\n-- \n2.9.3.windows.3\n"},{"id":"300872","messageId":"501540c2c1cba7ad0f22d00825a2fd4b71c0b417.1472805251.git.johannes.schindelin@gmx.de","threadId":"43980","inReplyTo":"cover.1472805251.git.johannes.schindelin@gmx.de","subject":"[PATCH 1/2] Add a builtin helper for interactive rebases","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2016-09-02T08:34:31Z","receivedAt":"2016-09-02T08:36:26Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Git's interactive rebase is still implemented as a shell script, despite\nits complexity. This implies that it suffers from the portability point\nof view, from lack of expressibility, and of course also from\nperformance. The latter issue is particularly serious on Windows, where\nwe pay a hefty price for relying so much on POSIX.\n\nUnfortunately, being such a huge shell script also means that we missed\nthe train when it would have been relatively easy to port it to C, and\ninstead piled feature upon feature onto that poor script that originally\nnever intended to be more than a slightly pimped cherry-pick in a loop.\n\nTo open the road toward better performance (in addition to all the other\nbenefits of C over shell scripts), let's just start *somewhere*.\n\nThe approach taken here is to add a builtin helper that at first intends\nto take care of the parts of the interactive rebase that are most\naffected by the performance penalties mentioned above.\n\nIn particular, after we spent all those efforts on preparing the sequencer\nto process rebase -i's git-rebase-todo scripts, we implement the `git\nrebase -i --continue` functionality as a new builtin, git-rebase--helper.\n\nOnce that is in place, we can work gradually on tackling the rest of the\ntechnical debt.\n\nNote that the rebase--helper needs to learn about the transient\n--ff/--no-ff options of git-rebase, as the corresponding flag is not\npersisted to, and re-read from, the state directory.\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n .gitignore               |  1 +\n Makefile                 |  1 +\n builtin.h                |  1 +\n builtin/rebase--helper.c | 40 ++++++++++++++++++++++++++++++++++++++++\n git.c                    |  1 +\n 5 files changed, 44 insertions(+)\n create mode 100644 builtin/rebase--helper.c\n\ndiff --git a/.gitignore b/.gitignore\nindex 05cb58a..a9b8c96 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -114,6 +114,7 @@\n /git-read-tree\n /git-rebase\n /git-rebase--am\n+/git-rebase--helper\n /git-rebase--interactive\n /git-rebase--merge\n /git-receive-pack\ndiff --git a/Makefile b/Makefile\nindex d96ecb7..980e1dc 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -919,6 +919,7 @@ BUILTIN_OBJS += builtin/prune.o\n BUILTIN_OBJS += builtin/pull.o\n BUILTIN_OBJS += builtin/push.o\n BUILTIN_OBJS += builtin/read-tree.o\n+BUILTIN_OBJS += builtin/rebase--helper.o\n BUILTIN_OBJS += builtin/receive-pack.o\n BUILTIN_OBJS += builtin/reflog.o\n BUILTIN_OBJS += builtin/remote.o\ndiff --git a/builtin.h b/builtin.h\nindex 6b95006..2e5de14 100644\n--- a/builtin.h\n+++ b/builtin.h\n@@ -102,6 +102,7 @@ extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);\n extern int cmd_pull(int argc, const char **argv, const char *prefix);\n extern int cmd_push(int argc, const char **argv, const char *prefix);\n extern int cmd_read_tree(int argc, const char **argv, const char *prefix);\n+extern int cmd_rebase__helper(int argc, const char **argv, const char *prefix);\n extern int cmd_receive_pack(int argc, const char **argv, const char *prefix);\n extern int cmd_reflog(int argc, const char **argv, const char *prefix);\n extern int cmd_remote(int argc, const char **argv, const char *prefix);\ndiff --git a/builtin/rebase--helper.c b/builtin/rebase--helper.c\nnew file mode 100644\nindex 0000000..ca1ebb2\n--- /dev/null\n+++ b/builtin/rebase--helper.c\n@@ -0,0 +1,40 @@\n+#include \"builtin.h\"\n+#include \"cache.h\"\n+#include \"parse-options.h\"\n+#include \"sequencer.h\"\n+\n+static const char * const builtin_rebase_helper_usage[] = {\n+\tN_(\"git rebase--helper [<options>]\"),\n+\tNULL\n+};\n+\n+int cmd_rebase__helper(int argc, const char **argv, const char *prefix)\n+{\n+\tstruct replay_opts opts = REPLAY_OPTS_INIT;\n+\tenum {\n+\t\tCONTINUE = 1, ABORT\n+\t} command = 0;\n+\tstruct option options[] = {\n+\t\tOPT_BOOL(0, \"ff\", &opts.allow_ff, N_(\"allow fast-forward\")),\n+\t\tOPT_CMDMODE(0, \"continue\", &command, N_(\"continue rebase\"),\n+\t\t\t\tCONTINUE),\n+\t\tOPT_CMDMODE(0, \"abort\", &command, N_(\"abort rebase\"),\n+\t\t\t\tABORT),\n+\t\tOPT_END()\n+\t};\n+\n+\tgit_config(git_default_config, NULL);\n+\n+\topts.action = REPLAY_INTERACTIVE_REBASE;\n+\topts.allow_ff = 1;\n+\topts.allow_empty = 1;\n+\n+\targc = parse_options(argc, argv, NULL, options,\n+\t\t\tbuiltin_rebase_helper_usage, PARSE_OPT_KEEP_ARGV0);\n+\n+\tif (command == CONTINUE && argc == 1)\n+\t\treturn !!sequencer_continue(&opts);\n+\tif (command == ABORT && argc == 1)\n+\t\treturn !!sequencer_remove_state(&opts);\n+\tusage_with_options(builtin_rebase_helper_usage, options);\n+}\ndiff --git a/git.c b/git.c\nindex 0f1937f..26b4ad3 100644\n--- a/git.c\n+++ b/git.c\n@@ -451,6 +451,7 @@ static struct cmd_struct commands[] = {\n \t{ \"pull\", cmd_pull, RUN_SETUP | NEED_WORK_TREE },\n \t{ \"push\", cmd_push, RUN_SETUP },\n \t{ \"read-tree\", cmd_read_tree, RUN_SETUP },\n+\t{ \"rebase--helper\", cmd_rebase__helper, RUN_SETUP | NEED_WORK_TREE },\n \t{ \"receive-pack\", cmd_receive_pack },\n \t{ \"reflog\", cmd_reflog, RUN_SETUP },\n \t{ \"remote\", cmd_remote, RUN_SETUP },\n-- \n2.9.3.windows.3\n\n\n"},{"id":"311229","messageId":"384482cff8b2ffca7a29919e621f277a0eaea3c1.1486678952.git.johannes.schindelin@gmx.de","threadId":"43980","inReplyTo":"cover.1486678952.git.johannes.schindelin@gmx.de","subject":"[PATCH v2 2/2] rebase -i: use the rebase--helper builtin","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2017-02-09T22:23:11Z","receivedAt":"2017-02-09T22:25:31Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Now that the sequencer learned to process a \"normal\" interactive rebase,\nwe use it. The original shell script is still used for \"non-normal\"\ninteractive rebases, i.e. when --root or --preserve-merges was passed.\n\nPlease note that the --root option (via the $squash_onto variable) needs\nspecial handling only for the very first command, hence it is still okay\nto use the helper upon continue/skip.\n\nAlso please note that the --no-ff setting is volatile, i.e. when the\ninteractive rebase is interrupted at any stage, there is no record of\nit. Therefore, we have to pass it from the shell script to the\nrebase--helper.\n\nNote: the test t3404 had to be adjusted because the the error messages\nproduced by the sequencer comply with our current convention to start with\na lower-case letter.\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n git-rebase--interactive.sh    | 13 +++++++++++++\n t/t3404-rebase-interactive.sh |  2 +-\n 2 files changed, 14 insertions(+), 1 deletion(-)\n\ndiff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh\nindex 4734094a3f..2c9c0165b5 100644\n--- a/git-rebase--interactive.sh\n+++ b/git-rebase--interactive.sh\n@@ -1069,6 +1069,10 @@ git_rebase__interactive () {\n \n case \"$action\" in\n continue)\n+\tif test ! -d \"$rewritten\"\n+\tthen\n+\t\texec git rebase--helper ${force_rebase:+--no-ff} --continue\n+\tfi\n \t# do we have anything to commit?\n \tif git diff-index --cached --quiet HEAD --\n \tthen\n@@ -1128,6 +1132,10 @@ first and then run 'git rebase --continue' again.\")\"\n skip)\n \tgit rerere clear\n \n+\tif test ! -d \"$rewritten\"\n+\tthen\n+\t\texec git rebase--helper ${force_rebase:+--no-ff} --continue\n+\tfi\n \tdo_rest\n \treturn 0\n \t;;\n@@ -1314,6 +1322,11 @@ expand_todo_ids\n test -d \"$rewritten\" || test -n \"$force_rebase\" || skip_unnecessary_picks\n \n checkout_onto\n+if test -z \"$rebase_root\" && test ! -d \"$rewritten\"\n+then\n+\trequire_clean_work_tree \"rebase\"\n+\texec git rebase--helper ${force_rebase:+--no-ff} --continue\n+fi\n do_rest\n \n }\ndiff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\nindex e2f18d11f6..33d392ba11 100755\n--- a/t/t3404-rebase-interactive.sh\n+++ b/t/t3404-rebase-interactive.sh\n@@ -556,7 +556,7 @@ test_expect_success 'clean error after failed \"exec\"' '\n \techo \"edited again\" > file7 &&\n \tgit add file7 &&\n \ttest_must_fail git rebase --continue 2>error &&\n-\ttest_i18ngrep \"You have staged changes in your working tree.\" error\n+\ttest_i18ngrep \"you have staged changes in your working tree\" error\n '\n \n test_expect_success 'rebase a detached HEAD' '\n-- \n2.11.1.windows.1\n"},{"id":"311230","messageId":"1a0763311c382640cce182da81b40c9563e783b1.1486678952.git.johannes.schindelin@gmx.de","threadId":"43980","inReplyTo":"cover.1486678952.git.johannes.schindelin@gmx.de","subject":"[PATCH v2 1/2] Add a builtin helper for interactive rebases","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2017-02-09T22:23:06Z","receivedAt":"2017-02-09T22:25:35Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Git's interactive rebase is still implemented as a shell script, despite\nits complexity. This implies that it suffers from the portability point\nof view, from lack of expressibility, and of course also from\nperformance. The latter issue is particularly serious on Windows, where\nwe pay a hefty price for relying so much on POSIX.\n\nUnfortunately, being such a huge shell script also means that we missed\nthe train when it would have been relatively easy to port it to C, and\ninstead piled feature upon feature onto that poor script that originally\nnever intended to be more than a slightly pimped cherry-pick in a loop.\n\nTo open the road toward better performance (in addition to all the other\nbenefits of C over shell scripts), let's just start *somewhere*.\n\nThe approach taken here is to add a builtin helper that at first intends\nto take care of the parts of the interactive rebase that are most\naffected by the performance penalties mentioned above.\n\nIn particular, after we spent all those efforts on preparing the sequencer\nto process rebase -i's git-rebase-todo scripts, we implement the `git\nrebase -i --continue` functionality as a new builtin, git-rebase--helper.\n\nOnce that is in place, we can work gradually on tackling the rest of the\ntechnical debt.\n\nNote that the rebase--helper needs to learn about the transient\n--ff/--no-ff options of git-rebase, as the corresponding flag is not\npersisted to, and re-read from, the state directory.\n\nSigned-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>\n---\n .gitignore               |  1 +\n Makefile                 |  1 +\n builtin.h                |  1 +\n builtin/rebase--helper.c | 40 ++++++++++++++++++++++++++++++++++++++++\n git.c                    |  1 +\n 5 files changed, 44 insertions(+)\n create mode 100644 builtin/rebase--helper.c\n\ndiff --git a/.gitignore b/.gitignore\nindex b1020b875f..833ef3b0b7 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -114,6 +114,7 @@\n /git-read-tree\n /git-rebase\n /git-rebase--am\n+/git-rebase--helper\n /git-rebase--interactive\n /git-rebase--merge\n /git-receive-pack\ndiff --git a/Makefile b/Makefile\nindex 8e4081e061..29f8663509 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -932,6 +932,7 @@ BUILTIN_OBJS += builtin/prune.o\n BUILTIN_OBJS += builtin/pull.o\n BUILTIN_OBJS += builtin/push.o\n BUILTIN_OBJS += builtin/read-tree.o\n+BUILTIN_OBJS += builtin/rebase--helper.o\n BUILTIN_OBJS += builtin/receive-pack.o\n BUILTIN_OBJS += builtin/reflog.o\n BUILTIN_OBJS += builtin/remote.o\ndiff --git a/builtin.h b/builtin.h\nindex 67f80519da..9e4a89816d 100644\n--- a/builtin.h\n+++ b/builtin.h\n@@ -103,6 +103,7 @@ extern int cmd_prune_packed(int argc, const char **argv, const char *prefix);\n extern int cmd_pull(int argc, const char **argv, const char *prefix);\n extern int cmd_push(int argc, const char **argv, const char *prefix);\n extern int cmd_read_tree(int argc, const char **argv, const char *prefix);\n+extern int cmd_rebase__helper(int argc, const char **argv, const char *prefix);\n extern int cmd_receive_pack(int argc, const char **argv, const char *prefix);\n extern int cmd_reflog(int argc, const char **argv, const char *prefix);\n extern int cmd_remote(int argc, const char **argv, const char *prefix);\ndiff --git a/builtin/rebase--helper.c b/builtin/rebase--helper.c\nnew file mode 100644\nindex 0000000000..ca1ebb2fa1\n--- /dev/null\n+++ b/builtin/rebase--helper.c\n@@ -0,0 +1,40 @@\n+#include \"builtin.h\"\n+#include \"cache.h\"\n+#include \"parse-options.h\"\n+#include \"sequencer.h\"\n+\n+static const char * const builtin_rebase_helper_usage[] = {\n+\tN_(\"git rebase--helper [<options>]\"),\n+\tNULL\n+};\n+\n+int cmd_rebase__helper(int argc, const char **argv, const char *prefix)\n+{\n+\tstruct replay_opts opts = REPLAY_OPTS_INIT;\n+\tenum {\n+\t\tCONTINUE = 1, ABORT\n+\t} command = 0;\n+\tstruct option options[] = {\n+\t\tOPT_BOOL(0, \"ff\", &opts.allow_ff, N_(\"allow fast-forward\")),\n+\t\tOPT_CMDMODE(0, \"continue\", &command, N_(\"continue rebase\"),\n+\t\t\t\tCONTINUE),\n+\t\tOPT_CMDMODE(0, \"abort\", &command, N_(\"abort rebase\"),\n+\t\t\t\tABORT),\n+\t\tOPT_END()\n+\t};\n+\n+\tgit_config(git_default_config, NULL);\n+\n+\topts.action = REPLAY_INTERACTIVE_REBASE;\n+\topts.allow_ff = 1;\n+\topts.allow_empty = 1;\n+\n+\targc = parse_options(argc, argv, NULL, options,\n+\t\t\tbuiltin_rebase_helper_usage, PARSE_OPT_KEEP_ARGV0);\n+\n+\tif (command == CONTINUE && argc == 1)\n+\t\treturn !!sequencer_continue(&opts);\n+\tif (command == ABORT && argc == 1)\n+\t\treturn !!sequencer_remove_state(&opts);\n+\tusage_with_options(builtin_rebase_helper_usage, options);\n+}\ndiff --git a/git.c b/git.c\nindex c887272b12..33f52acbcc 100644\n--- a/git.c\n+++ b/git.c\n@@ -473,6 +473,7 @@ static struct cmd_struct commands[] = {\n \t{ \"pull\", cmd_pull, RUN_SETUP | NEED_WORK_TREE },\n \t{ \"push\", cmd_push, RUN_SETUP },\n \t{ \"read-tree\", cmd_read_tree, RUN_SETUP | SUPPORT_SUPER_PREFIX},\n+\t{ \"rebase--helper\", cmd_rebase__helper, RUN_SETUP | NEED_WORK_TREE },\n \t{ \"receive-pack\", cmd_receive_pack },\n \t{ \"reflog\", cmd_reflog, RUN_SETUP },\n \t{ \"remote\", cmd_remote, RUN_SETUP },\n-- \n2.11.1.windows.1\n\n\n"},{"id":"311231","messageId":"cover.1486678952.git.johannes.schindelin@gmx.de","threadId":"43980","inReplyTo":"cover.1472805251.git.johannes.schindelin@gmx.de","subject":"[PATCH v2 0/2] Let the sequencer handle the grunt work of rebase -i","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2017-02-09T22:22:59Z","receivedAt":"2017-02-09T22:25:46Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"After all of these patch series y'all had to review, this is finally the\none that switches things over.\n\nPlease note that it does not (yet) handle the `git rebase -i --root`\ninvocation; I tried to focus on the common case, and I rarely use --root\nmyself.\n\nPlease note also that --preserve-merges is *not* handled.\n\nThe way I designed --preserve-merges is totally stupid and idiotic and I\ndo not want to spend any further time on it. You cannot \"pick\" merges\nand hope to be able to reorder commits, for example. I may work on\nporting Git garden shears' way to recreate the branch structure into\nrebase -i proper at some stage.\n\nAnd please finally note that this pair of patches does not yet yield the\nfull speed improvement that I promised earlier. After these patches, the\ntime is dominated by pre- and post-processing the todo script, at least\non Windows, so there is another patch series that ports those bits and\npieces into the rebase--helper, too.\n\nChanges since v1:\n\n- rebased to current master\n\n- this required a change in t3404 because I was bullied^Wasked to change\n  some messages (which should not have been conflated with the work I\n  actually wanted to do, but whatevs)\n\n\nJohannes Schindelin (2):\n  Add a builtin helper for interactive rebases\n  rebase -i: use the rebase--helper builtin\n\n .gitignore                    |  1 +\n Makefile                      |  1 +\n builtin.h                     |  1 +\n builtin/rebase--helper.c      | 40 ++++++++++++++++++++++++++++++++++++++++\n git-rebase--interactive.sh    | 13 +++++++++++++\n git.c                         |  1 +\n t/t3404-rebase-interactive.sh |  2 +-\n 7 files changed, 58 insertions(+), 1 deletion(-)\n create mode 100644 builtin/rebase--helper.c\n\n\nbase-commit: 6e3a7b3398559305c7a239a42e447c21a8f39ff8\nBased-On: sequencer-i at https://github.com/dscho/git\nFetch-Base-Via: git fetch https://github.com/dscho/git sequencer-i\nPublished-As: https://github.com/dscho/git/releases/tag/rebase--helper-v2\nFetch-It-Via: git fetch https://github.com/dscho/git rebase--helper-v2\n\nInterdiff vs v1:\n\n diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\n index e2f18d11f6..33d392ba11 100755\n --- a/t/t3404-rebase-interactive.sh\n +++ b/t/t3404-rebase-interactive.sh\n @@ -556,7 +556,7 @@ test_expect_success 'clean error after failed \"exec\"' '\n  \techo \"edited again\" > file7 &&\n  \tgit add file7 &&\n  \ttest_must_fail git rebase --continue 2>error &&\n -\ttest_i18ngrep \"You have staged changes in your working tree.\" error\n +\ttest_i18ngrep \"you have staged changes in your working tree\" error\n  '\n  \n  test_expect_success 'rebase a detached HEAD' '\n\n-- \n2.11.1.windows.1\n\n"},{"id":"311234","messageId":"xmqq1sv7ng2j.fsf@gitster.mtv.corp.google.com","threadId":"43980","inReplyTo":"cover.1486678952.git.johannes.schindelin@gmx.de","subject":"Re: [PATCH v2 0/2] Let the sequencer handle the grunt work of rebase -i","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2017-02-09T22:40:36Z","receivedAt":"2017-02-09T22:40:43Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Johannes Schindelin <johannes.schindelin@gmx.de> writes:\n\n> After all of these patch series y'all had to review, this is finally the\n> one that switches things over.\n>\n> Please note that it does not (yet) handle the `git rebase -i --root`\n> invocation; I tried to focus on the common case, and I rarely use --root\n> myself.\n\nAs long as the longer-term goal is clear enough and the short-term\napproach does not conflict with the goal, solving the most common\nproblem that yields the largest payback first is absolutely the\nright thing to do, and omitting \"--root\" and/or \"-p\" and getting the\nmain use of \"-i\" right is a great way to start.\n\n>  .gitignore                    |  1 +\n>  Makefile                      |  1 +\n>  builtin.h                     |  1 +\n>  builtin/rebase--helper.c      | 40 ++++++++++++++++++++++++++++++++++++++++\n>  git-rebase--interactive.sh    | 13 +++++++++++++\n>  git.c                         |  1 +\n>  t/t3404-rebase-interactive.sh |  2 +-\n>  7 files changed, 58 insertions(+), 1 deletion(-)\n>  create mode 100644 builtin/rebase--helper.c\n\nAnd it is surprisingly short and sweet ;-)\n\nWill queue as js/rebase-helper topic, forked at 6e3a7b3398 (\"Git\n2.12-rc0\", 2017-02-03).\n\nThanks.\n\n\nPS. in case if anybody is wondering after reading [*1*], at this\npoint, I _have_ read the patches not just the cover letter, looked\nat the branch name the original author gave to the topic, chose the\nlocal topic name I use, and chose where to fork the topic from, but\nhave not applied the patches (so I may later end up saying \"the\npatch does not apply cleanly\", \"the compiler complains on this\nline\", or \"the new code is inconsistent with this existing code that\nis a bit beyond the context of the patch that I did not notice when\nI reviewed the patches alone\" in a separate message).  I do not have\na new entry for this topic in the draft of \"What's cooking\" report\nyet, or have not decided if the topic would hit 'jch' or 'pu' yet\neither.\n\n\n[Reference]\n\n*1* http://public-inbox.org/git/xmqq7f4zqiyj.fsf@gitster.mtv.corp.google.com\n"}]}