# Check a patch for various format issues\r
#\r
# Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (C) 2020, Red Hat, Inc.<BR>\r
#\r
# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
SILENT, ONELINE, NORMAL = range(3)\r
level = NORMAL\r
\r
+class EmailAddressCheck:\r
+ """Checks an email address."""\r
+\r
+ def __init__(self, email):\r
+ self.ok = True\r
+\r
+ if email is None:\r
+ self.error('Email address is missing!')\r
+ return\r
+\r
+ self.check_email_address(email)\r
+\r
+ def error(self, *err):\r
+ if self.ok and Verbose.level > Verbose.ONELINE:\r
+ print('The email address is not valid:')\r
+ self.ok = False\r
+ if Verbose.level < Verbose.NORMAL:\r
+ return\r
+ count = 0\r
+ for line in err:\r
+ prefix = (' *', ' ')[count > 0]\r
+ print(prefix, line)\r
+ count += 1\r
+\r
+ email_re1 = re.compile(r'(?:\s*)(.*?)(\s*)<(.+)>\s*$',\r
+ re.MULTILINE|re.IGNORECASE)\r
+\r
+ def check_email_address(self, email):\r
+ email = email.strip()\r
+ mo = self.email_re1.match(email)\r
+ if mo is None:\r
+ self.error("Email format is invalid: " + email.strip())\r
+ return\r
+\r
+ name = mo.group(1).strip()\r
+ if name == '':\r
+ self.error("Name is not provided with email address: " +\r
+ email)\r
+ else:\r
+ quoted = len(name) > 2 and name[0] == '"' and name[-1] == '"'\r
+ if name.find(',') >= 0 and not quoted:\r
+ self.error('Add quotes (") around name with a comma: ' +\r
+ name)\r
+\r
+ if mo.group(2) == '':\r
+ self.error("There should be a space between the name and " +\r
+ "email address: " + email)\r
+\r
+ if mo.group(3).find(' ') >= 0:\r
+ self.error("The email address cannot contain a space: " +\r
+ mo.group(3))\r
+\r
class CommitMessageCheck:\r
"""Checks the contents of a git commit message."""\r
\r
if s[2] != ' ':\r
self.error("There should be a space after '" + sig + ":'")\r
\r
- self.check_email_address(s[3])\r
+ EmailAddressCheck(s[3])\r
\r
return sigs\r
\r
- email_re1 = re.compile(r'(?:\s*)(.*?)(\s*)<(.+)>\s*$',\r
- re.MULTILINE|re.IGNORECASE)\r
-\r
- def check_email_address(self, email):\r
- email = email.strip()\r
- mo = self.email_re1.match(email)\r
- if mo is None:\r
- self.error("Email format is invalid: " + email.strip())\r
- return\r
-\r
- name = mo.group(1).strip()\r
- if name == '':\r
- self.error("Name is not provided with email address: " +\r
- email)\r
- else:\r
- quoted = len(name) > 2 and name[0] == '"' and name[-1] == '"'\r
- if name.find(',') >= 0 and not quoted:\r
- self.error('Add quotes (") around name with a comma: ' +\r
- name)\r
-\r
- if mo.group(2) == '':\r
- self.error("There should be a space between the name and " +\r
- "email address: " + email)\r
-\r
- if mo.group(3).find(' ') >= 0:\r
- self.error("The email address cannot contain a space: " +\r
- mo.group(3))\r
-\r
def check_signed_off_by(self):\r
sob='Signed-off-by'\r
if self.msg.find(sob) < 0:\r
self.error('Empty commit message!')\r
return\r
\r
- if count >= 1 and len(lines[0]) >= 72:\r
+ if count >= 1 and len(lines[0].rstrip()) >= 72:\r
self.error('First line of commit message (subject line) ' +\r
'is too long.')\r
\r
else:\r
blank_line = True\r
print('Checking git commit:', commit)\r
+ email = self.read_committer_email_address_from_git(commit)\r
+ self.ok &= EmailAddressCheck(email, 'Committer').ok\r
patch = self.read_patch_from_git(commit)\r
self.ok &= CheckOnePatch(commit, patch).ok\r
if not commits:\r
\r
def read_patch_from_git(self, commit):\r
# Run git to get the commit patch\r
- return self.run_git('show', '--pretty=email', commit)\r
+ return self.run_git('show', '--pretty=email', '--no-textconv', commit)\r
+\r
+ def read_committer_email_address_from_git(self, commit):\r
+ # Run git to get the committer email\r
+ return self.run_git('show', '--pretty=%cn <%ce>', '--no-patch', commit)\r
\r
def run_git(self, *args):\r
cmd = [ 'git' ]\r