Patchwork D3003: stringutil: improve check for failed mailmap line parsing

login
register
mail settings
Submitter phabricator
Date April 1, 2018, 1:59 a.m.
Message ID <6815186b918da129dd12ce95dfa08469@localhost.localdomain>
Download mbox | patch
Permalink /patch/30086/
State Not Applicable
Headers show

Comments

phabricator - April 1, 2018, 1:59 a.m.
This revision was automatically updated to reflect the committed changes.
Closed by commit rHG0e7550b0964c: stringutil: improve check for failed mailmap line parsing (authored by sheehan, committed by ).

CHANGED PRIOR TO COMMIT
  https://phab.mercurial-scm.org/D3003?vs=7479&id=7484#toc

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D3003?vs=7479&id=7484

REVISION DETAIL
  https://phab.mercurial-scm.org/D3003

AFFECTED FILES
  mercurial/utils/stringutil.py

CHANGE DETAILS




To: sheehan, #hg-reviewers, yuja
Cc: mercurial-devel

Patch

diff --git a/mercurial/utils/stringutil.py b/mercurial/utils/stringutil.py
--- a/mercurial/utils/stringutil.py
+++ b/mercurial/utils/stringutil.py
@@ -166,6 +166,30 @@ 
     email = attr.ib()
     name = attr.ib(default=None)
 
+def _ismailmaplineinvalid(names, emails):
+    '''Returns True if the parsed names and emails
+    in a mailmap entry are invalid.
+
+    >>> # No names or emails fails
+    >>> names, emails = [], []
+    >>> _ismailmaplineinvalid(names, emails)
+    True
+    >>> # Only one email fails
+    >>> emails = [b'email@email.com']
+    >>> _ismailmaplineinvalid(names, emails)
+    True
+    >>> # One email and one name passes
+    >>> names = [b'Test Name']
+    >>> _ismailmaplineinvalid(names, emails)
+    False
+    >>> # No names but two emails passes
+    >>> names = []
+    >>> emails = [b'proper@email.com', b'commit@email.com']
+    >>> _ismailmaplineinvalid(names, emails)
+    False
+    '''
+    return not emails or not names and len(emails) < 2
+
 def parsemailmap(mailmapcontent):
     """Parses data in the .mailmap format
 
@@ -199,7 +223,7 @@ 
 
         # Don't bother checking the line if it is a comment or
         # is an improperly formed author field
-        if line.lstrip().startswith('#') or any(c not in line for c in '<>@'):
+        if line.lstrip().startswith('#'):
             continue
 
         # names, emails hold the parsed emails and names for each line
@@ -230,6 +254,12 @@ 
                 # We have found another word in the committers name
                 namebuilder.append(element)
 
+        # Check to see if we have parsed the line into a valid form
+        # We require at least one email, and either at least one
+        # name or a second email
+        if _ismailmaplineinvalid(names, emails):
+            continue
+
         mailmapkey = mailmapping(
             email=emails[-1],
             name=names[-1] if len(names) == 2 else None,