From f7ab5c793707082d41e19093f536cdc0d45d8830 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 6 Jan 2008 04:21:07 -0800 Subject: [PATCH] custom pretty format: tolerate empty e-mail address When e-mail address is empty (e.g. "A U Thor <>"), --pretty=format misparsed the commit header and did not pick up the date field correctly. Noticed by Marco, fixed slightly differently with additional sanity check and with a test. Signed-off-by: Junio C Hamano --- pretty.c | 16 ++++++++++++---- t/t6006-rev-list-format.sh | 10 ++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/pretty.c b/pretty.c index 5b1078beb6..b987ff245b 100644 --- a/pretty.c +++ b/pretty.c @@ -292,7 +292,18 @@ static void format_person_part(struct strbuf *sb, char part, /* parse name */ for (end = 0; end < len && msg[end] != '<'; end++) ; /* do nothing */ + /* + * If it does not even have a '<' and '>', that is + * quite a bogus commit author and we discard it; + * this is in line with add_user_info() that is used + * in the normal codepath. When end points at the '<' + * that we found, it should have matching '>' later, + * which means start (beginning of email address) must + * be strictly below len. + */ start = end + 1; + if (start >= len - 1) + return; while (end > 0 && isspace(msg[end - 1])) end--; if (part == 'n') { /* name */ @@ -300,11 +311,8 @@ static void format_person_part(struct strbuf *sb, char part, return; } - if (start >= len) - return; - /* parse email */ - for (end = start + 1; end < len && msg[end] != '>'; end++) + for (end = start; end < len && msg[end] != '>'; end++) ; /* do nothing */ if (end >= len) diff --git a/t/t6006-rev-list-format.sh b/t/t6006-rev-list-format.sh index 1e4541afea..0dc915ea67 100755 --- a/t/t6006-rev-list-format.sh +++ b/t/t6006-rev-list-format.sh @@ -139,4 +139,14 @@ commit 131a310eb913d107dd3c09a65d1651175898735d commit 86c75cfd708a0e5868dc876ed5b8bb66c80b4873 EOF +test_expect_success 'empty email' ' + test_tick && + C=$(GIT_AUTHOR_EMAIL= git commit-tree HEAD^{tree} failure + false + } +' + test_done -- 2.11.4.GIT