diff -r f8e1f48de118 -r fb7140f1d09d mercurial/utils/stringutil.py --- a/mercurial/utils/stringutil.py Thu Mar 22 09:48:22 2018 -0400 +++ b/mercurial/utils/stringutil.py Tue Mar 27 11:01:13 2018 -0400 @@ -131,6 +131,33 @@ r = None return author[author.find('<') + 1:r] +def person(author): + """Returns the name before an email address, + interpreting it as per RFC 5322 + + >>> person(b'foo@bar') + 'foo' + >>> person(b'Foo Bar ') + 'Foo Bar' + >>> person(b'"Foo Bar" ') + 'Foo Bar' + >>> person(b'"Foo \"buz\" Bar" ') + 'Foo "buz" Bar' + >>> # The following are invalid, but do exist in real-life + ... + >>> person(b'Foo "buz" Bar ') + 'Foo "buz" Bar' + >>> person(b'"Foo Bar ') + 'Foo Bar' + """ + if '@' not in author: + return author + f = author.find('<') + if f != -1: + return author[:f].strip(' "').replace('\\"', '"') + f = author.find('@') + return author[:f].replace('.', ' ') + _correctauthorformat = remod.compile(br'^[^<]+\s\<[^<>]+@[^<>]+\>$') def isauthorwellformed(author):