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>maint
							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 | ||||||
|  |  | ||||||
|  | @ -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!")); | ||||||
|  | } | ||||||
|  | @ -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
	
	 Johannes Schindelin
						Johannes Schindelin