]> git.ipfire.org Git - thirdparty/git.git/commitdiff
built-in add -p: only show the applicable parts of the help text
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 13 Dec 2019 08:08:05 +0000 (08:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 13 Dec 2019 20:37:14 +0000 (12:37 -0800)
When displaying the only hunk in a file's diff, the prompt already
excludes the commands to navigate to the previous/next hunk.

Let's also let the `?` command show only the help lines corresponding to
the commands that are displayed in the prompt.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
add-patch.c

index 5e9829a8b42342c54ad15677f928d9b950df42ae..1eb0ab97bbe5c98c11c6423a89bab31944f7e702 100644 (file)
@@ -1008,8 +1008,10 @@ N_("y - stage this hunk\n"
    "n - do not stage this hunk\n"
    "q - quit; do not stage this hunk or any of the remaining ones\n"
    "a - stage this and all the remaining hunks\n"
-   "d - do not stage this hunk nor any of the remaining hunks\n"
-   "j - leave this hunk undecided, see next undecided hunk\n"
+   "d - do not stage this hunk nor any of the remaining hunks\n");
+
+static const char help_patch_remainder[] =
+N_("j - leave this hunk undecided, see next undecided hunk\n"
    "J - leave this hunk undecided, see next hunk\n"
    "k - leave this hunk undecided, see previous undecided hunk\n"
    "K - leave this hunk undecided, see previous hunk\n"
@@ -1246,9 +1248,31 @@ soft_increment:
                                hunk->use = USE_HUNK;
                                goto soft_increment;
                        }
-               } else
-                       color_fprintf(stdout, s->s.help_color,
+               } else {
+                       const char *p = _(help_patch_remainder), *eol = p;
+
+                       color_fprintf(stdout, s->s.help_color, "%s",
                                      _(help_patch_text));
+
+                       /*
+                        * Show only those lines of the remainder that are
+                        * actually applicable with the current hunk.
+                        */
+                       for (; *p; p = eol + (*eol == '\n')) {
+                               eol = strchrnul(p, '\n');
+
+                               /*
+                                * `s->buf` still contains the part of the
+                                * commands shown in the prompt that are not
+                                * always available.
+                                */
+                               if (*p != '?' && !strchr(s->buf.buf, *p))
+                                       continue;
+
+                               color_fprintf_ln(stdout, s->s.help_color,
+                                                "%.*s", (int)(eol - p), p);
+                       }
+               }
        }
 
        /* Any hunk to be used? */