mailinfo: -b option keeps [bracketed] strings that is not a [PATCH] marker

By default, we remove leading [bracketed] [strings] from the Subject:
header when coming up with the summary of the patch.  This is because
there are mailing lists etc that add their own headers to the subject, and
they know they can add things in brackets. The most obvious example is the
Linux kernel security list.  Their emails look like

 	Subject: [Security] [patch] random: make get_random_int() more random

and other people mangle Subject: themselves in a similar way, e.g.:

 	Subject: [PATCH -rc] [BUGFIX] x86: fix kernel_trap_sp()
 	Subject: [BUGFIX][PATCH] fix bad page removal from LRU (Was Re: [RFC][PATCH] ..

even though "fix" is more than enough cue to mark it as a [BUGFIX].

Some projects however want to keep these bracketed strings.  With this
option, we remove only [bracketed strings that contain word PATCH], so we
will turn things like these

	[PATCH] [mailinfo] -b ...
	[PATCH v2] [mailinfo] -b ...
	[PATCH (v2) 1/4] [mailinfo] -b ...

into

	[mailinfo] -b ...

This lacks tests and integration to the "git am" toolchain to be useful,
but it is a start.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2009-07-15 15:31:12 -07:00
parent 0a53e9ddea
commit 17635fc900
2 changed files with 35 additions and 21 deletions

View File

@ -8,7 +8,7 @@ git-mailinfo - Extracts patch and authorship from a single e-mail message
SYNOPSIS
--------
'git mailinfo' [-k] [-u | --encoding=<encoding> | -n] <msg> <patch>
'git mailinfo' [-k|-b] [-u | --encoding=<encoding> | -n] <msg> <patch>
DESCRIPTION
@ -32,6 +32,11 @@ OPTIONS
munging, and is most useful when used to read back
'git-format-patch -k' output.
-b::
When -k is not in effect, all leading strings bracketed with '['
and ']' pairs are stripped. This option limits the stripping to
only the pairs whose bracketed string contains the word "PATCH".
-u::
The commit log message, author name and author email are
taken from the e-mail, and after minimally decoding MIME

View File

@ -10,6 +10,7 @@
static FILE *cmitmsg, *patchfile, *fin, *fout;
static int keep_subject;
static int keep_non_patch_brackets_in_subject;
static const char *metainfo_charset;
static struct strbuf line = STRBUF_INIT;
static struct strbuf name = STRBUF_INIT;
@ -219,35 +220,41 @@ static int is_multipart_boundary(const struct strbuf *line)
static void cleanup_subject(struct strbuf *subject)
{
char *pos;
size_t remove;
while (subject->len) {
switch (*subject->buf) {
size_t at = 0;
while (at < subject->len) {
char *pos;
size_t remove;
switch (subject->buf[at]) {
case 'r': case 'R':
if (subject->len <= 3)
if (subject->len <= at + 3)
break;
if (!memcmp(subject->buf + 1, "e:", 2)) {
strbuf_remove(subject, 0, 3);
if (!memcmp(subject->buf + at + 1, "e:", 2)) {
strbuf_remove(subject, at, 3);
continue;
}
at++;
break;
case ' ': case '\t': case ':':
strbuf_remove(subject, 0, 1);
strbuf_remove(subject, at, 1);
continue;
case '[':
if ((pos = strchr(subject->buf, ']'))) {
remove = pos - subject->buf;
if (remove <= (subject->len - remove) * 2) {
strbuf_remove(subject, 0, remove + 1);
continue;
}
} else
strbuf_remove(subject, 0, 1);
break;
pos = strchr(subject->buf + at, ']');
if (!pos)
break;
remove = pos - subject->buf + at + 1;
if (!keep_non_patch_brackets_in_subject ||
(7 <= remove &&
memmem(subject->buf + at, remove, "PATCH", 5)))
strbuf_remove(subject, at, remove);
else
at += remove;
continue;
}
strbuf_trim(subject);
return;
break;
}
strbuf_trim(subject);
}
static void cleanup_space(struct strbuf *sb)
@ -931,7 +938,7 @@ static int mailinfo(FILE *in, FILE *out, int ks, const char *encoding,
}
static const char mailinfo_usage[] =
"git mailinfo [-k] [-u | --encoding=<encoding> | -n] msg patch <mail >info";
"git mailinfo [-k|-b] [-u | --encoding=<encoding> | -n] msg patch <mail >info";
int cmd_mailinfo(int argc, const char **argv, const char *prefix)
{
@ -948,6 +955,8 @@ int cmd_mailinfo(int argc, const char **argv, const char *prefix)
while (1 < argc && argv[1][0] == '-') {
if (!strcmp(argv[1], "-k"))
keep_subject = 1;
else if (!strcmp(argv[1], "-b"))
keep_non_patch_brackets_in_subject = 1;
else if (!strcmp(argv[1], "-u"))
metainfo_charset = def_charset;
else if (!strcmp(argv[1], "-n"))