Teach mailinfo to ignore everything before -- >8 -- mark
This teaches mailinfo the scissors -- >8 -- mark; the command ignores everything before it in the message body. For lefties among us, we also support -- 8< -- ;-) Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
606417bc6d
commit
200c75f0d6
@ -712,6 +712,56 @@ static inline int patchbreak(const struct strbuf *line)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int is_scissors_line(const struct strbuf *line)
|
||||||
|
{
|
||||||
|
size_t i, len = line->len;
|
||||||
|
int scissors = 0, gap = 0;
|
||||||
|
int first_nonblank = -1;
|
||||||
|
int last_nonblank = 0, visible, perforation = 0, in_perforation = 0;
|
||||||
|
const char *buf = line->buf;
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
if (isspace(buf[i])) {
|
||||||
|
if (in_perforation) {
|
||||||
|
perforation++;
|
||||||
|
gap++;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
last_nonblank = i;
|
||||||
|
if (first_nonblank < 0)
|
||||||
|
first_nonblank = i;
|
||||||
|
if (buf[i] == '-') {
|
||||||
|
in_perforation = 1;
|
||||||
|
perforation++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (i + 1 < len &&
|
||||||
|
(!memcmp(buf + i, ">8", 2) || !memcmp(buf + i, "8<", 2))) {
|
||||||
|
in_perforation = 1;
|
||||||
|
perforation += 2;
|
||||||
|
scissors += 2;
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
in_perforation = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The mark must be at least 8 bytes long (e.g. "-- >8 --").
|
||||||
|
* Even though there can be arbitrary cruft on the same line
|
||||||
|
* (e.g. "cut here"), in order to avoid misidentification, the
|
||||||
|
* perforation must occupy more than a third of the visible
|
||||||
|
* width of the line, and dashes and scissors must occupy more
|
||||||
|
* than half of the perforation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
visible = last_nonblank - first_nonblank + 1;
|
||||||
|
return (scissors && 8 <= visible &&
|
||||||
|
visible < perforation * 3 &&
|
||||||
|
gap * 2 < perforation);
|
||||||
|
}
|
||||||
|
|
||||||
static int handle_commit_msg(struct strbuf *line)
|
static int handle_commit_msg(struct strbuf *line)
|
||||||
{
|
{
|
||||||
static int still_looking = 1;
|
static int still_looking = 1;
|
||||||
@ -723,7 +773,8 @@ static int handle_commit_msg(struct strbuf *line)
|
|||||||
strbuf_ltrim(line);
|
strbuf_ltrim(line);
|
||||||
if (!line->len)
|
if (!line->len)
|
||||||
return 0;
|
return 0;
|
||||||
if ((still_looking = check_header(line, s_hdr_data, 0)) != 0)
|
still_looking = check_header(line, s_hdr_data, 0);
|
||||||
|
if (still_looking)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -731,6 +782,24 @@ static int handle_commit_msg(struct strbuf *line)
|
|||||||
if (metainfo_charset)
|
if (metainfo_charset)
|
||||||
convert_to_utf8(line, charset.buf);
|
convert_to_utf8(line, charset.buf);
|
||||||
|
|
||||||
|
if (is_scissors_line(line)) {
|
||||||
|
int i;
|
||||||
|
rewind(cmitmsg);
|
||||||
|
ftruncate(fileno(cmitmsg), 0);
|
||||||
|
still_looking = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We may have already read "secondary headers"; purge
|
||||||
|
* them to give ourselves a clean restart.
|
||||||
|
*/
|
||||||
|
for (i = 0; header[i]; i++) {
|
||||||
|
if (s_hdr_data[i])
|
||||||
|
strbuf_release(s_hdr_data[i]);
|
||||||
|
s_hdr_data[i] = NULL;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (patchbreak(line)) {
|
if (patchbreak(line)) {
|
||||||
fclose(cmitmsg);
|
fclose(cmitmsg);
|
||||||
cmitmsg = NULL;
|
cmitmsg = NULL;
|
||||||
|
@ -11,7 +11,7 @@ test_expect_success 'split sample box' \
|
|||||||
'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last &&
|
'git mailsplit -o. "$TEST_DIRECTORY"/t5100/sample.mbox >last &&
|
||||||
last=`cat last` &&
|
last=`cat last` &&
|
||||||
echo total is $last &&
|
echo total is $last &&
|
||||||
test `cat last` = 13'
|
test `cat last` = 14'
|
||||||
|
|
||||||
for mail in `echo 00*`
|
for mail in `echo 00*`
|
||||||
do
|
do
|
||||||
|
5
t/t5100/info0014
Normal file
5
t/t5100/info0014
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Author: Junio C Hamano
|
||||||
|
Email: gitster@pobox.com
|
||||||
|
Subject: Teach mailinfo to ignore everything before -- >8 -- mark
|
||||||
|
Date: Thu, 20 Aug 2009 17:18:22 -0700
|
||||||
|
|
4
t/t5100/msg0014
Normal file
4
t/t5100/msg0014
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
This teaches mailinfo the scissors -- >8 -- mark; the command ignores
|
||||||
|
everything before it in the message body.
|
||||||
|
|
||||||
|
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
64
t/t5100/patch0014
Normal file
64
t/t5100/patch0014
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
---
|
||||||
|
builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++-
|
||||||
|
1 files changed, 36 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c
|
||||||
|
index b0b5d8f..461c47e 100644
|
||||||
|
--- a/builtin-mailinfo.c
|
||||||
|
+++ b/builtin-mailinfo.c
|
||||||
|
@@ -712,6 +712,34 @@ static inline int patchbreak(const struct strbuf *line)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int scissors(const struct strbuf *line)
|
||||||
|
+{
|
||||||
|
+ size_t i, len = line->len;
|
||||||
|
+ int scissors_dashes_seen = 0;
|
||||||
|
+ const char *buf = line->buf;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < len; i++) {
|
||||||
|
+ if (isspace(buf[i]))
|
||||||
|
+ continue;
|
||||||
|
+ if (buf[i] == '-') {
|
||||||
|
+ scissors_dashes_seen |= 02;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (i + 1 < len && !memcmp(buf + i, ">8", 2)) {
|
||||||
|
+ scissors_dashes_seen |= 01;
|
||||||
|
+ i++;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (i + 7 < len && !memcmp(buf + i, "cut here", 8)) {
|
||||||
|
+ i += 7;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ /* everything else --- not scissors */
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ return scissors_dashes_seen == 03;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int handle_commit_msg(struct strbuf *line)
|
||||||
|
{
|
||||||
|
static int still_looking = 1;
|
||||||
|
@@ -723,10 +751,17 @@ static int handle_commit_msg(struct strbuf *line)
|
||||||
|
strbuf_ltrim(line);
|
||||||
|
if (!line->len)
|
||||||
|
return 0;
|
||||||
|
- if ((still_looking = check_header(line, s_hdr_data, 0)) != 0)
|
||||||
|
+ still_looking = check_header(line, s_hdr_data, 0);
|
||||||
|
+ if (still_looking)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (scissors(line)) {
|
||||||
|
+ fseek(cmitmsg, 0L, SEEK_SET);
|
||||||
|
+ still_looking = 1;
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* normalize the log message to UTF-8. */
|
||||||
|
if (metainfo_charset)
|
||||||
|
convert_to_utf8(line, charset.buf);
|
||||||
|
--
|
||||||
|
1.6.4.1
|
@ -561,3 +561,92 @@ From: <a.u.thor@example.com> (A U Thor)
|
|||||||
Date: Fri, 9 Jun 2006 00:44:16 -0700
|
Date: Fri, 9 Jun 2006 00:44:16 -0700
|
||||||
Subject: [PATCH] a patch
|
Subject: [PATCH] a patch
|
||||||
|
|
||||||
|
From nobody Mon Sep 17 00:00:00 2001
|
||||||
|
From: Junio Hamano <junkio@cox.net>
|
||||||
|
Date: Thu, 20 Aug 2009 17:18:22 -0700
|
||||||
|
Subject: Why doesn't git-am does not like >8 scissors mark?
|
||||||
|
|
||||||
|
Subject: [PATCH] BLAH ONE
|
||||||
|
|
||||||
|
In real life, we will see a discussion that inspired this patch
|
||||||
|
discussing related and unrelated things around >8 scissors mark
|
||||||
|
in this part of the message.
|
||||||
|
|
||||||
|
Subject: [PATCH] BLAH TWO
|
||||||
|
|
||||||
|
And then we will see the scissors.
|
||||||
|
|
||||||
|
This line is not a scissors mark -- >8 -- but talks about it.
|
||||||
|
- - >8 - - please remove everything above this line - - >8 - -
|
||||||
|
|
||||||
|
Subject: [PATCH] Teach mailinfo to ignore everything before -- >8 -- mark
|
||||||
|
From: Junio C Hamano <gitster@pobox.com>
|
||||||
|
|
||||||
|
This teaches mailinfo the scissors -- >8 -- mark; the command ignores
|
||||||
|
everything before it in the message body.
|
||||||
|
|
||||||
|
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
||||||
|
---
|
||||||
|
builtin-mailinfo.c | 37 ++++++++++++++++++++++++++++++++++++-
|
||||||
|
1 files changed, 36 insertions(+), 1 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/builtin-mailinfo.c b/builtin-mailinfo.c
|
||||||
|
index b0b5d8f..461c47e 100644
|
||||||
|
--- a/builtin-mailinfo.c
|
||||||
|
+++ b/builtin-mailinfo.c
|
||||||
|
@@ -712,6 +712,34 @@ static inline int patchbreak(const struct strbuf *line)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int scissors(const struct strbuf *line)
|
||||||
|
+{
|
||||||
|
+ size_t i, len = line->len;
|
||||||
|
+ int scissors_dashes_seen = 0;
|
||||||
|
+ const char *buf = line->buf;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < len; i++) {
|
||||||
|
+ if (isspace(buf[i]))
|
||||||
|
+ continue;
|
||||||
|
+ if (buf[i] == '-') {
|
||||||
|
+ scissors_dashes_seen |= 02;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (i + 1 < len && !memcmp(buf + i, ">8", 2)) {
|
||||||
|
+ scissors_dashes_seen |= 01;
|
||||||
|
+ i++;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (i + 7 < len && !memcmp(buf + i, "cut here", 8)) {
|
||||||
|
+ i += 7;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ /* everything else --- not scissors */
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ return scissors_dashes_seen == 03;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int handle_commit_msg(struct strbuf *line)
|
||||||
|
{
|
||||||
|
static int still_looking = 1;
|
||||||
|
@@ -723,10 +751,17 @@ static int handle_commit_msg(struct strbuf *line)
|
||||||
|
strbuf_ltrim(line);
|
||||||
|
if (!line->len)
|
||||||
|
return 0;
|
||||||
|
- if ((still_looking = check_header(line, s_hdr_data, 0)) != 0)
|
||||||
|
+ still_looking = check_header(line, s_hdr_data, 0);
|
||||||
|
+ if (still_looking)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (scissors(line)) {
|
||||||
|
+ fseek(cmitmsg, 0L, SEEK_SET);
|
||||||
|
+ still_looking = 1;
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* normalize the log message to UTF-8. */
|
||||||
|
if (metainfo_charset)
|
||||||
|
convert_to_utf8(line, charset.buf);
|
||||||
|
--
|
||||||
|
1.6.4.1
|
||||||
|
Loading…
Reference in New Issue
Block a user