mailsplit: support unescaping mboxrd messages

This will allow us to parse the output of --pretty=mboxrd
and the output of other mboxrd generators.

Signed-off-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Eric Wong 2016-06-05 04:46:40 +00:00 committed by Junio C Hamano
parent 9f23e04061
commit c88098d7f1
6 changed files with 83 additions and 1 deletions

View File

@ -8,7 +8,8 @@ git-mailsplit - Simple UNIX mbox splitter program
SYNOPSIS
--------
[verse]
'git mailsplit' [-b] [-f<nn>] [-d<prec>] [--keep-cr] -o<directory> [--] [(<mbox>|<Maildir>)...]
'git mailsplit' [-b] [-f<nn>] [-d<prec>] [--keep-cr] [--mboxrd]
-o<directory> [--] [(<mbox>|<Maildir>)...]
DESCRIPTION
-----------
@ -47,6 +48,10 @@ OPTIONS
--keep-cr::
Do not remove `\r` from lines ending with `\r\n`.
--mboxrd::
Input is of the "mboxrd" format and "^>+From " line escaping is
reversed.
GIT
---
Part of the linkgit:git[1] suite

View File

@ -45,6 +45,19 @@ static int is_from_line(const char *line, int len)
static struct strbuf buf = STRBUF_INIT;
static int keep_cr;
static int mboxrd;
static int is_gtfrom(const struct strbuf *buf)
{
size_t min = strlen(">From ");
size_t ngt;
if (buf->len < min)
return 0;
ngt = strspn(buf->buf, ">");
return ngt && starts_with(buf->buf + ngt, "From ");
}
/* Called with the first line (potentially partial)
* already in buf[] -- normally that should begin with
@ -77,6 +90,9 @@ static int split_one(FILE *mbox, const char *name, int allow_bare)
strbuf_addch(&buf, '\n');
}
if (mboxrd && is_gtfrom(&buf))
strbuf_remove(&buf, 0, 1);
if (fwrite(buf.buf, 1, buf.len, output) != buf.len)
die_errno("cannot write output");
@ -271,6 +287,8 @@ int cmd_mailsplit(int argc, const char **argv, const char *prefix)
keep_cr = 1;
} else if ( arg[1] == 'o' && arg[2] ) {
dir = arg+2;
} else if (!strcmp(arg, "--mboxrd")) {
mboxrd = 1;
} else if ( arg[1] == '-' && !arg[2] ) {
argp++; /* -- marks end of options */
break;

View File

@ -111,4 +111,35 @@ test_expect_success 'mailinfo on message with quoted >From' '
test_cmp "$TEST_DIRECTORY"/t5100/quoted-from.expect quoted-from/msg
'
test_expect_success 'mailinfo unescapes with --mboxrd' '
mkdir mboxrd &&
git mailsplit -omboxrd --mboxrd \
"$TEST_DIRECTORY"/t5100/sample.mboxrd >last &&
test x"$(cat last)" = x2 &&
for i in 0001 0002
do
git mailinfo mboxrd/msg mboxrd/patch \
<mboxrd/$i >mboxrd/out &&
test_cmp "$TEST_DIRECTORY"/t5100/${i}mboxrd mboxrd/msg
done &&
sp=" " &&
echo "From " >expect &&
echo "From " >>expect &&
echo >> expect &&
cat >sp <<-INPUT_END &&
From mboxrd Mon Sep 17 00:00:00 2001
From: trailing spacer <sp@example.com>
Subject: [PATCH] a commit with trailing space
From$sp
>From$sp
INPUT_END
git mailsplit -f2 -omboxrd --mboxrd <sp >last &&
test x"$(cat last)" = x1 &&
git mailinfo mboxrd/msg mboxrd/patch <mboxrd/0003 &&
test_cmp expect mboxrd/msg
'
test_done

4
t/t5100/0001mboxrd Normal file
View File

@ -0,0 +1,4 @@
From the beginning, mbox should have been mboxrd
>From escaped
From not mangled but this line should have been escaped

5
t/t5100/0002mboxrd Normal file
View File

@ -0,0 +1,5 @@
>From unchanged
From also unchanged
no trailing space, no escaping necessary and '>' was intended:
>From

19
t/t5100/sample.mboxrd Normal file
View File

@ -0,0 +1,19 @@
From mboxrd Mon Sep 17 00:00:00 2001
From: mboxrd writer <mboxrd@example.com>
Date: Fri, 9 Jun 2006 00:44:16 -0700
Subject: [PATCH] a commit with escaped From lines
>From the beginning, mbox should have been mboxrd
>>From escaped
From not mangled but this line should have been escaped
From mboxrd Mon Sep 17 00:00:00 2001
From: mboxrd writer <mboxrd@example.com>
Date: Fri, 9 Jun 2006 00:44:16 -0700
Subject: [PATCH 2/2] another with fake From lines
>From unchanged
From also unchanged
no trailing space, no escaping necessary and '>' was intended:
>From