From: Eric Wong <e@80x24.org>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Eric Sunshine <sunshine@sunshineco.com>
Subject: [PATCH] format-patch: escape "From " lines recognized by mailsplit
Date: Fri, 22 Jul 2016 22:47:39 +0000 [thread overview]
Message-ID: <20160722224739.GA22961@whir> (raw)
Users have mistakenly copied "From " lines into commit messages
in the past, and will certainly make the same mistakes in the
future. Since not everyone uses mboxrd, yet, we should at least
prevent miss-split mails by always escaping "From " lines based
on the check used by mailsplit.
mailsplit will not perform unescaping by default, yet, as it
could cause further invocations of format-patch from old
versions of git to generate bad output. Propagating the mboxo
escaping is preferable to miss-split patches. Unescaping may
still be performed via "--mboxrd".
ref: https://public-inbox.org/git/20160606230248.GA15906@dcvr.yhbt.net/T/#u
Signed-off-by: Eric Wong <e@80x24.org>
---
builtin/mailsplit.c | 32 +-------------------------------
mailinfo.c | 31 +++++++++++++++++++++++++++++++
mailinfo.h | 1 +
pretty.c | 16 +++++++++++++---
t/t4014-format-patch.sh | 14 ++++++++++++++
5 files changed, 60 insertions(+), 34 deletions(-)
diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c
index 3068168..bb8f9c9 100644
--- a/builtin/mailsplit.c
+++ b/builtin/mailsplit.c
@@ -8,41 +8,11 @@
#include "builtin.h"
#include "string-list.h"
#include "strbuf.h"
+#include "mailinfo.h"
static const char git_mailsplit_usage[] =
"git mailsplit [-d<prec>] [-f<n>] [-b] [--keep-cr] -o<directory> [(<mbox>|<Maildir>)...]";
-static int is_from_line(const char *line, int len)
-{
- const char *colon;
-
- if (len < 20 || memcmp("From ", line, 5))
- return 0;
-
- colon = line + len - 2;
- line += 5;
- for (;;) {
- if (colon < line)
- return 0;
- if (*--colon == ':')
- break;
- }
-
- if (!isdigit(colon[-4]) ||
- !isdigit(colon[-2]) ||
- !isdigit(colon[-1]) ||
- !isdigit(colon[ 1]) ||
- !isdigit(colon[ 2]))
- return 0;
-
- /* year */
- if (strtol(colon+3, NULL, 10) <= 90)
- return 0;
-
- /* Ok, close enough */
- return 1;
-}
-
static struct strbuf buf = STRBUF_INIT;
static int keep_cr;
static int mboxrd;
diff --git a/mailinfo.c b/mailinfo.c
index 9f19ca1..0ebd953 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -1035,3 +1035,34 @@ void clear_mailinfo(struct mailinfo *mi)
strbuf_release(&mi->log_message);
}
+
+int is_from_line(const char *line, int len)
+{
+ const char *colon;
+
+ if (len < 20 || memcmp("From ", line, 5))
+ return 0;
+
+ colon = line + len - 2;
+ line += 5;
+ for (;;) {
+ if (colon < line)
+ return 0;
+ if (*--colon == ':')
+ break;
+ }
+
+ if (!isdigit(colon[-4]) ||
+ !isdigit(colon[-2]) ||
+ !isdigit(colon[-1]) ||
+ !isdigit(colon[ 1]) ||
+ !isdigit(colon[ 2]))
+ return 0;
+
+ /* year */
+ if (strtol(colon+3, NULL, 10) <= 90)
+ return 0;
+
+ /* Ok, close enough */
+ return 1;
+}
diff --git a/mailinfo.h b/mailinfo.h
index 93776a7..c1430a0 100644
--- a/mailinfo.h
+++ b/mailinfo.h
@@ -37,5 +37,6 @@ struct mailinfo {
extern void setup_mailinfo(struct mailinfo *);
extern int mailinfo(struct mailinfo *, const char *msg, const char *patch);
extern void clear_mailinfo(struct mailinfo *);
+int is_from_line(const char *line, int len);
#endif /* MAILINFO_H */
diff --git a/pretty.c b/pretty.c
index 9fa42c2..898c0a3 100644
--- a/pretty.c
+++ b/pretty.c
@@ -10,6 +10,7 @@
#include "color.h"
#include "reflog-walk.h"
#include "gpg-interface.h"
+#include "mailinfo.h"
static char *user_format;
static struct cmt_fmt_map {
@@ -1745,9 +1746,18 @@ void pp_remainder(struct pretty_print_context *pp,
strbuf_add_tabexpand(sb, pp->expand_tabs_in_log,
line, linelen);
else {
- if (pp->fmt == CMIT_FMT_MBOXRD &&
- is_mboxrd_from(line, linelen))
- strbuf_addch(sb, '>');
+ switch (pp->fmt) {
+ case CMIT_FMT_EMAIL:
+ if (is_from_line(line, linelen))
+ strbuf_addch(sb, '>');
+ break;
+ case CMIT_FMT_MBOXRD:
+ if (is_mboxrd_from(line, linelen))
+ strbuf_addch(sb, '>');
+ break;
+ default:
+ break;
+ }
strbuf_add(sb, line, linelen);
}
diff --git a/t/t4014-format-patch.sh b/t/t4014-format-patch.sh
index 1206c48..8fa3982 100755
--- a/t/t4014-format-patch.sh
+++ b/t/t4014-format-patch.sh
@@ -1606,4 +1606,18 @@ test_expect_success 'format-patch --pretty=mboxrd' '
test_cmp expect actual
'
+test_expect_success 'format-patch From escaping' '
+ cat >msg <<-INPUT_END &&
+ somebody pasted format-patch output into a body
+
+ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+ INPUT_END
+
+ C=$(git commit-tree HEAD^^{tree} -p HEAD <msg) &&
+ git format-patch --stdout -1 $C~1..$C >patch &&
+ git grep -h --no-index \
+ ">From 0000000000000000000000000000000000000000 " \
+ patch
+'
+
test_done
--
EW
next reply other threads:[~2016-07-22 22:47 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-22 22:47 Eric Wong [this message]
2016-07-23 8:59 ` [PATCH] format-patch: escape "From " lines recognized by mailsplit Johannes Schindelin
2016-07-24 3:14 ` Eric Wong
2016-07-24 3:15 ` [PATCH 1/2] mailinfo: extract is_from_line from mailsplit Eric Wong
2016-07-24 7:37 ` Andreas Schwab
2016-07-24 8:05 ` Johannes Schindelin
2016-07-24 8:13 ` Andreas Schwab
2016-07-25 18:03 ` Junio C Hamano
2016-07-24 3:15 ` [PATCH 2/2] format-patch: escape "From " lines recognized by mailsplit Eric Wong
2016-07-24 7:37 ` Johannes Schindelin
2016-07-24 15:30 ` Jeff King
2016-07-24 7:11 ` [PATCH] " Junio C Hamano
2016-07-24 10:58 ` Eric Wong
2016-07-24 15:51 ` Junio C Hamano
2016-07-25 8:43 ` Eric Wong
2016-07-25 17:33 ` Junio C Hamano
2016-07-25 20:49 ` Eric Wong
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160722224739.GA22961@whir \
--to=e@80x24.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=sunshine@sunshineco.com \
/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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.