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:
parent
da72936f54
commit
f83dff60a7
@ -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.
|
||||||
|
1
Makefile
1
Makefile
@ -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
7
add-interactive.c
Normal 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
8
add-interactive.h
Normal 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
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
t/README
4
t/README
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user