Start to implement a built-in version of git add --interactive

Unlike previous conversions to C, where we started with a built-in
helper, we start this conversion by adding an interception in the
`run_add_interactive()` function when the new opt-in
`add.interactive.useBuiltin` config knob is turned on (or the
corresponding environment variable `GIT_TEST_ADD_I_USE_BUILTIN`), and
calling the new internal API function `run_add_i()` that is implemented
directly in libgit.a.

At this point, the built-in version of `git add -i` only states that it
cannot do anything yet. In subsequent patches/patch series, the
`run_add_i()` function will gain more and more functionality, until it
is feature complete. The whole arc of the conversion can be found in the
PRs #170-175 at https://github.com/gitgitgadget/git.

The "--helper approach" can unfortunately not be used here: on Windows
we face the very specific problem that a `system()` call in
Perl seems to close `stdin` in the parent process when the spawned
process consumes even one character from `stdin`. Which prevents us from
implementing the main loop in C and still trying to hand off to the Perl
script.

The very real downside of the approach we have to take here is that the
test suite won't pass with `GIT_TEST_ADD_I_USE_BUILTIN=true` until the
conversion is complete (the `--helper` approach would have let it pass,
even at each of the incremental conversion steps).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2019-11-13 12:40:57 +00:00 committed by Junio C Hamano
parent da72936f54
commit f83dff60a7
6 changed files with 37 additions and 0 deletions

View File

@ -5,3 +5,8 @@ add.ignore-errors (deprecated)::
option of linkgit:git-add[1]. `add.ignore-errors` is deprecated, option of linkgit:git-add[1]. `add.ignore-errors` is deprecated,
as it does not follow the usual naming convention for configuration as it does not follow the usual naming convention for configuration
variables. variables.
add.interactive.useBuiltin::
[EXPERIMENTAL] Set to `true` to use the experimental built-in
implementation of the interactive version of linkgit:git-add[1]
instead of the Perl script version. Is `false` by default.

View File

@ -823,6 +823,7 @@ LIB_H := $(sort $(patsubst ./%,%,$(shell git ls-files '*.h' ':!t/' ':!Documentat
-name '*.h' -print))) -name '*.h' -print)))
LIB_OBJS += abspath.o LIB_OBJS += abspath.o
LIB_OBJS += add-interactive.o
LIB_OBJS += advice.o LIB_OBJS += advice.o
LIB_OBJS += alias.o LIB_OBJS += alias.o
LIB_OBJS += alloc.o LIB_OBJS += alloc.o

7
add-interactive.c Normal file
View File

@ -0,0 +1,7 @@
#include "cache.h"
#include "add-interactive.h"
int run_add_i(struct repository *r, const struct pathspec *ps)
{
die(_("No commands are available in the built-in `git add -i` yet!"));
}

8
add-interactive.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef ADD_INTERACTIVE_H
#define ADD_INTERACTIVE_H
struct repository;
struct pathspec;
int run_add_i(struct repository *r, const struct pathspec *ps);
#endif

View File

@ -20,6 +20,7 @@
#include "bulk-checkin.h" #include "bulk-checkin.h"
#include "argv-array.h" #include "argv-array.h"
#include "submodule.h" #include "submodule.h"
#include "add-interactive.h"
static const char * const builtin_add_usage[] = { static const char * const builtin_add_usage[] = {
N_("git add [<options>] [--] <pathspec>..."), N_("git add [<options>] [--] <pathspec>..."),
@ -185,6 +186,16 @@ int run_add_interactive(const char *revision, const char *patch_mode,
{ {
int status, i; int status, i;
struct argv_array argv = ARGV_ARRAY_INIT; struct argv_array argv = ARGV_ARRAY_INIT;
int use_builtin_add_i =
git_env_bool("GIT_TEST_ADD_I_USE_BUILTIN", -1);
if (!patch_mode) {
if (use_builtin_add_i < 0)
git_config_get_bool("add.interactive.usebuiltin",
&use_builtin_add_i);
if (use_builtin_add_i == 1)
return !!run_add_i(the_repository, pathspec);
}
argv_array_push(&argv, "add--interactive"); argv_array_push(&argv, "add--interactive");
if (patch_mode) if (patch_mode)
@ -319,6 +330,7 @@ static int add_config(const char *var, const char *value, void *cb)
ignore_add_errors = git_config_bool(var, value); ignore_add_errors = git_config_bool(var, value);
return 0; return 0;
} }
return git_default_config(var, value, cb); return git_default_config(var, value, cb);
} }

View File

@ -397,6 +397,10 @@ GIT_TEST_STASH_USE_BUILTIN=<boolean>, when false, disables the
built-in version of git-stash. See 'stash.useBuiltin' in built-in version of git-stash. See 'stash.useBuiltin' in
git-config(1). git-config(1).
GIT_TEST_ADD_I_USE_BUILTIN=<boolean>, when true, enables the
built-in version of git add -i. See 'add.interactive.useBuiltin' in
git-config(1).
GIT_TEST_INDEX_THREADS=<n> enables exercising the multi-threaded loading GIT_TEST_INDEX_THREADS=<n> enables exercising the multi-threaded loading
of the index for the whole test suite by bypassing the default number of of the index for the whole test suite by bypassing the default number of
cache entries and thread minimums. Setting this to 1 will make the cache entries and thread minimums. Setting this to 1 will make the