@@ -531,41 +531,24 @@ static size_t format_person_part(struct strbuf *sb, char part,
531531{
532532 /* currently all placeholders have same length */
533533 const int placeholder_len = 2 ;
534- int start , end , tz = 0 ;
534+ int tz ;
535535 unsigned long date = 0 ;
536- char * ep ;
537- const char * name_start , * name_end , * mail_start , * mail_end , * msg_end = msg + len ;
538536 char person_name [1024 ];
539537 char person_mail [1024 ];
538+ struct ident_split s ;
539+ const char * name_start , * name_end , * mail_start , * mail_end ;
540540
541- /* advance 'end' to point to email start delimiter */
542- for (end = 0 ; end < len && msg [end ] != '<' ; end ++ )
543- ; /* do nothing */
544-
545- /*
546- * When end points at the '<' that we found, it should have
547- * matching '>' later, which means 'end' must be strictly
548- * below len - 1.
549- */
550- if (end >= len - 2 )
541+ if (split_ident_line (& s , msg , len ) < 0 )
551542 goto skip ;
552543
553- /* Seek for both name and email part */
554- name_start = msg ;
555- name_end = msg + end ;
556- while (name_end > name_start && isspace (* (name_end - 1 )))
557- name_end -- ;
558- mail_start = msg + end + 1 ;
559- mail_end = mail_start ;
560- while (mail_end < msg_end && * mail_end != '>' )
561- mail_end ++ ;
562- if (mail_end == msg_end )
563- goto skip ;
564- end = mail_end - msg ;
544+ name_start = s .name_begin ;
545+ name_end = s .name_end ;
546+ mail_start = s .mail_begin ;
547+ mail_end = s .mail_end ;
565548
566549 if (part == 'N' || part == 'E' ) { /* mailmap lookup */
567- strlcpy (person_name , name_start , name_end - name_start + 1 );
568- strlcpy (person_mail , mail_start , mail_end - mail_start + 1 );
550+ strlcpy (person_name , name_start , name_end - name_start + 1 );
551+ strlcpy (person_mail , mail_start , mail_end - mail_start + 1 );
569552 mailmap_name (person_mail , sizeof (person_mail ), person_name , sizeof (person_name ));
570553 name_start = person_name ;
571554 name_end = name_start + strlen (person_name );
@@ -581,28 +564,20 @@ static size_t format_person_part(struct strbuf *sb, char part,
581564 return placeholder_len ;
582565 }
583566
584- /* advance 'start' to point to date start delimiter */
585- for (start = end + 1 ; start < len && isspace (msg [start ]); start ++ )
586- ; /* do nothing */
587- if (start >= len )
588- goto skip ;
589- date = strtoul (msg + start , & ep , 10 );
590- if (msg + start == ep )
567+ if (!s .date_begin )
591568 goto skip ;
592569
570+ date = strtoul (s .date_begin , NULL , 10 );
571+
593572 if (part == 't' ) { /* date, UNIX timestamp */
594- strbuf_add (sb , msg + start , ep - ( msg + start ) );
573+ strbuf_add (sb , s . date_begin , s . date_end - s . date_begin );
595574 return placeholder_len ;
596575 }
597576
598577 /* parse tz */
599- for (start = ep - msg + 1 ; start < len && isspace (msg [start ]); start ++ )
600- ; /* do nothing */
601- if (start + 1 < len ) {
602- tz = strtoul (msg + start + 1 , NULL , 10 );
603- if (msg [start ] == '-' )
604- tz = - tz ;
605- }
578+ tz = strtoul (s .tz_begin + 1 , NULL , 10 );
579+ if (* s .tz_begin == '-' )
580+ tz = - tz ;
606581
607582 switch (part ) {
608583 case 'd' : /* date */
@@ -621,8 +596,9 @@ static size_t format_person_part(struct strbuf *sb, char part,
621596
622597skip :
623598 /*
624- * bogus commit, 'sb' cannot be updated, but we still need to
625- * compute a valid return value.
599+ * reading from either a bogus commit, or a reflog entry with
600+ * %gn, %ge, etc.; 'sb' cannot be updated, but we still need
601+ * to compute a valid return value.
626602 */
627603 if (part == 'n' || part == 'e' || part == 't' || part == 'd'
628604 || part == 'D' || part == 'r' || part == 'i' )
0 commit comments