scripts/merge-pr.py: Manually map Github username to email address

You can get pretty much any old email address out of Github API, so
let's just map the emails manually.
This commit is contained in:
Pekka Enberg
2024-09-11 10:24:35 +03:00
parent c738674c5d
commit bd94303377
2 changed files with 22 additions and 11 deletions

6
.github.json Normal file
View File

@@ -0,0 +1,6 @@
{
"penberg": {
"name": "Pekka Enberg",
"email": "penberg@ki.fi"
}
}

View File

@@ -16,7 +16,7 @@ import os
import subprocess import subprocess
import tempfile import tempfile
import textwrap import textwrap
import json
def run_command(command): def run_command(command):
process = subprocess.Popen( process = subprocess.Popen(
@@ -24,25 +24,35 @@ def run_command(command):
output, error = process.communicate() output, error = process.communicate()
return output.decode('utf-8').strip(), error.decode('utf-8').strip(), process.returncode return output.decode('utf-8').strip(), error.decode('utf-8').strip(), process.returncode
def load_user_mapping(file_path='.github.json'):
if os.path.exists(file_path):
with open(file_path, 'r') as f:
return json.load(f)
return {}
user_mapping = load_user_mapping()
def get_user_email(g, username): def get_user_email(g, username):
if username in user_mapping:
return f"{user_mapping[username]['name']} <{user_mapping[username]['email']}>"
try: try:
user = g.get_user(username) user = g.get_user(username)
name = user.name if user.name else username
if user.email: if user.email:
return user.email return f"{name} <{user.email}>"
# If public email is not available, try to get from events # If public email is not available, try to get from events
events = user.get_events() events = user.get_events()
for event in events: for event in events:
if event.type == "PushEvent" and event.payload.get("commits"): if event.type == "PushEvent" and event.payload.get("commits"):
for commit in event.payload["commits"]: for commit in event.payload["commits"]:
if commit.get("author") and commit["author"].get("email"): if commit.get("author") and commit["author"].get("email"):
return commit["author"]["email"] return f"{name} <{commit['author']['email']}>"
except Exception as e: except Exception as e:
print(f"Error fetching email for user {username}: {str(e)}") print(f"Error fetching email for user {username}: {str(e)}")
# If we couldn't find an email, return a noreply address # If we couldn't find an email, return a noreply address
return f"{username}@users.noreply.github.com" return f"{username} <{username}@users.noreply.github.com>"
def get_pr_info(g, repo, pr_number): def get_pr_info(g, repo, pr_number):
pr = repo.get_pull(int(pr_number)) pr = repo.get_pull(int(pr_number))
@@ -55,9 +65,7 @@ def get_pr_info(g, repo, pr_number):
for review in reviews: for review in reviews:
if review.state == 'APPROVED': if review.state == 'APPROVED':
reviewer = review.user reviewer = review.user
reviewer_name = reviewer.name if reviewer.name else reviewer.login reviewed_by.append(get_user_email(g, reviewer.login))
reviewer_email = get_user_email(g, reviewer.login)
reviewed_by.append(f"{reviewer_name} <{reviewer_email}>")
return { return {
'number': pr.number, 'number': pr.number,
@@ -68,7 +76,6 @@ def get_pr_info(g, repo, pr_number):
'reviewed_by': reviewed_by 'reviewed_by': reviewed_by
} }
def wrap_text(text, width=72): def wrap_text(text, width=72):
lines = text.split('\n') lines = text.split('\n')
wrapped_lines = [] wrapped_lines = []
@@ -83,7 +90,6 @@ def wrap_text(text, width=72):
wrapped_lines.extend(textwrap.wrap(line, width=width)) wrapped_lines.extend(textwrap.wrap(line, width=width))
return '\n'.join(wrapped_lines) return '\n'.join(wrapped_lines)
def merge_pr(pr_number): def merge_pr(pr_number):
# GitHub authentication # GitHub authentication
token = os.getenv('GITHUB_TOKEN') token = os.getenv('GITHUB_TOKEN')
@@ -147,7 +153,6 @@ def merge_pr(pr_number):
print("Pull request merged successfully!") print("Pull request merged successfully!")
print(f"Merge commit message:\n{commit_message}") print(f"Merge commit message:\n{commit_message}")
if __name__ == "__main__": if __name__ == "__main__":
if len(sys.argv) != 2: if len(sys.argv) != 2:
print("Usage: python merge_pr.py <pr_number>") print("Usage: python merge_pr.py <pr_number>")