mercurial/utils/stringutil.py
changeset 45942 89a2afe31e82
parent 45724 ac39a8a214b1
child 46819 d4ba4d51f85f
equal deleted inserted replaced
45941:346af7687c6f 45942:89a2afe31e82
   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."""