Mercurial > kallithea
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...