public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses
@ 2020-01-02 15:25 Philippe Mathieu-Daudé
  2020-01-02 15:25 ` [PATCH 1/4] BaseTools/PatchCheck.py: Extract email check code to EmailAddressCheck Philippe Mathieu-Daudé
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 15:25 UTC (permalink / raw)
  To: devel
  Cc: Laszlo Ersek, Michael D Kinney, Philippe Mathieu-Daude,
	Liming Gao, Jordan Justen

Last month I cleaned the git-history incorrect email
addresses: https://edk2.groups.io/g/devel/message/51834
but today I noticed more incorrect addresses got committed
(see caa917491a4..33a3293651).
To avoid having the same cleanup in the future, fix the
problem once for all by having PatchCheck doing this
automatically (on merge).

Since we already have code to check email address in
PatchCheck, factor the code out to reuse it, and
add checks for committer/author addresses.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>

Philippe Mathieu-Daude (4):
  BaseTools/PatchCheck.py: Extract email check code to EmailAddressCheck
  BaseTools/PatchCheck.py: Let EmailAddressCheck describe email checked
  BaseTools/PatchCheck.py: Check the patch author email address
  BaseTools/PatchCheck.py: Check the committer email address

 BaseTools/Scripts/PatchCheck.py | 99 +++++++++++++++++++++++----------
 1 file changed, 69 insertions(+), 30 deletions(-)

-- 
2.21.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/4] BaseTools/PatchCheck.py: Extract email check code to EmailAddressCheck
  2020-01-02 15:25 [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Philippe Mathieu-Daudé
@ 2020-01-02 15:25 ` Philippe Mathieu-Daudé
  2020-01-02 15:25 ` [PATCH 2/4] BaseTools/PatchCheck.py: Let EmailAddressCheck describe email checked Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 15:25 UTC (permalink / raw)
  To: devel
  Cc: Laszlo Ersek, Michael D Kinney, Philippe Mathieu-Daude,
	Liming Gao, Jordan Justen

As we are going to reuse this code out of the CommitMessageCheck
class, extract it in a new class: EmailAddressCheck.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Signed-off-by: Philippe Mathieu-Daude <philmd@redhat.com>
---
 BaseTools/Scripts/PatchCheck.py | 82 +++++++++++++++++++++------------
 1 file changed, 53 insertions(+), 29 deletions(-)

diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py
index 2a4e6f603e79..0e654345fcc8 100755
--- a/BaseTools/Scripts/PatchCheck.py
+++ b/BaseTools/Scripts/PatchCheck.py
@@ -22,6 +22,58 @@ class Verbose:
     SILENT, ONELINE, NORMAL = range(3)
     level = NORMAL
 
+class EmailAddressCheck:
+    """Checks an email address."""
+
+    def __init__(self, email):
+        self.ok = True
+
+        if email is None:
+            self.error('Email address is missing!')
+            return
+
+        self.check_email_address(email)
+
+    def error(self, *err):
+        if self.ok and Verbose.level > Verbose.ONELINE:
+            print('The email address is not valid:')
+        self.ok = False
+        if Verbose.level < Verbose.NORMAL:
+            return
+        count = 0
+        for line in err:
+            prefix = (' *', '  ')[count > 0]
+            print(prefix, line)
+            count += 1
+
+    email_re1 = re.compile(r'(?:\s*)(.*?)(\s*)<(.+)>\s*$',
+                           re.MULTILINE|re.IGNORECASE)
+
+    def check_email_address(self, email):
+        email = email.strip()
+        mo = self.email_re1.match(email)
+        if mo is None:
+            self.error("Email format is invalid: " + email.strip())
+            return
+
+        name = mo.group(1).strip()
+        if name == '':
+            self.error("Name is not provided with email address: " +
+                       email)
+        else:
+            quoted = len(name) > 2 and name[0] == '"' and name[-1] == '"'
+            if name.find(',') >= 0 and not quoted:
+                self.error('Add quotes (") around name with a comma: ' +
+                           name)
+
+        if mo.group(2) == '':
+            self.error("There should be a space between the name and " +
+                       "email address: " + email)
+
+        if mo.group(3).find(' ') >= 0:
+            self.error("The email address cannot contain a space: " +
+                       mo.group(3))
+
 class CommitMessageCheck:
     """Checks the contents of a git commit message."""
 
@@ -121,38 +173,10 @@ class CommitMessageCheck:
             if s[2] != ' ':
                 self.error("There should be a space after '" + sig + ":'")
 
-            self.check_email_address(s[3])
+            EmailAddressCheck(s[3])
 
         return sigs
 
-    email_re1 = re.compile(r'(?:\s*)(.*?)(\s*)<(.+)>\s*$',
-                           re.MULTILINE|re.IGNORECASE)
-
-    def check_email_address(self, email):
-        email = email.strip()
-        mo = self.email_re1.match(email)
-        if mo is None:
-            self.error("Email format is invalid: " + email.strip())
-            return
-
-        name = mo.group(1).strip()
-        if name == '':
-            self.error("Name is not provided with email address: " +
-                       email)
-        else:
-            quoted = len(name) > 2 and name[0] == '"' and name[-1] == '"'
-            if name.find(',') >= 0 and not quoted:
-                self.error('Add quotes (") around name with a comma: ' +
-                           name)
-
-        if mo.group(2) == '':
-            self.error("There should be a space between the name and " +
-                       "email address: " + email)
-
-        if mo.group(3).find(' ') >= 0:
-            self.error("The email address cannot contain a space: " +
-                       mo.group(3))
-
     def check_signed_off_by(self):
         sob='Signed-off-by'
         if self.msg.find(sob) < 0:
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/4] BaseTools/PatchCheck.py: Let EmailAddressCheck describe email checked
  2020-01-02 15:25 [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Philippe Mathieu-Daudé
  2020-01-02 15:25 ` [PATCH 1/4] BaseTools/PatchCheck.py: Extract email check code to EmailAddressCheck Philippe Mathieu-Daudé
@ 2020-01-02 15:25 ` Philippe Mathieu-Daudé
  2020-01-02 15:25 ` [PATCH 3/4] BaseTools/PatchCheck.py: Check the patch author email address Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 15:25 UTC (permalink / raw)
  To: devel
  Cc: Laszlo Ersek, Michael D Kinney, Philippe Mathieu-Daude,
	Liming Gao, Jordan Justen

We are checking different emails from the signature list. We are
going to check more. To be able to differency, add a description
field, so the error reported is clearer.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Signed-off-by: Philippe Mathieu-Daude <philmd@redhat.com>
---
 BaseTools/Scripts/PatchCheck.py | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py
index 0e654345fcc8..a0ff5ec0038a 100755
--- a/BaseTools/Scripts/PatchCheck.py
+++ b/BaseTools/Scripts/PatchCheck.py
@@ -25,18 +25,22 @@ class Verbose:
 class EmailAddressCheck:
     """Checks an email address."""
 
-    def __init__(self, email):
+    def __init__(self, email, description):
         self.ok = True
 
         if email is None:
             self.error('Email address is missing!')
             return
+        if description is None:
+            self.error('Email description is missing!')
+            return
 
+        self.description = "'" + description + "'"
         self.check_email_address(email)
 
     def error(self, *err):
         if self.ok and Verbose.level > Verbose.ONELINE:
-            print('The email address is not valid:')
+            print('The ' + self.description + ' email address is not valid:')
         self.ok = False
         if Verbose.level < Verbose.NORMAL:
             return
@@ -173,7 +177,7 @@ class CommitMessageCheck:
             if s[2] != ' ':
                 self.error("There should be a space after '" + sig + ":'")
 
-            EmailAddressCheck(s[3])
+            EmailAddressCheck(s[3], sig)
 
         return sigs
 
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/4] BaseTools/PatchCheck.py: Check the patch author email address
  2020-01-02 15:25 [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Philippe Mathieu-Daudé
  2020-01-02 15:25 ` [PATCH 1/4] BaseTools/PatchCheck.py: Extract email check code to EmailAddressCheck Philippe Mathieu-Daudé
  2020-01-02 15:25 ` [PATCH 2/4] BaseTools/PatchCheck.py: Let EmailAddressCheck describe email checked Philippe Mathieu-Daudé
@ 2020-01-02 15:25 ` Philippe Mathieu-Daudé
  2020-01-02 15:25 ` [RFC PATCH 4/4] BaseTools/PatchCheck.py: Check the committer " Philippe Mathieu-Daudé
  2020-01-03 13:11 ` [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Laszlo Ersek
  4 siblings, 0 replies; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 15:25 UTC (permalink / raw)
  To: devel
  Cc: Laszlo Ersek, Michael D Kinney, Philippe Mathieu-Daude,
	Liming Gao, Jordan Justen

To avoid patches committed with incorrect email address,
use the EmailAddressCheck class on the author email too.

Example:

  $ python BaseTools/Scripts/PatchCheck.py 1a04951309f
  Checking git commit: 1a04951309f
  The 'Author' email address is not valid:
  * The email address cannot contain a space: /o=Intel/ou=External \
    (FYDIBOHF25SPDLT)/cn=Recipients/cn=fe425ca7e5f4401abed22b904fe5d964

Cc: Liming Gao <liming.gao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Signed-off-by: Philippe Mathieu-Daude <philmd@redhat.com>
---
 BaseTools/Scripts/PatchCheck.py | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py
index a0ff5ec0038a..f0e661bfd6e3 100755
--- a/BaseTools/Scripts/PatchCheck.py
+++ b/BaseTools/Scripts/PatchCheck.py
@@ -450,6 +450,9 @@ class CheckOnePatch:
         self.patch = patch
         self.find_patch_pieces()
 
+        email_check = EmailAddressCheck(self.author_email, 'Author')
+        email_ok = email_check.ok
+
         msg_check = CommitMessageCheck(self.commit_subject, self.commit_msg)
         msg_ok = msg_check.ok
 
@@ -458,7 +461,7 @@ class CheckOnePatch:
             diff_check = GitDiffCheck(self.diff)
             diff_ok = diff_check.ok
 
-        self.ok = msg_ok and diff_ok
+        self.ok = email_ok and msg_ok and diff_ok
 
         if Verbose.level == Verbose.ONELINE:
             if self.ok:
@@ -536,6 +539,8 @@ class CheckOnePatch:
         self.commit_subject = self.commit_subject.replace('\n', '')
         self.commit_subject = self.subject_prefix_re.sub('', self.commit_subject, 1)
 
+        self.author_email = pmail['from']
+
 class CheckGitCommits:
     """Reads patches from git based on the specified git revision range.
 
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [RFC PATCH 4/4] BaseTools/PatchCheck.py: Check the committer email address
  2020-01-02 15:25 [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2020-01-02 15:25 ` [PATCH 3/4] BaseTools/PatchCheck.py: Check the patch author email address Philippe Mathieu-Daudé
@ 2020-01-02 15:25 ` Philippe Mathieu-Daudé
  2020-01-03 22:59   ` Jordan Justen
  2020-01-03 13:11 ` [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Laszlo Ersek
  4 siblings, 1 reply; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-02 15:25 UTC (permalink / raw)
  To: devel
  Cc: Laszlo Ersek, Michael D Kinney, Philippe Mathieu-Daude,
	Liming Gao, Jordan Justen

To avoid patches committed with incorrect email address,
use the EmailAddressCheck class on the committer email too.

Cc: Liming Gao <liming.gao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Signed-off-by: Philippe Mathieu-Daude <philmd@redhat.com>
---
RFC because I haven't checked --pretty="%cn <%ce>" works on Windows shell.

 BaseTools/Scripts/PatchCheck.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py
index f0e661bfd6e3..3baeb3de7ba2 100755
--- a/BaseTools/Scripts/PatchCheck.py
+++ b/BaseTools/Scripts/PatchCheck.py
@@ -560,6 +560,8 @@ class CheckGitCommits:
                 else:
                     blank_line = True
                 print('Checking git commit:', commit)
+            email = self.read_committer_email_address_from_git(commit)
+            self.ok &= EmailAddressCheck(email, 'Committer').ok
             patch = self.read_patch_from_git(commit)
             self.ok &= CheckOnePatch(commit, patch).ok
         if not commits:
@@ -578,6 +580,10 @@ class CheckGitCommits:
         # Run git to get the commit patch
         return self.run_git('show', '--pretty=email', '--no-textconv', commit)
 
+    def read_committer_email_address_from_git(self, commit):
+        # Run git to get the committer email
+        return self.run_git('show', '--pretty="%cn <%ce>"', '--no-patch', commit)
+
     def run_git(self, *args):
         cmd = [ 'git' ]
         cmd += args
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses
  2020-01-02 15:25 [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2020-01-02 15:25 ` [RFC PATCH 4/4] BaseTools/PatchCheck.py: Check the committer " Philippe Mathieu-Daudé
@ 2020-01-03 13:11 ` Laszlo Ersek
  4 siblings, 0 replies; 8+ messages in thread
From: Laszlo Ersek @ 2020-01-03 13:11 UTC (permalink / raw)
  To: Philippe Mathieu-Daude, devel; +Cc: Michael D Kinney, Liming Gao, Jordan Justen

Hi,

On 01/02/20 16:25, Philippe Mathieu-Daude wrote:
> Last month I cleaned the git-history incorrect email
> addresses: https://edk2.groups.io/g/devel/message/51834
> but today I noticed more incorrect addresses got committed
> (see caa917491a4..33a3293651).
> To avoid having the same cleanup in the future, fix the
> problem once for all by having PatchCheck doing this
> automatically (on merge).
> 
> Since we already have code to check email address in
> PatchCheck, factor the code out to reuse it, and
> add checks for committer/author addresses.
> 
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Jordan Justen <jordan.l.justen@intel.com>
> 
> Philippe Mathieu-Daude (4):
>   BaseTools/PatchCheck.py: Extract email check code to EmailAddressCheck
>   BaseTools/PatchCheck.py: Let EmailAddressCheck describe email checked
>   BaseTools/PatchCheck.py: Check the patch author email address
>   BaseTools/PatchCheck.py: Check the committer email address
> 
>  BaseTools/Scripts/PatchCheck.py | 99 +++++++++++++++++++++++----------
>  1 file changed, 69 insertions(+), 30 deletions(-)
> 

still struggling with my email backlog, so I'm going to skip this for now.

Thanks
Laszlo


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 4/4] BaseTools/PatchCheck.py: Check the committer email address
  2020-01-02 15:25 ` [RFC PATCH 4/4] BaseTools/PatchCheck.py: Check the committer " Philippe Mathieu-Daudé
@ 2020-01-03 22:59   ` Jordan Justen
  2020-01-04 11:38     ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 8+ messages in thread
From: Jordan Justen @ 2020-01-03 22:59 UTC (permalink / raw)
  To: Philippe Mathieu-Daude, devel
  Cc: Laszlo Ersek, Michael D Kinney, Philippe Mathieu-Daude,
	Liming Gao

On 2020-01-02 07:25:53, Philippe Mathieu-Daude wrote:
> To avoid patches committed with incorrect email address,
> use the EmailAddressCheck class on the committer email too.
> 
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Jordan Justen <jordan.l.justen@intel.com>
> Signed-off-by: Philippe Mathieu-Daude <philmd@redhat.com>
> ---
> RFC because I haven't checked --pretty="%cn <%ce>" works on Windows shell.
> 
>  BaseTools/Scripts/PatchCheck.py | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py
> index f0e661bfd6e3..3baeb3de7ba2 100755
> --- a/BaseTools/Scripts/PatchCheck.py
> +++ b/BaseTools/Scripts/PatchCheck.py
> @@ -560,6 +560,8 @@ class CheckGitCommits:
>                  else:
>                      blank_line = True
>                  print('Checking git commit:', commit)
> +            email = self.read_committer_email_address_from_git(commit)
> +            self.ok &= EmailAddressCheck(email, 'Committer').ok
>              patch = self.read_patch_from_git(commit)
>              self.ok &= CheckOnePatch(commit, patch).ok
>          if not commits:
> @@ -578,6 +580,10 @@ class CheckGitCommits:
>          # Run git to get the commit patch
>          return self.run_git('show', '--pretty=email', '--no-textconv', commit)
>  
> +    def read_committer_email_address_from_git(self, commit):
> +        # Run git to get the committer email
> +        return self.run_git('show', '--pretty="%cn <%ce>"', '--no-patch', commit)

I think '--pretty=%cn <%ce>' ought to work without double-quotes
because the argument is separately sent via the subprocess.Popen call.
I'm not certain it will work, but it ought to. :)

-Jordan

> +
>      def run_git(self, *args):
>          cmd = [ 'git' ]
>          cmd += args
> -- 
> 2.21.0
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [RFC PATCH 4/4] BaseTools/PatchCheck.py: Check the committer email address
  2020-01-03 22:59   ` Jordan Justen
@ 2020-01-04 11:38     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-01-04 11:38 UTC (permalink / raw)
  To: Jordan Justen, devel; +Cc: Laszlo Ersek, Michael D Kinney, Liming Gao

On 1/3/20 11:59 PM, Jordan Justen wrote:
> On 2020-01-02 07:25:53, Philippe Mathieu-Daude wrote:
>> To avoid patches committed with incorrect email address,
>> use the EmailAddressCheck class on the committer email too.
>>
>> Cc: Liming Gao <liming.gao@intel.com>
>> Cc: Jordan Justen <jordan.l.justen@intel.com>
>> Signed-off-by: Philippe Mathieu-Daude <philmd@redhat.com>
>> ---
>> RFC because I haven't checked --pretty="%cn <%ce>" works on Windows shell.
>>
>>   BaseTools/Scripts/PatchCheck.py | 6 ++++++
>>   1 file changed, 6 insertions(+)
>>
>> diff --git a/BaseTools/Scripts/PatchCheck.py b/BaseTools/Scripts/PatchCheck.py
>> index f0e661bfd6e3..3baeb3de7ba2 100755
>> --- a/BaseTools/Scripts/PatchCheck.py
>> +++ b/BaseTools/Scripts/PatchCheck.py
>> @@ -560,6 +560,8 @@ class CheckGitCommits:
>>                   else:
>>                       blank_line = True
>>                   print('Checking git commit:', commit)
>> +            email = self.read_committer_email_address_from_git(commit)
>> +            self.ok &= EmailAddressCheck(email, 'Committer').ok
>>               patch = self.read_patch_from_git(commit)
>>               self.ok &= CheckOnePatch(commit, patch).ok
>>           if not commits:
>> @@ -578,6 +580,10 @@ class CheckGitCommits:
>>           # Run git to get the commit patch
>>           return self.run_git('show', '--pretty=email', '--no-textconv', commit)
>>   
>> +    def read_committer_email_address_from_git(self, commit):
>> +        # Run git to get the committer email
>> +        return self.run_git('show', '--pretty="%cn <%ce>"', '--no-patch', commit)
> 
> I think '--pretty=%cn <%ce>' ought to work without double-quotes
> because the argument is separately sent via the subprocess.Popen call.
> I'm not certain it will work, but it ought to. :)

Oh, this works like charm on Linux :)

Thanks for the tip (and review)!

Phil.

>> +
>>       def run_git(self, *args):
>>           cmd = [ 'git' ]
>>           cmd += args
>> -- 
>> 2.21.0
>>
> 


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-01-04 11:38 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-01-02 15:25 [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Philippe Mathieu-Daudé
2020-01-02 15:25 ` [PATCH 1/4] BaseTools/PatchCheck.py: Extract email check code to EmailAddressCheck Philippe Mathieu-Daudé
2020-01-02 15:25 ` [PATCH 2/4] BaseTools/PatchCheck.py: Let EmailAddressCheck describe email checked Philippe Mathieu-Daudé
2020-01-02 15:25 ` [PATCH 3/4] BaseTools/PatchCheck.py: Check the patch author email address Philippe Mathieu-Daudé
2020-01-02 15:25 ` [RFC PATCH 4/4] BaseTools/PatchCheck.py: Check the committer " Philippe Mathieu-Daudé
2020-01-03 22:59   ` Jordan Justen
2020-01-04 11:38     ` Philippe Mathieu-Daudé
2020-01-03 13:11 ` [PATCH 0/4] BaseTools/PatchCheck: Check committer/author email addresses Laszlo Ersek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox