aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Zamarin <arthurzam@gentoo.org>2022-04-06 21:08:40 +0300
committerArthur Zamarin <arthurzam@gentoo.org>2022-04-06 21:08:40 +0300
commit5fa6ea3b1d1a78edc97608a3f92db07ab4ca19b7 (patch)
treec71e353d0e44cb00b2c3c6c066747644d70652c9
parentAdd new empty emails workflow (diff)
downloadguru-5fa6ea3b1d1a78edc97608a3f92db07ab4ca19b7.tar.gz
guru-5fa6ea3b1d1a78edc97608a3f92db07ab4ca19b7.tar.bz2
guru-5fa6ea3b1d1a78edc97608a3f92db07ab4ca19b7.zip
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@gentoo.org>
-rw-r--r--.github/workflows/emails.yml29
-rwxr-xr-xscripts/email-checker.py51
2 files changed, 80 insertions, 0 deletions
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/changed-files@v18.6
+ 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))