Skip to content

Commit

Permalink
mailinfo: -b option keeps [bracketed] strings that is not a [PATCH] m…
Browse files Browse the repository at this point in the history
…arker

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>
  • Loading branch information
Junio C Hamano committed Jul 29, 2009
1 parent 0a53e9d commit 17635fc
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 21 deletions.
7 changes: 6 additions & 1 deletion Documentation/git-mailinfo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
49 changes: 29 additions & 20 deletions builtin-mailinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
{
Expand All @@ -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"))
Expand Down

0 comments on commit 17635fc

Please sign in to comment.