Switch to side-by-side view

--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -4,15 +4,17 @@
 
 from pylons import c, g, request, response
 from webob import exc
-from tg import redirect, expose, override_template, flash, url
-from tg.decorators import with_trailing_slash
+from tg import redirect, expose, override_template, flash, url, validate
+from tg.decorators import with_trailing_slash, without_trailing_slash
 
 from ming.orm import ThreadLocalORMSession
 
 from allura.lib import patience
 from allura.lib import security
 from allura.lib import helpers as h
+from allura.lib import widgets as w
 from allura.lib.widgets.repo import SCMLogWidget, SCMRevisionWidget, SCMTreeWidget
+from allura.lib.widgets.repo import SCMMergeRequestWidget
 from allura import model as M
 
 from .base import BaseController
@@ -25,6 +27,7 @@
     TreeBrowser.FileBrowserClass = FileBrowser
 
 class RepoRootController(BaseController):
+    mr_widget=SCMMergeRequestWidget()
 
     def _check_security(self):
         security.require(security.has_artifact_access('read'))
@@ -80,6 +83,54 @@
                     flash(str(ex), 'error')
                     redirect(request.referer)
 
+    @without_trailing_slash
+    @expose('jinja:repo/request_merge.html')
+    def request_merge(self, branch=None):
+        c.form = self.mr_widget
+        if branch is None:
+            branch=c.app.repo.branches[0].name
+        return dict(branch=branch)
+
+    @expose()
+    @validate(form=mr_widget)
+    def do_request_merge(self, **kw):
+        downstream=dict(
+            project_id=c.project._id,
+            mount_point=c.app.config.options.mount_point,
+            commit_id=c.app.repo.commit(kw['branch']).object_id)
+        with c.app.repo.push_upstream_context():
+            mr = M.MergeRequest.upsert(
+                downstream=downstream,
+                summary=kw['summary'],
+                description=kw['description'])
+            redirect(mr.url())
+
+class MergeRequestsController(object):
+
+    @expose('jinja:repo/merge_requests.html')
+    def index(self):
+        requests = c.app.repo.merge_requests
+        return dict(requests=requests)
+
+    @expose()
+    def _lookup(self, num, *remainder):
+        return MergeRequestController(num), remainder
+
+class MergeRequestController(object):
+    thread_widget=w.Thread(
+        page=None, limit=None, page_size=None, count=None,
+        style='linear')
+
+    def __init__(self, num):
+        self.req = M.MergeRequest.query.get(
+            request_number=int(num))
+        if self.req is None: raise exc.HTTPNotFound
+
+    @expose('jinja:repo/merge_request.html')
+    def index(self):
+        c.thread = self.thread_widget
+        return dict(req=self.req)
+
 class RefsController(object):
 
     def __init__(self, BranchBrowserClass):