mirror of git://git.kernel.org/pub/scm/git/git.git
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:
parent
9f23e04061
commit
c88098d7f1
|
@ -8,7 +8,8 @@ git-mailsplit - Simple UNIX mbox splitter program
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
[verse]
|
[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
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
@ -47,6 +48,10 @@ OPTIONS
|
||||||
--keep-cr::
|
--keep-cr::
|
||||||
Do not remove `\r` from lines ending with `\r\n`.
|
Do not remove `\r` from lines ending with `\r\n`.
|
||||||
|
|
||||||
|
--mboxrd::
|
||||||
|
Input is of the "mboxrd" format and "^>+From " line escaping is
|
||||||
|
reversed.
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
---
|
---
|
||||||
Part of the linkgit:git[1] suite
|
Part of the linkgit:git[1] suite
|
||||||
|
|
|
@ -45,6 +45,19 @@ static int is_from_line(const char *line, int len)
|
||||||
|
|
||||||
static struct strbuf buf = STRBUF_INIT;
|
static struct strbuf buf = STRBUF_INIT;
|
||||||
static int keep_cr;
|
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)
|
/* Called with the first line (potentially partial)
|
||||||
* already in buf[] -- normally that should begin with
|
* 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');
|
strbuf_addch(&buf, '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mboxrd && is_gtfrom(&buf))
|
||||||
|
strbuf_remove(&buf, 0, 1);
|
||||||
|
|
||||||
if (fwrite(buf.buf, 1, buf.len, output) != buf.len)
|
if (fwrite(buf.buf, 1, buf.len, output) != buf.len)
|
||||||
die_errno("cannot write output");
|
die_errno("cannot write output");
|
||||||
|
|
||||||
|
@ -271,6 +287,8 @@ int cmd_mailsplit(int argc, const char **argv, const char *prefix)
|
||||||
keep_cr = 1;
|
keep_cr = 1;
|
||||||
} else if ( arg[1] == 'o' && arg[2] ) {
|
} else if ( arg[1] == 'o' && arg[2] ) {
|
||||||
dir = arg+2;
|
dir = arg+2;
|
||||||
|
} else if (!strcmp(arg, "--mboxrd")) {
|
||||||
|
mboxrd = 1;
|
||||||
} else if ( arg[1] == '-' && !arg[2] ) {
|
} else if ( arg[1] == '-' && !arg[2] ) {
|
||||||
argp++; /* -- marks end of options */
|
argp++; /* -- marks end of options */
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -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_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
|
test_done
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
From the beginning, mbox should have been mboxrd
|
||||||
|
>From escaped
|
||||||
|
From not mangled but this line should have been escaped
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
>From unchanged
|
||||||
|
From also unchanged
|
||||||
|
no trailing space, no escaping necessary and '>' was intended:
|
||||||
|
>From
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue