<pre style='margin:0'>
Rainer Müller (raimue) pushed a commit to branch master
in repository trac.macports.org.

</pre>
<p><a href="https://github.com/macports/trac.macports.org/commit/e389808c715dead6fdb4dc827560f2984ad086bd">https://github.com/macports/trac.macports.org/commit/e389808c715dead6fdb4dc827560f2984ad086bd</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit e389808c715dead6fdb4dc827560f2984ad086bd
</span>Author: Rainer Müller <raimue@macports.org>
AuthorDate: Tue Nov 1 03:01:16 2016 +0100

<span style='display:block; white-space:pre;color:#404040;'>    trac-github-update: retrieve name from GitHub API
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    For the sender, get the real name from GitHub API using PyGithub.
</span>---
 plugins/hooks/trac-github-update.py | 46 +++++++++++++++++++++++++++++--------
 1 file changed, 37 insertions(+), 9 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/plugins/hooks/trac-github-update.py b/plugins/hooks/trac-github-update.py
</span><span style='display:block; white-space:pre;color:#808080;'>index 1db58ef..4c6f6ab 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/plugins/hooks/trac-github-update.py
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/plugins/hooks/trac-github-update.py
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3,11 +3,14 @@
</span> """trac-github-update hook sending mails with git-multimail"""
 
 import sys
<span style='display:block; white-space:pre;background:#e0ffe0;'>+import os
</span> import json
 
 import git_multimail
 from git_multimail import GenericEnvironment, Config, ConfigurationException, \
                           OutputMailer, ReferenceChange, Push
<span style='display:block; white-space:pre;background:#e0ffe0;'>+from github import Github
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> 
 ### TEMPLATES ###
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -49,8 +52,11 @@ git_multimail.LINK_HTML_TEMPLATE = """\
</span> 
 
 class GitHubWebhookEnvironment(GenericEnvironment):
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    def __init__(self, **kw):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    def __init__(self, github, **kw):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        self._github = github
</span>         self._data = None
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        self._pusher = None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        self._pusher_email = None
</span>         super(GenericEnvironment, self).__init__(**kw)
 
     def load_payload(self, payload):
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -58,19 +64,31 @@ class GitHubWebhookEnvironment(GenericEnvironment):
</span>         return self._data
 
     def get_pusher(self):
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if self._pusher:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return self._pusher
</span>         if not self._data:
             return super(GenericEnvironment).get_pusher()
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        return self._data['pusher']['name'].encode('utf-8')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        login = self._data['pusher']['name'].encode('utf-8')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        realname = self._github.get_user(login).name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if realname:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            self._pusher = "%s (%s)" % (realname, login)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        else:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            self._pusher = login
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return self._pusher
</span> 
     def get_pusher_email(self):
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if self._pusher_email:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return self._pusher_email
</span>         if not self._data:
             return super(GenericEnvironment).get_pusher_email()
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        # GitHub always lists the primary email address in the payload,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # but we do not want to expose those to the public
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # XXX: in lack of a better solution, always use a static sender email
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        name = self._data['pusher']['name'].encode('utf-8')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        email = "%s@users.noreply.github.com" % (name,)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "%s <%s>" % (name, email)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        login = self._data['pusher']['name'].encode('utf-8')
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        name = self._github.get_user(login).name or login
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # GitHub only lists the primary email address in the payload. We do not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # want to expose it to the public, and sending with these addresses
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # would also violate SPF. Use a static sender email instead.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        email = "%s@users.noreply.github.com" % (login,)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        self._pusher_email = "%s <%s>" % (name, email)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return self._pusher_email
</span> 
 
 def run_as_github_webhook(environment, mailer):
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -105,9 +123,19 @@ def main(args):
</span>     # git-multimail:
     config = Config('multimailhook')
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    token = os.getenv("GITHUB_ACCESS_TOKEN")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if not token:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        token = config.get("githubAccessToken")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if not token:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        sys.stderr.write("Set GITHUB_ACCESS_TOKEN in environment or " +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                         "'git config multimailhook.githubAccessToken <token>'!\n")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        sys.exit(1)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    github = Github(token)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     # Select the type of environment:
     try:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        environment = GitHubWebhookEnvironment(config=config)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        environment = GitHubWebhookEnvironment(github, config=config)
</span>     except ConfigurationException:
         sys.stderr.write("%s\n" % sys.exc_info()[1])
         sys.exit(1)
</pre><pre style='margin:0'>

</pre>