diff options
author | Maxim Uvarov <maxim.uvarov@linaro.org> | 2017-09-04 15:41:53 +0300 |
---|---|---|
committer | Maxim Uvarov <maxim.uvarov@linaro.org> | 2017-09-04 15:55:00 +0300 |
commit | c656cfc75f9b5649b4a64390566fdbff60797542 (patch) | |
tree | 9d015e8067fce1e1803c438f10e3eaeab45fece6 | |
parent | ad94e17a99f725f27c97b0035faccde5965c059a (diff) |
add gh-email-comments.py
Script to send comments from github to email.
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
-rw-r--r-- | README.md | 3 | ||||
-rwxr-xr-x | gh-email-comments.py | 147 |
2 files changed, 150 insertions, 0 deletions
@@ -10,3 +10,6 @@ gh-hook-mr.py - merge request hook to proper rename pull request gh-imap.py - cron script to read patches from email and port to github page gh-mail-pr.py - format patches from github pull request and email them + +gh-email-comments.py - scripts reads comments from github web page and sends it to corresponding + email thread (generated by gh-mail-pr.py) diff --git a/gh-email-comments.py b/gh-email-comments.py new file mode 100755 index 0000000..6184ad2 --- /dev/null +++ b/gh-email-comments.py @@ -0,0 +1,147 @@ +#!/usr/bin/python +# +# Cron script to validate patches in open pull requests. +# 1. Validation skipped if "checkpatch" label is set. +# 2. Run both checkpatch.pl and odp agreement checks. +# Result is status on odp pull request github web page and +# label "checkpatch" set. + +from github import Github +import github +import os +import re +import glob +import sys +import pickle +import imaplib +import email +import smtplib +from email.mime.text import MIMEText + +configfile = '/home/muvarov/gscripts_config.py' +sys.path.append(os.path.dirname(os.path.expanduser(configfile))) +import gscripts_config as gcfg + + +gh_login = gcfg.gcfg['gh']['login'] +gh_password = gcfg.gcfg['gh']['pass'] + +g = Github(gh_login, password=gh_password) + +for repo in g.get_user().get_repos(): + if repo.full_name == "Linaro/odp": + break +if not repo: + exit(1) + +# get Message-Id to reply with correct In-Reply-To +def get_email_id_by_title(title): + ret_msg_id = None + + imap_login = gcfg.gcfg['imap']['login'] + imap_password = gcfg.gcfg['imap']['pass'] + + mail = imaplib.IMAP4_SSL('imap.yandex.ru') + mail.login(imap_login, imap_password) + mail.list() + + # Out: list of "folders" aka labels in gmail. + mail.select("inbox") # connect to inbox. + mail.select(readonly=1) # Select inbox or default namespace + + # imap truncates subject search + m = re.search(r'\[(PATCH.*v[0-9]+)\](.*)', title[0:52]) + if not m: + mail.logout() + return None + + prefix = m.group(1).lstrip() + " 0/" #look for PATCH v1 0/X + subject = m.group(2).lstrip() + + (retcode, messages) = mail.uid('search', '(SUBJECT "%s")' % subject) + for num in messages[0].split(): + typ, data = mail.fetch(num,'(RFC822)') + msg_str = email.message_from_string(data[0][1]) + m = re.search(prefix, msg_str['Subject']) + if not m: + continue + ret_msg_id = msg_str['Message-Id'] + break + mail.logout() + return ret_msg_id + +def smtp_send_comment(pull, rvc, id): + if rvc.user.name: + user = "%s(%s)" % (rvc.user.name, rvc.user.login) + else: + user = "%s" % (rvc.user.login) + + text = "%s replied on github web page:\n\n" % (user) + + text += "%s\n" % (rvc.path) + if rvc.position: + text += "line %s\n" % (rvc.position) + text += "%s\n" % rvc.diff_hunk + text += "\n\n" + text += "Comment:\n" + text += rvc.body + text += "\n\n" + + text += "%s\n" % rvc.html_url + text += "updated_at %s\n" % rvc.updated_at + msg = MIMEText(text.encode("utf-8")) + + msg['Subject'] = "Re: %s" % pull.title + msg['From'] = "Github ODP bot <odpbot@yandex.ru>" + msg['To'] = "lng-odp@lists.linaro.org" + msg['In-Reply-To'] = id + #msg['To'] = "maxim.uvarov@linaro.org" + + smtp_server = gcfg.gcfg['smtp']['server'] + smtp_login = gcfg.gcfg['smtp']['login'] + smtp_password = gcfg.gcfg['smtp']['pass'] + + s = smtplib.SMTP_SSL(smtp_server) + s.login(smtp_login, smtp_password) + s.sendmail(msg['From'], msg['To'], msg.as_string()) + s.quit() + +def email_new_comment(pull, rvc): + id = get_email_id_by_title(pull.title) + smtp_send_comment(pull, rvc, id) + +### MAIN + +os.system("mkdir -p gh-ec-cache") + + +for pull in repo.get_pulls(): + try: + issue = repo.get_issue(pull.number) + except: + # timeout ssl http error can happen. Process this pr + # on next run. + continue + + pull_cache = {} + filename = "gh-ec-cache/%d.cache" % pull.number + try: + f = open(filename, "rb" ); + pull_cache = pickle.load(f) + f.close() + except: + print "return at 1" + break + + try: + for rvc in pull.get_review_comments(): + if rvc.id not in pull_cache: + email_new_comment(pull, rvc) + pull_cache[rvc.id] = { rvc.body } + except: + print "return at 2" + break + + f = open(filename, 'w') + pickle.dump(pull_cache, f) + f.close() |