summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2020-01-14 18:43:46 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-01-15 20:06:16 (GMT)
commit08b1ea4c39b08b76fe2d1240ccbf6077ef19226a (patch)
tree5b5594a85ade0187b7d8cf7a115f86a129ae9506
parent180f48df69d8e7a1a413d7c11907ecf975f09cf7 (diff)
downloadgit-08b1ea4c39b08b76fe2d1240ccbf6077ef19226a.zip
git-08b1ea4c39b08b76fe2d1240ccbf6077ef19226a.tar.gz
git-08b1ea4c39b08b76fe2d1240ccbf6077ef19226a.tar.bz2
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>
-rw-r--r--add-interactive.c5
-rw-r--r--add-interactive.h2
-rw-r--r--add-patch.c3
3 files changed, 9 insertions, 1 deletions
diff --git a/add-interactive.c b/add-interactive.c
index 1786ea2..9e4bcb3 100644
--- a/add-interactive.c
+++ b/add-interactive.c
@@ -56,11 +56,16 @@ void init_add_i_state(struct add_i_state *s, struct repository *r)
FREE_AND_NULL(s->interactive_diff_filter);
git_config_get_string("interactive.difffilter",
&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)
{
FREE_AND_NULL(s->interactive_diff_filter);
+ FREE_AND_NULL(s->interactive_diff_algorithm);
memset(s, 0, sizeof(*s));
s->use_color = -1;
}
diff --git a/add-interactive.h b/add-interactive.h
index 46c7386..923efaf 100644
--- a/add-interactive.h
+++ b/add-interactive.h
@@ -16,7 +16,7 @@ struct add_i_state {
char file_old_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);
diff --git a/add-patch.c b/add-patch.c
index 78bde41..8f2ee86 100644
--- a/add-patch.c
+++ b/add-patch.c
@@ -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)
{
struct argv_array args = ARGV_ARRAY_INIT;
+ const char *diff_algorithm = s->s.interactive_diff_algorithm;
struct strbuf *plain = &s->plain, *colored = NULL;
struct child_process cp = CHILD_PROCESS_INIT;
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;
argv_array_pushv(&args, s->mode->diff_cmd);
+ if (diff_algorithm)
+ argv_array_pushf(&args, "--diff-algorithm=%s", diff_algorithm);
if (s->revision) {
struct object_id oid;
argv_array_push(&args,