##// END OF EJS Templates
Basic compare-view controller with ref parsing
marcink -
r2241:b2a2868d codereview
parent child Browse files
Show More
@@ -0,0 +1,98 b''
1 # -*- coding: utf-8 -*-
2 """
3 rhodecode.controllers.compare
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
6 compare controller for pylons showoing differences between two
7 repos, branches, bookmarks or tips
8
9 :created_on: May 6, 2012
10 :author: marcink
11 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
12 :license: GPLv3, see COPYING for more details.
13 """
14 # This program is free software: you can redistribute it and/or modify
15 # it under the terms of the GNU General Public License as published by
16 # the Free Software Foundation, either version 3 of the License, or
17 # (at your option) any later version.
18 #
19 # This program is distributed in the hope that it will be useful,
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 # GNU General Public License for more details.
23 #
24 # You should have received a copy of the GNU General Public License
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
26 import logging
27 import traceback
28
29 from pylons import request, response, session, tmpl_context as c, url
30 from pylons.controllers.util import abort, redirect
31
32 from rhodecode.lib.base import BaseRepoController, render
33 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
34 from webob.exc import HTTPNotFound
35
36 log = logging.getLogger(__name__)
37
38
39 class CompareController(BaseRepoController):
40
41 @LoginRequired()
42 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
43 'repository.admin')
44 def __before__(self):
45 super(CompareController, self).__before__()
46
47 def _handle_ref(self, ref):
48 """
49 Parse the org...other string
50 Possible formats are `(branch|book|tag):<name>...(branch|book|tag):<othername>`
51 or using a repo <empty>...(repo:</rhodecode/path/to/other)
52
53
54 :param ref:
55 :type ref:
56 """
57 org_repo = c.rhodecode_repo.name
58
59 def org_parser(org):
60 _repo = org_repo
61 name, val = org.split(':')
62 return _repo, (name, val)
63
64 def other_parser(other):
65 _repo = org_repo
66 name, val = other.split(':')
67 if 'repo' in other:
68 _repo = val
69 name = 'branch'
70 val = c.rhodecode_repo.DEFAULT_BRANCH_NAME
71
72 return _repo, (name, val)
73
74 if '...' in ref:
75 try:
76 org, other = ref.split('...')
77 org_repo, org_ref = org_parser(org)
78 other_repo, other_ref = other_parser(other)
79 return org_repo, org_ref, other_repo, other_ref
80 except:
81 log.error(traceback.format_exc())
82
83 raise HTTPNotFound
84
85 def index(self, ref):
86
87 org_repo, org_ref, other_repo, other_ref = self._handle_ref(ref)
88 return '''
89 <pre>
90 REPO: %s
91 REF: %s
92
93 vs
94
95 REPO: %s
96 REF: %s
97 </pre>
98 ''' % (org_repo, org_ref, other_repo, other_ref)
@@ -0,0 +1,7 b''
1 from rhodecode.tests import *
2
3 class TestCompareController(TestController):
4
5 def test_index(self):
6 response = self.app.get(url(controller='compare', action='index'))
7 # Test response...
@@ -412,6 +412,11 b' def make_map(config):'
412 controller='changeset', action='raw_changeset',
412 controller='changeset', action='raw_changeset',
413 revision='tip', conditions=dict(function=check_repo))
413 revision='tip', conditions=dict(function=check_repo))
414
414
415 rmap.connect('compare_home',
416 '/{repo_name:.*}/compare/{ref:.*}',
417 controller='compare', action='index',
418 conditions=dict(function=check_repo))
419
415 rmap.connect('summary_home', '/{repo_name:.*}/summary',
420 rmap.connect('summary_home', '/{repo_name:.*}/summary',
416 controller='summary', conditions=dict(function=check_repo))
421 controller='summary', conditions=dict(function=check_repo))
417
422
General Comments 0
You need to be logged in to leave comments. Login now