]> git.ipfire.org Git - thirdparty/git.git/commitdiff
add-patch: respect diff.context configuration
authorLeon Michalak <leonmichalak6@gmail.com>
Tue, 29 Jul 2025 07:01:50 +0000 (07:01 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 29 Jul 2025 15:52:45 +0000 (08:52 -0700)
Various builtins that use add-patch infrastructure do not respect
the user's diff.context and diff.interHunkContext file configurations.

The user may be used to seeing their diffs with customized context size,
but not in the patches "git add -p" shows them to pick from.

Teach add-patch infrastructure to read these configuration variables and
pass their values when spawning the underlying plumbing commands as
their command line option.

Signed-off-by: Leon Michalak <leonmichalak6@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
add-interactive.c
add-interactive.h
add-patch.c
t/t3701-add-interactive.sh

index 97ff35b6f12a32e4154fbe4d195d444c0f71c347..eb3d0d3ada84277b0650ced529df45d0aa21e1e8 100644 (file)
@@ -41,6 +41,8 @@ void init_add_i_state(struct add_i_state *s, struct repository *r)
        const char *value;
 
        s->r = r;
+       s->context = -1;
+       s->interhunkcontext = -1;
 
        if (repo_config_get_value(r, "color.interactive", &value))
                s->use_color = -1;
@@ -78,6 +80,13 @@ void init_add_i_state(struct add_i_state *s, struct repository *r)
        repo_config_get_string(r, "diff.algorithm",
                               &s->interactive_diff_algorithm);
 
+       if (!repo_config_get_int(r, "diff.context", &s->context))
+               if (s->context < 0)
+                       die(_("%s cannot be negative"), "diff.context");
+       if (!repo_config_get_int(r, "diff.interHunkContext", &s->interhunkcontext))
+               if (s->interhunkcontext < 0)
+                       die(_("%s cannot be negative"), "diff.interHunkContext");
+
        repo_config_get_bool(r, "interactive.singlekey", &s->use_single_key);
        if (s->use_single_key)
                setbuf(stdin, NULL);
index 693f125e8e4bc64ac0ccc8ac3b8dea812a397330..c63f35b14be86806ac16d55214d459da22f7a72f 100644 (file)
@@ -18,6 +18,7 @@ struct add_i_state {
 
        int use_single_key;
        char *interactive_diff_filter, *interactive_diff_algorithm;
+       int context, interhunkcontext;
 };
 
 void init_add_i_state(struct add_i_state *s, struct repository *r);
index 95c67d8c80c4f33bfa6180f69fdf2065d0b5b85c..b0125b51ba45e0492b48112aa67f82b6c35ddcbc 100644 (file)
@@ -414,7 +414,6 @@ static int normalize_marker(const char *p)
 static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
 {
        struct strvec args = STRVEC_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';
@@ -424,8 +423,12 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
        int res;
 
        strvec_pushv(&args, s->mode->diff_cmd);
-       if (diff_algorithm)
-               strvec_pushf(&args, "--diff-algorithm=%s", diff_algorithm);
+       if (s->s.context != -1)
+               strvec_pushf(&args, "--unified=%i", s->s.context);
+       if (s->s.interhunkcontext != -1)
+               strvec_pushf(&args, "--inter-hunk-context=%i", s->s.interhunkcontext);
+       if (s->s.interactive_diff_algorithm)
+               strvec_pushf(&args, "--diff-algorithm=%s", s->s.interactive_diff_algorithm);
        if (s->revision) {
                struct object_id oid;
                strvec_push(&args,
index b088ee141ff4d5828e395f9dafac4a39c108fef3..18dc329ea1f697ef8f066d8797a8e45a6741a3d9 100755 (executable)
@@ -1230,4 +1230,26 @@ test_expect_success 'hunk splitting works with diff.suppressBlankEmpty' '
        test_cmp expect actual
 '
 
+test_expect_success 'add -p respects diff.context' '
+       test_write_lines a b c d e f g h i j k l m >file &&
+       git add file &&
+       test_write_lines a b c d e f G h i j k l m >file &&
+       echo y | git -c diff.context=5 add -p >actual &&
+       test_grep "@@ -2,11 +2,11 @@" actual
+'
+
+test_expect_success 'add -p respects diff.interHunkContext' '
+       test_write_lines a b c d e f g h i j k l m n o p q r s >file &&
+       git add file &&
+       test_write_lines a b c d E f g i i j k l m N o p q r s >file &&
+       echo y | git -c diff.interhunkcontext=2 add -p >actual &&
+       test_grep "@@ -2,16 +2,16 @@" actual
+'
+
+test_expect_success 'add -p rejects negative diff.context' '
+       test_config diff.context -1 &&
+       test_must_fail git add -p 2>output &&
+       test_grep "diff.context cannot be negative" output
+'
+
 test_done