From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Subject: [PATCH 1/6] shortlog: match both "Author:" and "author" on stdin
Date: Fri, 15 Jan 2016 12:08:23 -0500 [thread overview]
Message-ID: <20160115170823.GA21102@sigill.intra.peff.net> (raw)
In-Reply-To: <20160115170627.GA20983@sigill.intra.peff.net>
The original git-shortlog could read both the normal "git
log" output as well as "git log --format=raw". However, when it was
converted to C by b8ec592 (Build in shortlog, 2006-10-22),
the trailing colon became mandatory, and we no longer
matched the raw output.
Given the amount of intervening time without any bug
reports, it's probable that nobody cares. But given that
it's easy to fix, and that the end result is hopefully more
obvious and flexible (it could now easily accomodate matching
"Committer"), let's just make it work.
Signed-off-by: Jeff King <peff@peff.net>
---
Another option would be to assume that nobody cares about
"--format=raw" and just do:
if (!skip_prefix(author, "Author: ", &v))
continue;
That technically breaks somebody who was feeding shortlog output that
contains "author: ", but since Git itself doesn't generate that, it
seems rather unlikely.
builtin/shortlog.c | 27 ++++++++++++++++++++++++---
t/t4201-shortlog.sh | 6 ++++++
2 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 35ebd17..fe9fa2f 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -89,13 +89,34 @@ static void insert_one_record(struct shortlog *log,
string_list_append(item->util, buffer);
}
+/*
+ * If header is "author", match candidate against the regex /[Aa]uthor:? /,
+ * and return a pointer to the remainder of the string in out_value.
+ */
+static int match_ident_header(const char *candidate, const char *header,
+ const char **out_value)
+{
+ const char *v;
+
+ if (tolower(*candidate++) != tolower(*header++))
+ return 0;
+ if (!skip_prefix(candidate, header, &v))
+ return 0;
+ if (*v == ':')
+ v++;
+ if (*v++ != ' ')
+ return 0;
+ *out_value = v;
+ return 1;
+}
+
static void read_from_stdin(struct shortlog *log)
{
char author[1024], oneline[1024];
while (fgets(author, sizeof(author), stdin) != NULL) {
- if (!(author[0] == 'A' || author[0] == 'a') ||
- !starts_with(author + 1, "uthor: "))
+ const char *v;
+ if (!match_ident_header(author, "author", &v))
continue;
while (fgets(oneline, sizeof(oneline), stdin) &&
oneline[0] != '\n')
@@ -103,7 +124,7 @@ static void read_from_stdin(struct shortlog *log)
while (fgets(oneline, sizeof(oneline), stdin) &&
oneline[0] == '\n')
; /* discard blanks */
- insert_one_record(log, author + 8, oneline);
+ insert_one_record(log, v, oneline);
}
}
diff --git a/t/t4201-shortlog.sh b/t/t4201-shortlog.sh
index 7600a3e..82b2314 100755
--- a/t/t4201-shortlog.sh
+++ b/t/t4201-shortlog.sh
@@ -120,6 +120,12 @@ test_expect_success !MINGW 'shortlog from non-git directory' '
test_cmp expect out
'
+test_expect_success !MINGW 'shortlog can read --format=raw output' '
+ git log --format=raw HEAD >log &&
+ GIT_DIR=non-existing git shortlog -w <log >out &&
+ test_cmp expect out
+'
+
test_expect_success 'shortlog should add newline when input line matches wraplen' '
cat >expect <<\EOF &&
A U Thor (2):
--
2.7.0.244.g0701a9d
next prev parent reply other threads:[~2016-01-15 17:08 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-15 17:06 [PATCH 0/6] shortlog fixes and optimizations Jeff King
2016-01-15 17:08 ` Jeff King [this message]
2016-01-15 23:19 ` [PATCH 1/6] shortlog: match both "Author:" and "author" on stdin Eric Sunshine
2016-01-18 19:27 ` Jeff King
2016-01-18 19:26 ` Jeff King
2016-01-18 19:55 ` Junio C Hamano
2016-01-18 20:01 ` [PATCH v2 0/6] shortlog fixes and optimizations Jeff King
2016-01-18 20:02 ` [PATCH 1/6] shortlog: match both "Author:" and "author" on stdin Jeff King
2016-01-18 20:02 ` [PATCH 2/6] shortlog: use strbufs to read from stdin Jeff King
2016-01-18 20:02 ` [PATCH 3/6] shortlog: replace hand-parsing of author with pretty-printer Jeff King
2016-01-18 20:13 ` Jeff King
2016-01-18 23:04 ` Jeff King
2016-01-19 3:47 ` Junio C Hamano
2016-01-18 20:02 ` [PATCH 4/6] shortlog: optimize "--summary" mode Jeff King
2016-01-18 20:02 ` [PATCH 5/6] shortlog: optimize out useless "<none>" normalization Jeff King
2016-01-18 20:02 ` [PATCH 6/6] shortlog: optimize out useless string list Jeff King
2016-01-15 17:08 ` [PATCH 2/6] shortlog: use strbufs to read from stdin Jeff King
2016-01-15 17:09 ` [PATCH 3/6] shortlog: replace hand-parsing of author with pretty-printer Jeff King
2016-01-15 17:09 ` [PATCH 4/6] shortlog: optimize "--summary" mode Jeff King
2016-01-15 17:10 ` [PATCH 5/6] shortlog: optimize out useless "<none>" normalization Jeff King
2016-01-15 17:10 ` [PATCH 6/6] shortlog: optimize out useless string list Jeff King
2016-01-15 22:11 ` [PATCH 0/6] shortlog fixes and optimizations Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160115170823.GA21102@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).