]> git.ipfire.org Git - thirdparty/git.git/commitdiff
format-patch: make format.noprefix a boolean
authorKristoffer Haugsbakk <code@khaugsbakk.name>
Mon, 23 Feb 2026 23:30:50 +0000 (00:30 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 23 Feb 2026 23:55:19 +0000 (15:55 -0800)
The config `format.noprefix` was added in 8d5213de (format-patch: add
format.noprefix option, 2023-03-09) to support no-prefix on paths.
That was immediately after making git-format-patch(1) not respect
`diff.noprefix`.[1]

The intent was to mirror `diff.noprefix`. But this config was
unintentionally[2] implemented by enabling no-prefix if any kind of
value is set.

† 1: c169af8f (format-patch: do not respect diff.noprefix, 2023-03-09)
† 2: https://lore.kernel.org/all/20260211073553.GA1867915@coredump.intra.peff.net/

Let’s indeed mirror `diff.noprefix` by treating it as a boolean.

This is a breaking change. And as far as breaking changes go it is
pretty benign:

• The documentation claims that this config is equivalent to
  `diff.noprefix`; this is just a bug fix if the documentation is
  what defines the application interface
• Only users with non-boolean values will run into problems when we
  try to parse it as a boolean. But what would (1) make them suspect
  they could do that in the first place, and (2) have motivated them to
  do it?
• Users who have set this to `false` and expect that to mean *enable
  format.noprefix* (current behavior) will now have the opposite
  experience. Which is not a reasonable setup.

Let’s only offer a breaking change fig leaf by advising about the
previous behavior before dying.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/log.c
t/t4014-format-patch.sh

index 5c9a8ef3632906544a37a9bb66c4713dd774b722..275122b807ef826b60afc0c7c1b493bdc6d0005c 100644 (file)
@@ -40,6 +40,7 @@
 #include "mailmap.h"
 #include "progress.h"
 #include "commit-slab.h"
+#include "advice.h"
 
 #include "commit-reach.h"
 #include "range-diff.h"
@@ -1096,7 +1097,18 @@ static int git_format_config(const char *var, const char *value,
                return 0;
        }
        if (!strcmp(var, "format.noprefix")) {
-               format_no_prefix = 1;
+               format_no_prefix = git_parse_maybe_bool(value);
+               if (format_no_prefix < 0) {
+                       int status = die_message(
+                               _("bad boolean config value '%s' for '%s'"),
+                               value, var);
+                       advise(_("'%s' used to accept any value and "
+                                "treat that as 'true'.\n"
+                                "Now it only accepts boolean values, "
+                                "like what '%s' does.\n"),
+                              var, "diff.noprefix");
+                       exit(status);
+               }
                return 0;
        }
 
index 21d6d0cd9ef679c04534fb9fa61952546c63c740..c20091e36feaca91d274f68d31d0394c8d6e82d4 100755 (executable)
@@ -2541,10 +2541,26 @@ test_expect_success 'format-patch respects format.noprefix' '
        grep "^--- blorp" actual
 '
 
+test_expect_success 'format.noprefix=false' '
+       git -c format.noprefix=false format-patch -1 --stdout >actual &&
+       grep "^--- a/blorp" actual
+'
+
 test_expect_success 'format-patch --default-prefix overrides format.noprefix' '
        git -c format.noprefix \
                format-patch -1 --default-prefix --stdout >actual &&
        grep "^--- a/blorp" actual
 '
 
+test_expect_success 'errors on format.noprefix which is not boolean' '
+       cat >expect <<-EOF &&
+       fatal: bad boolean config value ${SQ}not-a-bool${SQ} for ${SQ}format.noprefix${SQ}
+       hint: ${SQ}format.noprefix${SQ} used to accept any value and treat that as ${SQ}true${SQ}.
+       hint: Now it only accepts boolean values, like what ${SQ}diff.noprefix${SQ} does.
+       EOF
+       test_must_fail git -c format.noprefix=not-a-bool \
+               format-patch -1 --stdout 2>actual &&
+       test_cmp expect actual
+'
+
 test_done