@@ -531,41 +531,24 @@ static size_t format_person_part(struct strbuf *sb, char part,
531
531
{
532
532
/* currently all placeholders have same length */
533
533
const int placeholder_len = 2 ;
534
- int start , end , tz = 0 ;
534
+ int tz ;
535
535
unsigned long date = 0 ;
536
- char * ep ;
537
- const char * name_start , * name_end , * mail_start , * mail_end , * msg_end = msg + len ;
538
536
char person_name [1024 ];
539
537
char person_mail [1024 ];
538
+ struct ident_split s ;
539
+ const char * name_start , * name_end , * mail_start , * mail_end ;
540
540
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 )
551
542
goto skip ;
552
543
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 ;
565
548
566
549
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 );
569
552
mailmap_name (person_mail , sizeof (person_mail ), person_name , sizeof (person_name ));
570
553
name_start = person_name ;
571
554
name_end = name_start + strlen (person_name );
@@ -581,28 +564,20 @@ static size_t format_person_part(struct strbuf *sb, char part,
581
564
return placeholder_len ;
582
565
}
583
566
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 )
591
568
goto skip ;
592
569
570
+ date = strtoul (s .date_begin , NULL , 10 );
571
+
593
572
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 );
595
574
return placeholder_len ;
596
575
}
597
576
598
577
/* 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 ;
606
581
607
582
switch (part ) {
608
583
case 'd' : /* date */
@@ -621,8 +596,9 @@ static size_t format_person_part(struct strbuf *sb, char part,
621
596
622
597
skip :
623
598
/*
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.
626
602
*/
627
603
if (part == 'n' || part == 'e' || part == 't' || part == 'd'
628
604
|| part == 'D' || part == 'r' || part == 'i' )
0 commit comments