]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jk/split-broken-ident' into maint
authorJunio C Hamano <gitster@pobox.com>
Thu, 7 Nov 2013 22:34:51 +0000 (14:34 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 7 Nov 2013 22:34:51 +0000 (14:34 -0800)
The fall-back parsing of commit objects with broken author or
committer lines were less robust than ideal in picking up the
timestamps.

* jk/split-broken-ident:
  split_ident: parse timestamp from end of line

ident.c
t/t4212-log-corrupt.sh

diff --git a/ident.c b/ident.c
index b29f81f83a68258b354c59df9bde40c254060ed9..1d9b6e770d02d12f77b417e05aca5134eccf1c40 100644 (file)
--- a/ident.c
+++ b/ident.c
@@ -233,7 +233,21 @@ int split_ident_line(struct ident_split *split, const char *line, int len)
        if (!split->mail_end)
                return status;
 
-       for (cp = split->mail_end + 1; cp < line + len && isspace(*cp); cp++)
+       /*
+        * Look from the end-of-line to find the trailing ">" of the mail
+        * address, even though we should already know it as split->mail_end.
+        * This can help in cases of broken idents with an extra ">" somewhere
+        * in the email address.  Note that we are assuming the timestamp will
+        * never have a ">" in it.
+        *
+        * Note that we will always find some ">" before going off the front of
+        * the string, because will always hit the split->mail_end closing
+        * bracket.
+        */
+       for (cp = line + len - 1; *cp != '>'; cp--)
+               ;
+
+       for (cp = cp + 1; cp < line + len && isspace(*cp); cp++)
                ;
        if (line + len <= cp)
                goto person_only;
index ec5099b83d7490184a68691ff2ca0e875cfab209..93c7c366cfeffa46cc72665f6ce676bd37c3c2fe 100755 (executable)
@@ -13,11 +13,16 @@ test_expect_success 'setup' '
        git update-ref refs/heads/broken_email $(cat broken_email.hash)
 '
 
+test_expect_success 'fsck notices broken commit' '
+       git fsck 2>actual &&
+       test_i18ngrep invalid.author actual
+'
+
 test_expect_success 'git log with broken author email' '
        {
                echo commit $(cat broken_email.hash)
                echo "Author: A U Thor <author@example.com>"
-               echo "Date:   Thu Jan 1 00:00:00 1970 +0000"
+               echo "Date:   Thu Apr 7 15:13:13 2005 -0700"
                echo
                echo "    foo"
        } >expect.out &&
@@ -30,7 +35,7 @@ test_expect_success 'git log with broken author email' '
 '
 
 test_expect_success 'git log --format with broken author email' '
-       echo "A U Thor+author@example.com+" >expect.out &&
+       echo "A U Thor+author@example.com+Thu Apr 7 15:13:13 2005 -0700" >expect.out &&
        : >expect.err &&
 
        git log --format="%an+%ae+%ad" broken_email >actual.out 2>actual.err &&