]> git.proxmox.com Git - mirror_linux-firmware.git/commitdiff
Add support for sending emails while processing a PR/patch
authorMario Limonciello <mario.limonciello@amd.com>
Thu, 19 Oct 2023 01:54:19 +0000 (20:54 -0500)
committerMario Limonciello <mario.limonciello@amd.com>
Thu, 19 Oct 2023 02:12:07 +0000 (21:12 -0500)
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
contrib/process_linux_firmware.py

index 6341fca1acfb6e003fd6947322d8c70f3dfa9e42..4ef0aa760692f6fe6c4051b6d210cbf54215ef8d 100755 (executable)
@@ -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)))