This is an automated email from the ASF dual-hosted git repository.

janhoy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 4acc1dfc536 SOLR-17438 ReleaseWizard to resolve committer GPG key from 
whimsy (#3145)
4acc1dfc536 is described below

commit 4acc1dfc5364fd153e69cd1cda4c80c2bf26d7f8
Author: Jan Høydahl <[email protected]>
AuthorDate: Fri Mar 7 13:04:49 2025 +0100

    SOLR-17438 ReleaseWizard to resolve committer GPG key from whimsy (#3145)
---
 dev-tools/scripts/releaseWizard.py | 24 ++++++++-----------
 dev-tools/scripts/requirements.txt |  3 ++-
 dev-tools/scripts/scriptutil.py    | 47 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 58 insertions(+), 16 deletions(-)

diff --git a/dev-tools/scripts/releaseWizard.py 
b/dev-tools/scripts/releaseWizard.py
index e5dd6b835e7..d8d34d3409c 100755
--- a/dev-tools/scripts/releaseWizard.py
+++ b/dev-tools/scripts/releaseWizard.py
@@ -65,7 +65,7 @@ except:
 import scriptutil
 from consolemenu import ConsoleMenu
 from consolemenu.items import FunctionItem, SubmenuItem, ExitItem
-from scriptutil import BranchType, Version, download, run
+from scriptutil import BranchType, Version, download, run, CommitterPgp
 
 # Solr-to-Java version mapping
 java_versions = {6: 8, 7: 8, 8: 8, 9: 11, 10: 21}
@@ -307,6 +307,7 @@ class ReleaseState:
         self.set_latest_version()
         self.set_latest_lts_version()
 
+
     def set_release_version(self, version):
         self.validate_release_version(self.script_branch_type, 
self.script_branch, version)
         self.release_version = version
@@ -406,6 +407,7 @@ class ReleaseState:
         v = Version.parse(self.latest_version)
         return "%s.%s.%s" % (v.major + 1, 0, 0)
 
+
     def validate_release_version(self, branch_type, branch, release_version):
         ver = Version.parse(release_version)
         # print("release_version=%s, ver=%s" % (release_version, ver))
@@ -1167,20 +1169,12 @@ def configure_pgp(gpg_todo):
     id = str(input("Please enter your Apache id: (ENTER=skip) "))
     if id.strip() == '':
         return False
-    key_url = "https://home.apache.org/keys/committer/%s.asc"; % id.strip()
-    committer_key = load(key_url)
-    lines = committer_key.splitlines()
-    keyid_linenum = None
-    for idx, line in enumerate(lines):
-        if line == 'ASF ID: %s' % id:
-            keyid_linenum = idx+1
-            break
-    if keyid_linenum:
-        keyid_line = lines[keyid_linenum]
-        assert keyid_line.startswith('LDAP PGP key: ')
-        gpg_fingerprint = keyid_line[14:].replace(" ", "")
-        gpg_id = gpg_fingerprint[-8:]
-        print("Found gpg key id %s on file at Apache (%s)" % (gpg_id, key_url))
+
+    committer_pgp = CommitterPgp(id.strip())
+    gpg_id = committer_pgp.get_short_fingerprint()
+    gpg_fingerprint = committer_pgp.get_fingerprint()
+    if gpg_id is not None:
+        print("Found gpg key id %s on file at Apache" % gpg_id)
     else:
         print(textwrap.dedent("""\
             Could not find your GPG key from Apache servers.
diff --git a/dev-tools/scripts/requirements.txt 
b/dev-tools/scripts/requirements.txt
index 1ef4fd25b45..efde9acc402 100644
--- a/dev-tools/scripts/requirements.txt
+++ b/dev-tools/scripts/requirements.txt
@@ -5,4 +5,5 @@ holidays~=0.16
 ics~=0.7.2
 console-menu~=0.7.1
 PyGithub~=2.1.1
-jira~=3.4.1
\ No newline at end of file
+jira~=3.4.1
+json
\ No newline at end of file
diff --git a/dev-tools/scripts/scriptutil.py b/dev-tools/scripts/scriptutil.py
index d272e4a20fd..6d1fb9bc851 100644
--- a/dev-tools/scripts/scriptutil.py
+++ b/dev-tools/scripts/scriptutil.py
@@ -22,6 +22,7 @@ import time
 import urllib.error
 import urllib.parse
 import urllib.request
+import json
 from enum import Enum
 
 
@@ -82,6 +83,52 @@ class Version(object):
       raise Exception('Back compat check disallowed for newer version: %s < 
%s' % (self, other))
     return other.major + 1 >= self.major
 
+
+class CommitterPgp():
+    """
+    A class to resolve a commiter's committer's PGP key from ASF records.
+    The class looks up the committer's ASF id in a json file downloaded from
+    https://whimsy.apache.org/public/public_ldap_people.json
+    and if the committer has a PGP key, it's fingerprint is made available.
+    """
+    def __init__(self, asf_id, json_content = None):
+        self.asf_id = asf_id
+        self.fingerprint = None
+        self.ldap_url = 
'https://whimsy.apache.org/public/public_ldap_people.json'
+        self.fingerprint = None
+        self.fingerprint_short = None
+        if json_content:
+            self.ldap_json = json_content
+        else:
+            self.ldap_json = self.load_ldap()
+        self.resolve()
+
+
+    def load_ldap(self):
+        try:
+            with urllib.request.urlopen(self.ldap_url) as f:
+                return json.load(f)
+        except urllib.error.HTTPError as e:
+            raise Exception(f'Failed to load {self.ldap_url}: {e}')
+
+
+    def resolve(self):
+        """ Resolve the PGP key fingerprint for the committer's ASF id """
+        try:
+            self.fingerprint = 
self.ldap_json['people'][self.asf_id]['key_fingerprints'][0].replace(" ", 
"").upper()
+            self.fingerprint_short = self.fingerprint[-8:]
+        except KeyError:
+            raise Exception(f'No PGP key found for {self.asf_id}')
+
+
+    def get_fingerprint(self):
+        return self.fingerprint
+
+
+    def get_short_fingerprint(self):
+        return self.fingerprint_short
+
+
 def run(cmd, cwd=None):
   try:
     output = subprocess.check_output(cmd, shell=True, 
stderr=subprocess.STDOUT, cwd=cwd)

Reply via email to