rebase -i: generate the script via rebase--helper
commit62db5247790f2612c0b407a15d1901d88789d35a
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 14 Jul 2017 14:44:58 +0000 (14 16:44 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 27 Jul 2017 22:35:05 +0000 (27 15:35 -0700)
treefd1035ea8daf2cca66f72930c0e39df6c1181574
parent4e7524e012f345fe0c4eb66cb9f975da2c243c21
rebase -i: generate the script via rebase--helper

The first step of an interactive rebase is to generate the so-called "todo
script", to be stored in the state directory as "git-rebase-todo" and to
be edited by the user.

Originally, we adjusted the output of `git log <options>` using a simple
sed script. Over the course of the years, the code became more
complicated. We now use shell scripting to edit the output of `git log`
conditionally, depending whether to keep "empty" commits (i.e. commits
that do not change any files).

On platforms where shell scripting is not native, this can be a serious
drag. And it opens the door for incompatibilities between platforms when
it comes to shell scripting or to Unix-y commands.

Let's just re-implement the todo script generation in plain C, using the
revision machinery directly.

This is substantially faster, improving the speed relative to the
shell script version of the interactive rebase from 2x to 3x on Windows.

Note that the rearrange_squash() function in git-rebase--interactive
relied on the fact that we set the "format" variable to the config setting
rebase.instructionFormat. Relying on a side effect like this is no good,
hence we explicitly perform that assignment (possibly again) in
rearrange_squash().

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/rebase--helper.c
git-rebase--interactive.sh
sequencer.c
sequencer.h