This is the first leg on the long journey to a fully built-in git add -i (next up: parts 2 [https://github.com/gitgitgadget/git/pull/171], 3 [https://github.com/gitgitgadget/git/pull/172], 4 [https://github.com/gitgitgadget/git/pull/173], 5 [https://github.com/gitgitgadget/git/pull/174], and 6 [https://github.com/gitgitgadget/git/pull/175]). It reflects the part that was submitted a couple of times (see https://github.com/gitgitgadget/git/pull/103) during the Outreachy project by Slavica Ðukic that continued the journey based on an initial patch series by Daniel Ferreira. This part only implements the status and the help part, like Slavica's last iteration did, in the interest of making the review remotely more reviewable. I fear that this attempt of making it a bit more reviewable is pretty futile, as so many things changed. So I will ask the reviewers for forgiveness: please be kind, and give this sort of a fresh review. I threw in a couple of major changes on top of that iteration, though: * The original plan was to add a helper (git add--helper) that takes over more and more responsibility from the Perl script over the course of the conversion. This plan is no longer in effect, as I encountered a serious problem with that: the MSYS2 runtime used by the Perl interpreter which Git for Windows employs to run git add -i has a curious bug (that is safely outside the purview of this here patch series) where it fails to read from standard input after it spawned a non-MSYS2 program (such as add--helper) that reads from standard input. So that wouldn't work, but quit the interactive add as soon as even one interactive command had been handled by the helper. To keep my git add -i in a working state, I therefore adopted a different strategy: Just like git difftool was converted by starting with a built-in that did nothing but handing off to the scripted version, guarded by the (opt-in) difftool.useBuiltin config setting, I start this patch series by a built-in add -i that does nothing else but state that it is not implemented yet, guarded by the (opt-in) add.interactive.useBuiltin config setting. In contrast to the git difftool situation, it is quite a bit easier here, as we do not even have to rename the script to git-legacy-add--interactive.perl: the add--interactive command is an implementation detail that users are not even supposed to know about. Therefore, we can implement that road fork between the built-in and the scripted version in builtin/add.c, i.e. in the user-facing git add command. This will also naturally help with the transition to a fully built-in git add -i/git add -p, as we saw with the built-in git rebase how important it is for end users to have an escape hatch (and for that reason, tried our best to provide the same with the built-in git stash). * The help command was actually not hooked up in git add -i in Slavica's last iteration, but was only available as a special option of the git add--helper command. As that command no longer exists, I kind of had to implement some way to let the built-in git add -i show the help text. * The main loop of git add -i (i.e. the thing that lets you choose status or help) is now implemented (but only lists status and help, of course), as it makes use of that feature that took the main chunk of the Outreachy project: the function to determine unique prefixes of a list of strings. * Speaking of the unique prefixes: the functionality to determine those is now encapsulated in the prefix-map.c file, and I also added a regression test. * Speaking of the tests: I also implemented support for the environment variable GIT_TEST_ADD_I_USE_BUILTIN: by setting it, the test suite can be forced to use the built-in, or the Perl script, version of git add -i. Needless to say: by the end of this patch series, running the test suite with GIT_TEST_ADD_I_USE_BUILTIN=true will still result in a ton of test failures due to not-yet-implemented commands, but it will also demonstrate what already works. * Since the main loop starts not only by showing the status, but refreshes the index before that, I added that, and I actually refactored that code into a new function (repo_refresh_and_write_index()), as it will be used a couple of times by the end of the complete conversion of git add -i into a built-in command. Daniel Ferreira (2): diff: export diffstat interface built-in add -i: implement the `status` command Johannes Schindelin (6): Start to implement a built-in version of `git add --interactive` built-in add -i: refresh the index before running `status` built-in add -i: color the header in the `status` command built-in add -i: implement the main loop built-in add -i: support `?` (prompt help) built-in add -i: implement the `help` command Slavica Djukic (3): Add a function to determine unique prefixes for a list of strings built-in add -i: show unique prefixes of the commands built-in add -i: use color in the main loop Documentation/config/add.txt | 5 + Makefile | 3 + add-interactive.c | 560 +++++++++++++++++++++++++++++++++++ add-interactive.h | 10 + builtin/add.c | 16 +- diff.c | 37 +-- diff.h | 19 ++ prefix-map.c | 111 +++++++ prefix-map.h | 40 +++ repository.c | 19 ++ repository.h | 7 + t/README | 4 + t/helper/test-prefix-map.c | 58 ++++ t/helper/test-tool.c | 1 + t/helper/test-tool.h | 1 + t/t0016-prefix-map.sh | 10 + t/t3701-add-interactive.sh | 24 ++ 17 files changed, 902 insertions(+), 23 deletions(-) create mode 100644 add-interactive.c create mode 100644 add-interactive.h create mode 100644 prefix-map.c create mode 100644 prefix-map.h create mode 100644 t/helper/test-prefix-map.c create mode 100755 t/t0016-prefix-map.sh base-commit: 8104ec994ea3849a968b4667d072fedd1e688642 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-170%2Fdscho%2Fadd-i-in-c-status-and-help-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-170/dscho/add-i-in-c-status-and-help-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/170 -- gitgitgadget