equal
deleted
inserted
replaced
492 return author[:f].replace(b'.', b' ') |
492 return author[:f].replace(b'.', b' ') |
493 |
493 |
494 |
494 |
495 @attr.s(hash=True) |
495 @attr.s(hash=True) |
496 class mailmapping(object): |
496 class mailmapping(object): |
497 '''Represents a username/email key or value in |
497 """Represents a username/email key or value in |
498 a mailmap file''' |
498 a mailmap file""" |
499 |
499 |
500 email = attr.ib() |
500 email = attr.ib() |
501 name = attr.ib(default=None) |
501 name = attr.ib(default=None) |
502 |
502 |
503 |
503 |
504 def _ismailmaplineinvalid(names, emails): |
504 def _ismailmaplineinvalid(names, emails): |
505 '''Returns True if the parsed names and emails |
505 """Returns True if the parsed names and emails |
506 in a mailmap entry are invalid. |
506 in a mailmap entry are invalid. |
507 |
507 |
508 >>> # No names or emails fails |
508 >>> # No names or emails fails |
509 >>> names, emails = [], [] |
509 >>> names, emails = [], [] |
510 >>> _ismailmaplineinvalid(names, emails) |
510 >>> _ismailmaplineinvalid(names, emails) |
520 >>> # No names but two emails passes |
520 >>> # No names but two emails passes |
521 >>> names = [] |
521 >>> names = [] |
522 >>> emails = [b'proper@email.com', b'commit@email.com'] |
522 >>> emails = [b'proper@email.com', b'commit@email.com'] |
523 >>> _ismailmaplineinvalid(names, emails) |
523 >>> _ismailmaplineinvalid(names, emails) |
524 False |
524 False |
525 ''' |
525 """ |
526 return not emails or not names and len(emails) < 2 |
526 return not emails or not names and len(emails) < 2 |
527 |
527 |
528 |
528 |
529 def parsemailmap(mailmapcontent): |
529 def parsemailmap(mailmapcontent): |
530 """Parses data in the .mailmap format |
530 """Parses data in the .mailmap format |
595 # name or a second email |
595 # name or a second email |
596 if _ismailmaplineinvalid(names, emails): |
596 if _ismailmaplineinvalid(names, emails): |
597 continue |
597 continue |
598 |
598 |
599 mailmapkey = mailmapping( |
599 mailmapkey = mailmapping( |
600 email=emails[-1], name=names[-1] if len(names) == 2 else None, |
600 email=emails[-1], |
|
601 name=names[-1] if len(names) == 2 else None, |
601 ) |
602 ) |
602 |
603 |
603 mailmap[mailmapkey] = mailmapping( |
604 mailmap[mailmapkey] = mailmapping( |
604 email=emails[0], name=names[0] if names else None, |
605 email=emails[0], |
|
606 name=names[0] if names else None, |
605 ) |
607 ) |
606 |
608 |
607 return mailmap |
609 return mailmap |
608 |
610 |
609 |
611 |
657 |
659 |
658 _correctauthorformat = remod.compile(br'^[^<]+\s<[^<>]+@[^<>]+>$') |
660 _correctauthorformat = remod.compile(br'^[^<]+\s<[^<>]+@[^<>]+>$') |
659 |
661 |
660 |
662 |
661 def isauthorwellformed(author): |
663 def isauthorwellformed(author): |
662 '''Return True if the author field is well formed |
664 """Return True if the author field is well formed |
663 (ie "Contributor Name <contrib@email.dom>") |
665 (ie "Contributor Name <contrib@email.dom>") |
664 |
666 |
665 >>> isauthorwellformed(b'Good Author <good@author.com>') |
667 >>> isauthorwellformed(b'Good Author <good@author.com>') |
666 True |
668 True |
667 >>> isauthorwellformed(b'Author <good@author.com>') |
669 >>> isauthorwellformed(b'Author <good@author.com>') |
674 False |
676 False |
675 >>> isauthorwellformed(b'<author@author.com>') |
677 >>> isauthorwellformed(b'<author@author.com>') |
676 False |
678 False |
677 >>> isauthorwellformed(b'Bad Author <author>') |
679 >>> isauthorwellformed(b'Bad Author <author>') |
678 False |
680 False |
679 ''' |
681 """ |
680 return _correctauthorformat.match(author) is not None |
682 return _correctauthorformat.match(author) is not None |
681 |
683 |
682 |
684 |
683 def ellipsis(text, maxlength=400): |
685 def ellipsis(text, maxlength=400): |
684 """Trim string to at most maxlength (default: 400) columns in display.""" |
686 """Trim string to at most maxlength (default: 400) columns in display.""" |