diff options
authorJeff King <>2018-08-23 00:49:56 (GMT)
committerJunio C Hamano <>2018-08-23 17:08:51 (GMT)
commit1688c9a4894df517241026c7a3848bdc84607986 (patch)
parentc188668e387509565237a865a1c63e890f6bbcd7 (diff)
interpret-trailers: allow suppressing "---" divider
Even with the newly-tightened "---" parser, it's still possible for a commit message to trigger a false positive if it contains something like "--- foo". If the caller knows that it has only a single commit message, it can now tell us with the "--no-divider" option, eliminating any false positives. If we were designing this from scratch, I'd probably make this the default. But we've advertised the "---" behavior in the documentation since interpret-trailers has existed. Since it's meant to be scripted, breaking that would be a bad idea. Note that the logic is in the underlying trailer.c code, which is used elsewhere. The default there will keep the current behavior, but many callers will benefit from setting this new option. That's left for future patches. Signed-off-by: Jeff King <> Signed-off-by: Junio C Hamano <>
5 files changed, 33 insertions, 2 deletions
diff --git a/Documentation/git-interpret-trailers.txt b/Documentation/git-interpret-trailers.txt
index 152479e..ee13124 100644
--- a/Documentation/git-interpret-trailers.txt
+++ b/Documentation/git-interpret-trailers.txt
@@ -58,7 +58,7 @@ The group must be preceded by one or more empty (or whitespace-only) lines.
The group must either be at the end of the message or be the last
non-whitespace lines before a line that starts with '---' (followed by a
space or the end of the line). Such three minus signs start the patch
-part of the message.
+part of the message. See also `--no-divider` below.
When reading trailers, there can be whitespaces after the
token, the separator and the value. There can also be whitespaces
@@ -123,6 +123,11 @@ OPTIONS
A convenience alias for `--only-trailers --only-input
+ Do not treat `---` as the end of the commit message. Use this
+ when you know your input contains just the commit message itself
+ (and not an email or the output of `git format-patch`).
diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c
index b742539..4b87e0d 100644
--- a/builtin/interpret-trailers.c
+++ b/builtin/interpret-trailers.c
@@ -104,6 +104,7 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
OPT_BOOL(0, "unfold", &opts.unfold, N_("join whitespace-continued values")),
{ OPTION_CALLBACK, 0, "parse", &opts, NULL, N_("set parsing options"),
PARSE_OPT_NOARG | PARSE_OPT_NONEG, parse_opt_parse },
+ OPT_BOOL(0, "no-divider", &opts.no_divider, N_("do not treat --- specially")),
OPT_CALLBACK(0, "trailer", &trailers, N_("trailer"),
N_("trailer(s) to add"), option_parse_trailer),
diff --git a/t/ b/t/
index e13b40b..c441861 100755
--- a/t/
+++ b/t/
@@ -1439,4 +1439,24 @@ test_expect_success 'handling of --- lines in input' '
test_cmp expected actual
+test_expect_success 'suppress --- handling' '
+ echo "real-trailer: just right" >expected &&
+ git interpret-trailers --parse --no-divider >actual <<-\EOF &&
+ subject
+ This commit message has a "---" in it, but because we tell
+ interpret-trailers not to respect that, it has no effect.
+ not-a-trailer: too soon
+ ---
+ This is still the commit message body.
+ real-trailer: just right
+ test_cmp expected actual
diff --git a/trailer.c b/trailer.c
index 8392c6c..0796f32 100644
--- a/trailer.c
+++ b/trailer.c
@@ -1080,7 +1080,11 @@ void trailer_info_get(struct trailer_info *info, const char *str,
- patch_start = find_patch_start(str);
+ if (opts->no_divider)
+ patch_start = strlen(str);
+ else
+ patch_start = find_patch_start(str);
trailer_end = find_trailer_end(str, patch_start);
trailer_start = find_trailer_start(str, trailer_end);
diff --git a/trailer.h b/trailer.h
index 82a62b3..f47b16e 100644
--- a/trailer.h
+++ b/trailer.h
@@ -69,6 +69,7 @@ struct process_trailer_options {
int only_trailers;
int only_input;
int unfold;
+ int no_divider;