built-in add -p: handle diff.algorithm

The Perl version of `git add -p` reads the config setting
`diff.algorithm` and if set, uses it to generate the diff using the
specified algorithm.

This patch ports that functionality to the C version.

Note: just like `git-add--interactive.perl`, we do _not_ respect this
config setting in `git add -i`'s `diff` command, but _only_ in the
`patch` command.

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 2020-01-14 18:43:46 +00:00 коммит произвёл Junio C Hamano
Родитель 180f48df69
Коммит 08b1ea4c39
3 изменённых файлов: 9 добавлений и 1 удалений

Просмотреть файл

@ -56,11 +56,16 @@ void init_add_i_state(struct add_i_state *s, struct repository *r)
FREE_AND_NULL(s->interactive_diff_filter); FREE_AND_NULL(s->interactive_diff_filter);
git_config_get_string("interactive.difffilter", git_config_get_string("interactive.difffilter",
&s->interactive_diff_filter); &s->interactive_diff_filter);
FREE_AND_NULL(s->interactive_diff_algorithm);
git_config_get_string("diff.algorithm",
&s->interactive_diff_algorithm);
} }
void clear_add_i_state(struct add_i_state *s) void clear_add_i_state(struct add_i_state *s)
{ {
FREE_AND_NULL(s->interactive_diff_filter); FREE_AND_NULL(s->interactive_diff_filter);
FREE_AND_NULL(s->interactive_diff_algorithm);
memset(s, 0, sizeof(*s)); memset(s, 0, sizeof(*s));
s->use_color = -1; s->use_color = -1;
} }

Просмотреть файл

@ -16,7 +16,7 @@ struct add_i_state {
char file_old_color[COLOR_MAXLEN]; char file_old_color[COLOR_MAXLEN];
char file_new_color[COLOR_MAXLEN]; char file_new_color[COLOR_MAXLEN];
char *interactive_diff_filter; char *interactive_diff_filter, *interactive_diff_algorithm;
}; };
void init_add_i_state(struct add_i_state *s, struct repository *r); void init_add_i_state(struct add_i_state *s, struct repository *r);

Просмотреть файл

@ -360,6 +360,7 @@ static int is_octal(const char *p, size_t len)
static int parse_diff(struct add_p_state *s, const struct pathspec *ps) static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
{ {
struct argv_array args = ARGV_ARRAY_INIT; struct argv_array args = ARGV_ARRAY_INIT;
const char *diff_algorithm = s->s.interactive_diff_algorithm;
struct strbuf *plain = &s->plain, *colored = NULL; struct strbuf *plain = &s->plain, *colored = NULL;
struct child_process cp = CHILD_PROCESS_INIT; struct child_process cp = CHILD_PROCESS_INIT;
char *p, *pend, *colored_p = NULL, *colored_pend = NULL, marker = '\0'; char *p, *pend, *colored_p = NULL, *colored_pend = NULL, marker = '\0';
@ -369,6 +370,8 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
int res; int res;
argv_array_pushv(&args, s->mode->diff_cmd); argv_array_pushv(&args, s->mode->diff_cmd);
if (diff_algorithm)
argv_array_pushf(&args, "--diff-algorithm=%s", diff_algorithm);
if (s->revision) { if (s->revision) {
struct object_id oid; struct object_id oid;
argv_array_push(&args, argv_array_push(&args,