Add support for sending emails while processing a PR/patch
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
This commit is contained in:
parent
4d6190714d
commit
ecaeef5dcb
|
@ -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)))
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue