commit:     5fa6ea3b1d1a78edc97608a3f92db07ab4ca19b7
Author:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
AuthorDate: Wed Apr  6 18:08:40 2022 +0000
Commit:     Arthur Zamarin <arthurzam <AT> gentoo <DOT> org>
CommitDate: Wed Apr  6 18:08:40 2022 +0000
URL:        https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=5fa6ea3b

Add emails checker against bugzilla workflow

A new check that checks that all new emails written in metadata.xml
correspond to existing user in bugzilla.

Signed-off-by: Arthur Zamarin <arthurzam <AT> gentoo.org>

 .github/workflows/emails.yml | 29 +++++++++++++++++++++++++
 scripts/email-checker.py     | 51 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+)

diff --git a/.github/workflows/emails.yml b/.github/workflows/emails.yml
index 6871760f4..e7791f558 100644
--- a/.github/workflows/emails.yml
+++ b/.github/workflows/emails.yml
@@ -6,5 +6,34 @@ jobs:
   bugzilla:
     runs-on: ubuntu-latest
     steps:
+
+    - uses: nrwl/last-successful-commit-action@v1
+      id: last_successful_commit
+      with:
+        branch: 'dev'
+        workflow_id: 'emails.yml'
+        github_token: ${{ secrets.GITHUB_TOKEN }}
+
+    - name: Checkout compare ref
+      uses: actions/checkout@v2
+      with:
+        ref: ${{ steps.last_successful_commit.outputs.commit_hash }}
+
     - name: Checkout code
       uses: actions/checkout@v2
+
+    - uses: actions/setup-python@v3
+      with:
+        python-version: '3.x'
+
+    - name: Get changed files
+      id: changed-files
+      uses: tj-actions/[email protected]
+      with:
+        base_sha: ${{ steps.last_successful_commit.outputs.commit_hash }}
+        files: |
+          **/metadata.xml
+
+    - name: Check Emails against bugzilla
+      run: |
+        python ./scripts/email-checker.py ${{ 
steps.changed-files.outputs.all_changed_files }}

diff --git a/scripts/email-checker.py b/scripts/email-checker.py
new file mode 100755
index 000000000..2b6e93a1d
--- /dev/null
+++ b/scripts/email-checker.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+
+from http.client import HTTPSConnection
+import json
+import sys
+from typing import Dict, Iterator, NamedTuple
+from urllib.parse import quote_plus
+import xml.etree.ElementTree as ET
+
+
+class Maintainer(NamedTuple):
+    name: str
+    email: str
+
+    def check_details(self, client: HTTPSConnection):
+        try:
+            client.request("GET", f"/rest/user?names={quote_plus(self.email)}")
+            resp = client.getresponse()
+            resp.read()
+            return resp.status == 200
+        except:
+            return False
+
+
+def read_all_maintainers(files: Iterator[str]) -> Iterator[Maintainer]:
+    for file in files:
+        try:
+            tree = ET.parse(file)
+            for maintainer in tree.findall('./maintainer'):
+                values = {child.tag: child.text for child in maintainer}
+                yield Maintainer(name=values.get('name', ''), 
email=values.get('email', ''))
+        except FileNotFoundError:
+            print(file, 'not found')
+
+
+def check_maintainers(maintainers: Iterator[Maintainer]) -> 
Iterator[Maintainer]:
+    try:
+        client = HTTPSConnection('bugs.gentoo.org')
+        for m in maintainers:
+            if m.check_details(client):
+                print(f'\033[92m\u2713 {m.name} <{m.email}>\033[0m')
+            else:
+                print(f'\033[91m\u2717 {m.name} <{m.email}>\033[0m')
+                yield m
+    finally:
+        client.close()
+
+
+if __name__ == '__main__':
+    missing_maintainers = 
len(tuple(check_maintainers(set(read_all_maintainers(sys.argv[1:])))))
+    sys.exit(int(missing_maintainers != 0))

Reply via email to