--- 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>')
+ 'Foo Bar'
+ >>> person(b'"Foo Bar" <foo@bar>')
+ 'Foo Bar'
+ >>> person(b'"Foo \"buz\" Bar" <foo@bar>')
+ 'Foo "buz" Bar'
+ >>> # The following are invalid, but do exist in real-life
+ ...
+ >>> person(b'Foo "buz" Bar <foo@bar>')
+ 'Foo "buz" Bar'
+ >>> person(b'"Foo Bar <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):