]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: allow multi-byte core.commentChar
authorJeff King <peff@peff.net>
Tue, 12 Mar 2024 09:17:50 +0000 (05:17 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 12 Mar 2024 20:28:11 +0000 (13:28 -0700)
Now that all of the code handles multi-byte comment characters, it's
safe to allow users to set them.

There is one special case I kept: we still will not allow an empty
string for the commentChar. While it might make sense in some contexts
(e.g., output where you don't want any comment prefix), there are plenty
where it will behave badly (e.g., all of our starts_with() checks will
indicate that every line is a comment!). It might be reasonable to
assign some meaningful semantics, but it would probably involve checking
how each site behaves. In the interim let's forbid it and we can loosen
things later.

Likewise, the "commentChar cannot be a newline" rule is now extended to
"it cannot contain a newline" (for the same reason: it can confuse our
parsing loops).

Since comment_line_str is used in many parts of the code, it's hard to
cover all possibilities with tests. We can convert the existing
double-semicolon prefix test to show that "git status" works. And we'll
give it a more challenging case in t7507, where we confirm that
git-commit strips out the commit template along with any --verbose text
when reading the edited commit message back in. That covers the basics,
though it's possible there could be issues in more exotic spots (e.g.,
the sequencer todo list uses its own code).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/core.txt
config.c
t/t0030-stripspace.sh
t/t7507-commit-verbose.sh
t/t7508-status.sh

index 0e8c2832bf9b8a5251c51f346ecfcf47c7e8d530..c86b8c84086aab96b2d15f4fcea2da6a7211f64f 100644 (file)
@@ -523,7 +523,9 @@ core.commentChar::
        Commands such as `commit` and `tag` that let you edit
        messages consider a line that begins with this character
        commented, and removes them after the editor returns
-       (default '#').
+       (default '#'). Note that this option can take values larger than
+       a byte (whether a single multi-byte character, or you
+       could even go wild with a multi-character sequence).
 +
 If set to "auto", `git-commit` would select a character that is not
 the beginning character of any line in existing commit messages.
index 7e5dbca4bdb792a9f4ead8223a76f6db704509ae..92c752ed9fa2d076f74b609c1de575740cf40f05 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1565,13 +1565,13 @@ static int git_default_core_config(const char *var, const char *value,
                        return config_error_nonbool(var);
                else if (!strcasecmp(value, "auto"))
                        auto_comment_line_char = 1;
-               else if (value[0] && !value[1]) {
-                       if (value[0] == '\n')
-                               return error(_("core.commentChar cannot be newline"));
-                       comment_line_str = xstrfmt("%c", value[0]);
+               else if (value[0]) {
+                       if (strchr(value, '\n'))
+                               return error(_("core.commentChar cannot contain newline"));
+                       comment_line_str = xstrdup(value);
                        auto_comment_line_char = 0;
                } else
-                       return error(_("core.commentChar should only be one ASCII character"));
+                       return error(_("core.commentChar must have at least one character"));
                return 0;
        }
 
index e399dd918960e1b6c01baa06d8a795ba53f97d6c..a161faf702945e323a3e242ac62b71633b0f1836 100755 (executable)
@@ -403,7 +403,12 @@ test_expect_success 'strip comments with changed comment char' '
 
 test_expect_success 'newline as commentchar is forbidden' '
        test_must_fail git -c core.commentChar="$LF" stripspace -s 2>err &&
-       grep "core.commentChar cannot be newline" err
+       grep "core.commentChar cannot contain newline" err
+'
+
+test_expect_success 'empty commentchar is forbidden' '
+       test_must_fail git -c core.commentchar= stripspace -s 2>err &&
+       grep "core.commentChar must have at least one character" err
 '
 
 test_expect_success '-c with single line' '
index c3281b192e49ce130d3babc4f9fda39acd3d69b8..4c7db19ce7eff05cb660018f8b8db3182e244efe 100755 (executable)
@@ -101,6 +101,16 @@ test_expect_success 'verbose diff is stripped out with set core.commentChar' '
        test_grep "Aborting commit due to empty commit message." err
 '
 
+test_expect_success 'verbose diff is stripped with multi-byte comment char' '
+       (
+               GIT_EDITOR=cat &&
+               export GIT_EDITOR &&
+               test_must_fail git -c core.commentchar="foo>" commit -a -v >out 2>err
+       ) &&
+       grep "^foo> " out &&
+       test_grep "Aborting commit due to empty commit message." err
+'
+
 test_expect_success 'status does not verbose without --verbose' '
        git status >actual &&
        ! grep "^diff --git" actual
index a3c18a4fc2764aa669556fe56961d254727bdab5..10ed8b32bc2cc1bd29133c4984c41c6c5c23cbc7 100755 (executable)
@@ -1403,7 +1403,9 @@ test_expect_success "status (core.commentchar with submodule summary)" '
 
 test_expect_success "status (core.commentchar with two chars with submodule summary)" '
        test_config core.commentchar ";;" &&
-       test_must_fail git -c status.displayCommentPrefix=true status
+       sed "s/^/;/" <expect >expect.double &&
+       git -c status.displayCommentPrefix=true status >output &&
+       test_cmp expect.double output
 '
 
 test_expect_success "--ignore-submodules=all suppresses submodule summary" '