From: Matheus Tavares <matheus.bernardino@usp.br>
To: git@vger.kernel.org
Cc: l.s.r@web.de, gitster@pobox.com
Subject: [PATCH] format-patch: warn if commit msg contains a patch delimiter
Date: Sun, 4 Sep 2022 20:12:05 -0300 [thread overview]
Message-ID: <d0b577825124ac684ab304d3a1395f3d2d0708e8.1662333027.git.matheus.bernardino@usp.br> (raw)
When applying a patch, `git am` looks for special delimiter strings
(such as "---") to know where the message ends and the actual diff
starts. If one of these strings appears in the commit message itself,
`am` might get confused and fail to apply the patch properly. This has
already caused inconveniences in the past [1][2]. To help avoid such
problem, let's make `git format-patch` warn on commit messages
containing one of the said strings.
[1]: https://lore.kernel.org/git/20210113085846-mutt-send-email-mst@kernel.org/
[2]: https://lore.kernel.org/git/16297305.cDA1TJNmNo@earendil/
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
---
builtin/log.c | 1 +
log-tree.c | 1 +
mailinfo.c | 4 ++--
mailinfo.h | 3 +++
pretty.c | 21 ++++++++++++++++++++-
pretty.h | 3 ++-
revision.h | 3 ++-
t/t4014-format-patch.sh | 16 ++++++++++++++++
8 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/builtin/log.c b/builtin/log.c
index 56e2d95e86..edc84abaef 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -1973,6 +1973,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
rev.diffopt.flags.recursive = 1;
rev.diffopt.no_free = 1;
rev.subject_prefix = fmt_patch_subject_prefix;
+ rev.check_in_body_patch_breaks = 1;
memset(&s_r_opt, 0, sizeof(s_r_opt));
s_r_opt.def = "HEAD";
s_r_opt.revarg_opt = REVARG_COMMITTISH;
diff --git a/log-tree.c b/log-tree.c
index 3e8c70ddcf..25ed5452b1 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -766,6 +766,7 @@ void show_log(struct rev_info *opt)
ctx.after_subject = extra_headers;
ctx.preserve_subject = opt->preserve_subject;
ctx.encode_email_headers = opt->encode_email_headers;
+ ctx.check_in_body_patch_breaks = opt->check_in_body_patch_breaks;
ctx.reflog_info = opt->reflog_info;
ctx.fmt = opt->commit_format;
ctx.mailmap = opt->mailmap;
diff --git a/mailinfo.c b/mailinfo.c
index 9621ba62a3..9945ea6267 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -646,7 +646,7 @@ static void decode_transfer_encoding(struct mailinfo *mi, struct strbuf *line)
free(ret);
}
-static inline int patchbreak(const struct strbuf *line)
+int patchbreak(const struct strbuf *line)
{
size_t i;
@@ -682,7 +682,7 @@ static inline int patchbreak(const struct strbuf *line)
return 0;
}
-static int is_scissors_line(const char *line)
+int is_scissors_line(const char *line)
{
const char *c;
int scissors = 0, gap = 0;
diff --git a/mailinfo.h b/mailinfo.h
index f2ffd0349e..8d4dda5deb 100644
--- a/mailinfo.h
+++ b/mailinfo.h
@@ -53,4 +53,7 @@ void setup_mailinfo(struct mailinfo *);
int mailinfo(struct mailinfo *, const char *msg, const char *patch);
void clear_mailinfo(struct mailinfo *);
+int patchbreak(const struct strbuf *line);
+int is_scissors_line(const char *line);
+
#endif /* MAILINFO_H */
diff --git a/pretty.c b/pretty.c
index 6d819103fb..9f999029f5 100644
--- a/pretty.c
+++ b/pretty.c
@@ -5,6 +5,7 @@
#include "diff.h"
#include "revision.h"
#include "string-list.h"
+#include "mailinfo.h"
#include "mailmap.h"
#include "log-tree.h"
#include "notes.h"
@@ -2097,7 +2098,8 @@ void pp_remainder(struct pretty_print_context *pp,
int indent)
{
struct grep_opt *opt = pp->rev ? &pp->rev->grep_filter : NULL;
- int first = 1;
+ int first = 1, found_delimiter = 0;
+ struct strbuf linebuf = STRBUF_INIT;
for (;;) {
const char *line = *msg_p;
@@ -2107,6 +2109,17 @@ void pp_remainder(struct pretty_print_context *pp,
if (!linelen)
break;
+ if (pp->check_in_body_patch_breaks) {
+ strbuf_reset(&linebuf);
+ strbuf_add(&linebuf, line, linelen);
+ if (patchbreak(&linebuf) || is_scissors_line(linebuf.buf)) {
+ strbuf_strip_suffix(&linebuf, "\n");
+ warning("commit message has a patch delimiter: '%s'",
+ linebuf.buf);
+ found_delimiter = 1;
+ }
+ }
+
if (is_blank_line(line, &linelen)) {
if (first)
continue;
@@ -2133,6 +2146,12 @@ void pp_remainder(struct pretty_print_context *pp,
}
strbuf_addch(sb, '\n');
}
+
+ if (found_delimiter)
+ warning("git am might fail to apply this patch. "
+ "Consider indenting the offending lines.");
+
+ strbuf_release(&linebuf);
}
void pretty_print_commit(struct pretty_print_context *pp,
diff --git a/pretty.h b/pretty.h
index f34e24c53a..12df2f4a39 100644
--- a/pretty.h
+++ b/pretty.h
@@ -49,7 +49,8 @@ struct pretty_print_context {
struct string_list *mailmap;
int color;
struct ident_split *from_ident;
- unsigned encode_email_headers:1;
+ unsigned encode_email_headers:1,
+ check_in_body_patch_breaks:1;
struct pretty_print_describe_status *describe_status;
/*
diff --git a/revision.h b/revision.h
index 61a9b1316b..f384ab716f 100644
--- a/revision.h
+++ b/revision.h
@@ -230,7 +230,8 @@ struct rev_info {
date_mode_explicit:1,
preserve_subject:1,
encode_email_headers:1,
- include_header:1;
+ include_header:1,
+ check_in_body_patch_breaks:1;
unsigned int disable_stdin:1;
/* --show-linear-break */
unsigned int track_linear:1,
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index fbec8ad2ef..4868ea2b91 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -2329,4 +2329,20 @@ test_expect_success 'interdiff: solo-patch' '
test_cmp expect actual
'
+test_expect_success 'warn if commit message contains patch delimiter' '
+ >delim &&
+ git add delim &&
+ GIT_EDITOR="printf \"title\n\n---\" >" git commit &&
+ git format-patch -1 2>stderr &&
+ grep "warning: commit message has a patch delimiter" stderr
+'
+
+test_expect_success 'warn if commit message contains scissors' '
+ >scissors &&
+ git add scissors &&
+ GIT_EDITOR="printf \"title\n\n-- >8 --\" >" git commit &&
+ git format-patch -1 2>stderr &&
+ grep "warning: commit message has a patch delimiter" stderr
+'
+
test_done
--
2.37.2
next reply other threads:[~2022-09-04 23:13 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-04 23:12 Matheus Tavares [this message]
2022-09-05 8:01 ` [PATCH] format-patch: warn if commit msg contains a patch delimiter Ævar Arnfjörð Bjarmason
2022-09-05 10:57 ` René Scharfe
2022-09-07 14:44 ` [PATCH v2 0/2] " Matheus Tavares
2022-09-07 14:44 ` [PATCH v2 1/2] patchbreak(), is_scissors_line(): work with a buf/len pair Matheus Tavares
2022-09-07 18:20 ` Phillip Wood
2022-09-08 0:35 ` Eric Sunshine
2022-09-07 14:44 ` [PATCH v2 2/2] format-patch: warn if commit msg contains a patch delimiter Matheus Tavares
2022-09-07 18:09 ` Phillip Wood
2022-09-07 18:36 ` Junio C Hamano
2022-09-09 1:08 ` Matheus Tavares
2022-09-09 16:47 ` Junio C Hamano
2022-09-07 17:44 ` [PATCH v2 0/2] " René Scharfe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d0b577825124ac684ab304d3a1395f3d2d0708e8.1662333027.git.matheus.bernardino@usp.br \
--to=matheus.bernardino@usp.br \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=l.s.r@web.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).