aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMario Limonciello <mario.limonciello@amd.com>2023-10-18 20:54:19 -0500
committerMario Limonciello <mario.limonciello@amd.com>2023-10-18 21:12:07 -0500
commitecaeef5dcb0540721e813f4508b51293f1be7cd9 (patch)
treebb39f46fdd9c9c11a7e966ba65e980122efbdc02
parent4d6190714dc635b7c8b0fb384380c6fa66630711 (diff)
downloadlinux-firmware-ecaeef5dcb0540721e813f4508b51293f1be7cd9.tar.gz
Add support for sending emails while processing a PR/patch
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
-rwxr-xr-xcontrib/process_linux_firmware.py67
1 files changed, 62 insertions, 5 deletions
diff --git a/contrib/process_linux_firmware.py b/contrib/process_linux_firmware.py
index 6341fca1..4ef0aa76 100755
--- a/contrib/process_linux_firmware.py
+++ b/contrib/process_linux_firmware.py
@@ -7,11 +7,12 @@ import feedparser
import argparse
import logging
import email
+import email.utils
+import smtplib
import subprocess
import sys
-from datetime import datetime, timedelta, date
+from datetime import date
from enum import Enum
-import b4
URL = "https://lore.kernel.org/linux-firmware/new.atom"
@@ -62,6 +63,51 @@ def quiet_cmd(cmd):
logging.debug(output)
+def reply_email(content, branch):
+ if "SMTP_USER" in os.environ:
+ user = os.environ["SMTP_USER"]
+ if "SMTP_PASS" in os.environ:
+ password = os.environ["SMTP_PASS"]
+ if "SMTP_SERVER" in os.environ:
+ server = os.environ["SMTP_SERVER"]
+ if "SMTP_PORT" in os.environ:
+ port = os.environ["SMTP_PORT"]
+ if not user or not password or not server or not port:
+ logging.debug("Missing SMTP configuration, not sending email")
+ return
+
+ reply = email.message.EmailMessage()
+
+ orig = email.message_from_string(content)
+ targets = email.utils.getaddresses(
+ orig.get_all("to", []) + orig.get_all("cc", []) + orig.get_all("from", [])
+ )
+ for target in targets:
+ reply["To"] += email.utils.formataddr(target)
+
+ reply["From"] = "linux-firmware@kernel.org"
+ reply["Subject"] = "Re: {}".format(orig["Subject"])
+ reply["In-Reply-To"] = orig["Message-Id"]
+ reply["References"] = orig["Message-Id"]
+ reply["Thread-Topic"] = orig["Thread-Topic"]
+ reply["Thread-Index"] = orig["Thread-Index"]
+
+ content = (
+ "Your request has been forwarded by the Linux Firmware Kernel robot.\n"
+ "Please follow up at https://gitlab.com/kernel-firmware/linux-firmware/-/merge_requests to ensure it gets merged\n"
+ "Your request is '{}'".format(branch)
+ )
+ reply.set_content(content)
+
+ mailserver = smtplib.SMTP(server, port)
+ mailserver.ehlo()
+ mailserver.starttls()
+ mailserver.ehlo()
+ mailserver.login(user, password)
+ mailserver.sendmail(reply["From"], reply["To"], reply.as_string())
+ mailserver.quit()
+
+
def create_pr(remote, branch):
cmd = [
"git",
@@ -98,7 +144,7 @@ def process_pr(url, num, remote):
quiet_cmd(cmd)
except subprocess.CalledProcessError:
logging.warning("Failed to apply PR")
- return
+ return None
# determine if it worked (we can't tell unfortunately by return code)
cmd = ["git", "branch", "--list", branch]
@@ -110,6 +156,8 @@ def process_pr(url, num, remote):
if remote:
create_pr(remote, branch)
delete_branch(branch)
+ return branch
+ return None
def process_patch(mbox, num, remote):
@@ -137,6 +185,9 @@ def process_patch(mbox, num, remote):
create_pr(remote, branch)
delete_branch(branch)
+ if p.returncode == 0:
+ return branch
+ return None
def update_database(conn, url):
@@ -189,6 +240,7 @@ def process_database(conn, remote):
# loop over all unprocessed urls
for row in rows:
+ branch = None
msg = "Processing ({}%)".format(round(num / len(rows) * 100))
print(msg, end="\r", flush=True)
@@ -199,11 +251,11 @@ def process_database(conn, remote):
if classification == ContentType.PATCH:
logging.debug("Processing patch ({})".format(row[0]))
- process_patch(mbox, num, remote)
+ branch = process_patch(mbox, num, remote)
if classification == ContentType.PULL_REQUEST:
logging.debug("Processing PR ({})".format(row[0]))
- process_pr(row[0], num, remote)
+ branch = process_pr(row[0], num, remote)
if classification == ContentType.SPAM:
logging.debug("Marking spam ({})".format(row[0]))
@@ -218,6 +270,11 @@ def process_database(conn, remote):
# commit changes
conn.commit()
+
+ # send any emails
+ if branch:
+ reply_email(mbox, branch)
+
logging.info("Finished processing {} new entries".format(len(rows)))