changeset 2241:b2a2868d7bec codereview

Basic compare-view controller with ref parsing
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 06 May 2012 19:24:50 +0200
parents 87664e60bbc0
children 87e9718ab4a2
files rhodecode/config/routing.py rhodecode/controllers/compare.py rhodecode/tests/functional/test_compare.py
diffstat 3 files changed, 110 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/config/routing.py	Sat May 05 23:12:49 2012 +0200
+++ b/rhodecode/config/routing.py	Sun May 06 19:24:50 2012 +0200
@@ -412,6 +412,11 @@
                  controller='changeset', action='raw_changeset',
                  revision='tip', conditions=dict(function=check_repo))
 
+    rmap.connect('compare_home',
+                 '/{repo_name:.*}/compare/{ref:.*}',
+                 controller='compare', action='index',
+                 conditions=dict(function=check_repo))
+
     rmap.connect('summary_home', '/{repo_name:.*}/summary',
                 controller='summary', conditions=dict(function=check_repo))
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/controllers/compare.py	Sun May 06 19:24:50 2012 +0200
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+"""
+    rhodecode.controllers.compare
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    compare controller for pylons showoing differences between two
+    repos, branches, bookmarks or tips
+
+    :created_on: May 6, 2012
+    :author: marcink
+    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
+    :license: GPLv3, see COPYING for more details.
+"""
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+import logging
+import traceback
+
+from pylons import request, response, session, tmpl_context as c, url
+from pylons.controllers.util import abort, redirect
+
+from rhodecode.lib.base import BaseRepoController, render
+from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
+from webob.exc import HTTPNotFound
+
+log = logging.getLogger(__name__)
+
+
+class CompareController(BaseRepoController):
+
+    @LoginRequired()
+    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
+                                   'repository.admin')
+    def __before__(self):
+        super(CompareController, self).__before__()
+
+    def _handle_ref(self, ref):
+        """
+        Parse the org...other string
+        Possible formats are `(branch|book|tag):<name>...(branch|book|tag):<othername>`
+        or using a repo <empty>...(repo:</rhodecode/path/to/other)
+
+
+        :param ref:
+        :type ref:
+        """
+        org_repo = c.rhodecode_repo.name
+
+        def org_parser(org):
+            _repo = org_repo
+            name, val = org.split(':')
+            return _repo, (name, val)
+
+        def other_parser(other):
+            _repo = org_repo
+            name, val = other.split(':')
+            if 'repo' in other:
+                _repo = val
+                name = 'branch'
+                val = c.rhodecode_repo.DEFAULT_BRANCH_NAME
+
+            return _repo, (name, val)
+
+        if '...' in ref:
+            try:
+                org, other = ref.split('...')
+                org_repo, org_ref = org_parser(org)
+                other_repo, other_ref = other_parser(other)
+                return org_repo, org_ref, other_repo, other_ref
+            except:
+                log.error(traceback.format_exc())
+
+        raise HTTPNotFound
+
+    def index(self, ref):
+
+        org_repo, org_ref, other_repo, other_ref = self._handle_ref(ref)
+        return '''
+        <pre>
+        REPO: %s 
+        REF: %s 
+        
+        vs 
+        
+        REPO: %s 
+        REF: %s        
+        </pre>
+        ''' % (org_repo, org_ref, other_repo, other_ref)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rhodecode/tests/functional/test_compare.py	Sun May 06 19:24:50 2012 +0200
@@ -0,0 +1,7 @@
+from rhodecode.tests import *
+
+class TestCompareController(TestController):
+
+    def test_index(self):
+        response = self.app.get(url(controller='compare', action='index'))
+        # Test response...