Switch to side-by-side view

--- a/Allura/push_re.py
+++ b/Allura/push_re.py
@@ -1,17 +1,30 @@
 import os
+import re
 import shlex
 import string
 import subprocess
+from collections import defaultdict
 from ConfigParser import ConfigParser
 from datetime import date
+from urlparse import urljoin
+
+from allura.config import middleware
+from allura.lib import rest_api
 
 DEBUG=1
 CP = ConfigParser()
 
+re_ticket_ref = re.compile(r'\[#\d+\]')
+
+CRED={}
 
 def main():
     CP.read(os.path.join(os.environ['HOME'], '.forgepushrc'))
     engineer = option('re', 'engineer', 'Name of engineer pushing: ')
+    api_key = option('re', 'api_key', 'Forge API Key:')
+    secret_key = option('re', 'secret_key', 'Forge Secret Key:')
+    CRED['api_key'] = api_key
+    CRED['secret_key'] = secret_key
     text, tag = make_ticket_text(engineer)
     print '*** Create a ticket on SourceForge (https://sourceforge.net/p/allura/tickets/new/) with the following contents:'
     print '*** Summary: Production Push (R:%s, D:%s) - allura' % (
@@ -51,7 +64,10 @@
     changes = command(
             'git', 'log', "--format=* %h %s", last_release.strip() + '..')
     assert changes, 'There were no commits found; maybe you forgot to merge dev->master?'
-    changes = ''.join(changes)
+    changelog = ''.join(changes)
+    changes = ''.join(format_changes(changes))
+    print 'Changelog:\n%s' % changelog
+    print 'Tickets:\n%s' % changes
     prelaunch = []
     postlaunch = []
     needs_reactor_setup = raw_input('Does this release require a reactor_setup? [n]')
@@ -75,7 +91,23 @@
     else:
         prelaunch = '-none-'
     return TICKET_TEMPLATE.substitute(locals()), tag
-    
+
+def format_changes(changes):
+    ticket_groups = defaultdict(list)
+    for change in changes:
+        for m in re_ticket_ref.finditer(change):
+            ticket_groups[m.group(0)].append(change)
+    cli = rest_api.RestClient(
+        base_uri='http://sourceforge.net', **CRED)
+    for ref, commits in sorted(ticket_groups.iteritems()):
+        ticket_num = ref[2:-1]
+        ticket = cli.request(
+            'GET',
+            urljoin('/rest/p/allura/tickets/', str(ticket_num)) + '/')['ticket']
+        verb = {
+            'validation': 'Fix',
+            'closed': 'Fix' }.get(ticket['status'], 'Address')
+        yield ' * %s %s: %s\n' % (verb, ref, ticket['summary'])
 
 def command(*args):
     if len(args) == 1 and isinstance(args[0], basestring):