##// END OF EJS Templates
Added missing __get_cs_or_redirect method for file history....
marcink -
r3996:267bb347 default
parent child Browse files
Show More
@@ -1,175 +1,203 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 rhodecode.controllers.changelog
3 rhodecode.controllers.changelog
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
5
6 changelog controller for rhodecode
6 changelog controller for rhodecode
7
7
8 :created_on: Apr 21, 2010
8 :created_on: Apr 21, 2010
9 :author: marcink
9 :author: marcink
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
11 :license: GPLv3, see COPYING for more details.
11 :license: GPLv3, see COPYING for more details.
12 """
12 """
13 # This program is free software: you can redistribute it and/or modify
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
16 # (at your option) any later version.
17 #
17 #
18 # This program is distributed in the hope that it will be useful,
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
21 # GNU General Public License for more details.
22 #
22 #
23 # You should have received a copy of the GNU General Public License
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25
25
26 import logging
26 import logging
27 import traceback
27 import traceback
28
28
29 from pylons import request, url, session, tmpl_context as c
29 from pylons import request, url, session, tmpl_context as c
30 from pylons.controllers.util import redirect
30 from pylons.controllers.util import redirect
31 from pylons.i18n.translation import _
31 from pylons.i18n.translation import _
32 from webob.exc import HTTPNotFound, HTTPBadRequest
32
33
33 import rhodecode.lib.helpers as h
34 import rhodecode.lib.helpers as h
34 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
35 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
35 from rhodecode.lib.base import BaseRepoController, render
36 from rhodecode.lib.base import BaseRepoController, render
36 from rhodecode.lib.helpers import RepoPage
37 from rhodecode.lib.helpers import RepoPage
37 from rhodecode.lib.compat import json
38 from rhodecode.lib.compat import json
38 from rhodecode.lib.graphmod import _colored, _dagwalker
39 from rhodecode.lib.graphmod import _colored, _dagwalker
39 from rhodecode.lib.vcs.exceptions import RepositoryError, ChangesetDoesNotExistError,\
40 from rhodecode.lib.vcs.exceptions import RepositoryError, ChangesetDoesNotExistError,\
40 ChangesetError, NodeDoesNotExistError, EmptyRepositoryError
41 ChangesetError, NodeDoesNotExistError, EmptyRepositoryError
41 from rhodecode.lib.utils2 import safe_int
42 from rhodecode.lib.utils2 import safe_int
42 from webob.exc import HTTPNotFound
43
43
44
44 log = logging.getLogger(__name__)
45 log = logging.getLogger(__name__)
45
46
46
47
47 def _load_changelog_summary():
48 def _load_changelog_summary():
48 p = safe_int(request.GET.get('page'), 1)
49 p = safe_int(request.GET.get('page'), 1)
49 size = safe_int(request.GET.get('size'), 10)
50 size = safe_int(request.GET.get('size'), 10)
50
51
51 def url_generator(**kw):
52 def url_generator(**kw):
52 return url('changelog_summary_home',
53 return url('changelog_summary_home',
53 repo_name=c.rhodecode_db_repo.repo_name, size=size, **kw)
54 repo_name=c.rhodecode_db_repo.repo_name, size=size, **kw)
54
55
55 collection = c.rhodecode_repo
56 collection = c.rhodecode_repo
56
57
57 c.repo_changesets = RepoPage(collection, page=p,
58 c.repo_changesets = RepoPage(collection, page=p,
58 items_per_page=size,
59 items_per_page=size,
59 url=url_generator)
60 url=url_generator)
60 page_revisions = [x.raw_id for x in list(c.repo_changesets)]
61 page_revisions = [x.raw_id for x in list(c.repo_changesets)]
61 c.comments = c.rhodecode_db_repo.get_comments(page_revisions)
62 c.comments = c.rhodecode_db_repo.get_comments(page_revisions)
62 c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
63 c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
63
64
64
65
65 class ChangelogController(BaseRepoController):
66 class ChangelogController(BaseRepoController):
66
67
67 def __before__(self):
68 def __before__(self):
68 super(ChangelogController, self).__before__()
69 super(ChangelogController, self).__before__()
69 c.affected_files_cut_off = 60
70 c.affected_files_cut_off = 60
70
71
72 def __get_cs_or_redirect(self, rev, repo, redirect_after=True,
73 partial=False):
74 """
75 Safe way to get changeset if error occur it redirects to changeset with
76 proper message. If partial is set then don't do redirect raise Exception
77 instead
78
79 :param rev: revision to fetch
80 :param repo: repo instance
81 """
82
83 try:
84 return c.rhodecode_repo.get_changeset(rev)
85 except EmptyRepositoryError, e:
86 if not redirect_after:
87 return None
88 h.flash(h.literal(_('There are no changesets yet')),
89 category='warning')
90 redirect(url('changelog_home', repo_name=repo.repo_name))
91
92 except RepositoryError, e:
93 log.error(traceback.format_exc())
94 h.flash(str(e), category='warning')
95 if not partial:
96 redirect(h.url('changelog_home', repo_name=repo.repo_name))
97 raise HTTPBadRequest()
98
71 def _graph(self, repo, revs_int, repo_size, size, p):
99 def _graph(self, repo, revs_int, repo_size, size, p):
72 """
100 """
73 Generates a DAG graph for repo
101 Generates a DAG graph for repo
74
102
75 :param repo:
103 :param repo:
76 :param revs_int:
104 :param revs_int:
77 :param repo_size:
105 :param repo_size:
78 :param size:
106 :param size:
79 :param p:
107 :param p:
80 """
108 """
81 if not revs_int:
109 if not revs_int:
82 c.jsdata = json.dumps([])
110 c.jsdata = json.dumps([])
83 return
111 return
84
112
85 data = []
113 data = []
86 revs = revs_int
114 revs = revs_int
87
115
88 dag = _dagwalker(repo, revs, repo.alias)
116 dag = _dagwalker(repo, revs, repo.alias)
89 dag = _colored(dag)
117 dag = _colored(dag)
90 for (id, type, ctx, vtx, edges) in dag:
118 for (id, type, ctx, vtx, edges) in dag:
91 data.append(['', vtx, edges])
119 data.append(['', vtx, edges])
92
120
93 c.jsdata = json.dumps(data)
121 c.jsdata = json.dumps(data)
94
122
95 @LoginRequired()
123 @LoginRequired()
96 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
124 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
97 'repository.admin')
125 'repository.admin')
98 def index(self, repo_name, revision=None, f_path=None):
126 def index(self, repo_name, revision=None, f_path=None):
99 limit = 100
127 limit = 100
100 default = 20
128 default = 20
101 if request.GET.get('size'):
129 if request.GET.get('size'):
102 c.size = max(min(safe_int(request.GET.get('size')), limit), 1)
130 c.size = max(min(safe_int(request.GET.get('size')), limit), 1)
103 session['changelog_size'] = c.size
131 session['changelog_size'] = c.size
104 session.save()
132 session.save()
105 else:
133 else:
106 c.size = int(session.get('changelog_size', default))
134 c.size = int(session.get('changelog_size', default))
107 # min size must be 1
135 # min size must be 1
108 c.size = max(c.size, 1)
136 c.size = max(c.size, 1)
109 p = safe_int(request.GET.get('page', 1), 1)
137 p = safe_int(request.GET.get('page', 1), 1)
110 branch_name = request.GET.get('branch', None)
138 branch_name = request.GET.get('branch', None)
111 c.changelog_for_path = f_path
139 c.changelog_for_path = f_path
112 try:
140 try:
113
141
114 if f_path:
142 if f_path:
115 log.debug('generating changelog for path %s' % f_path)
143 log.debug('generating changelog for path %s' % f_path)
116 # get the history for the file !
144 # get the history for the file !
117 tip_cs = c.rhodecode_repo.get_changeset()
145 tip_cs = c.rhodecode_repo.get_changeset()
118 try:
146 try:
119 collection = tip_cs.get_file_history(f_path)
147 collection = tip_cs.get_file_history(f_path)
120 except (NodeDoesNotExistError, ChangesetError):
148 except (NodeDoesNotExistError, ChangesetError):
121 #this node is not present at tip !
149 #this node is not present at tip !
122 try:
150 try:
123 cs = self.__get_cs_or_redirect(revision, repo_name)
151 cs = self.__get_css_or_redirect(revision, repo_name)
124 collection = cs.get_file_history(f_path)
152 collection = cs.get_file_history(f_path)
125 except RepositoryError, e:
153 except RepositoryError, e:
126 h.flash(str(e), category='warning')
154 h.flash(str(e), category='warning')
127 redirect(h.url('changelog_home', repo_name=repo_name))
155 redirect(h.url('changelog_home', repo_name=repo_name))
128 collection = list(reversed(collection))
156 collection = list(reversed(collection))
129 else:
157 else:
130 collection = c.rhodecode_repo.get_changesets(start=0,
158 collection = c.rhodecode_repo.get_changesets(start=0,
131 branch_name=branch_name)
159 branch_name=branch_name)
132 c.total_cs = len(collection)
160 c.total_cs = len(collection)
133
161
134 c.pagination = RepoPage(collection, page=p, item_count=c.total_cs,
162 c.pagination = RepoPage(collection, page=p, item_count=c.total_cs,
135 items_per_page=c.size, branch=branch_name,)
163 items_per_page=c.size, branch=branch_name,)
136 collection = list(c.pagination)
164 collection = list(c.pagination)
137 page_revisions = [x.raw_id for x in c.pagination]
165 page_revisions = [x.raw_id for x in c.pagination]
138 c.comments = c.rhodecode_db_repo.get_comments(page_revisions)
166 c.comments = c.rhodecode_db_repo.get_comments(page_revisions)
139 c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
167 c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
140 except (EmptyRepositoryError), e:
168 except (EmptyRepositoryError), e:
141 h.flash(str(e), category='warning')
169 h.flash(str(e), category='warning')
142 return redirect(url('summary_home', repo_name=c.repo_name))
170 return redirect(url('summary_home', repo_name=c.repo_name))
143 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
171 except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
144 log.error(traceback.format_exc())
172 log.error(traceback.format_exc())
145 h.flash(str(e), category='error')
173 h.flash(str(e), category='error')
146 return redirect(url('changelog_home', repo_name=c.repo_name))
174 return redirect(url('changelog_home', repo_name=c.repo_name))
147
175
148 c.branch_name = branch_name
176 c.branch_name = branch_name
149 c.branch_filters = [('', _('All Branches'))] + \
177 c.branch_filters = [('', _('All Branches'))] + \
150 [(k, k) for k in c.rhodecode_repo.branches.keys()]
178 [(k, k) for k in c.rhodecode_repo.branches.keys()]
151 _revs = []
179 _revs = []
152 if not f_path:
180 if not f_path:
153 _revs = [x.revision for x in c.pagination]
181 _revs = [x.revision for x in c.pagination]
154 self._graph(c.rhodecode_repo, _revs, c.total_cs, c.size, p)
182 self._graph(c.rhodecode_repo, _revs, c.total_cs, c.size, p)
155
183
156 return render('changelog/changelog.html')
184 return render('changelog/changelog.html')
157
185
158 @LoginRequired()
186 @LoginRequired()
159 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
187 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
160 'repository.admin')
188 'repository.admin')
161 def changelog_details(self, cs):
189 def changelog_details(self, cs):
162 if request.environ.get('HTTP_X_PARTIAL_XHR'):
190 if request.environ.get('HTTP_X_PARTIAL_XHR'):
163 c.cs = c.rhodecode_repo.get_changeset(cs)
191 c.cs = c.rhodecode_repo.get_changeset(cs)
164 return render('changelog/changelog_details.html')
192 return render('changelog/changelog_details.html')
165 raise HTTPNotFound()
193 raise HTTPNotFound()
166
194
167 @LoginRequired()
195 @LoginRequired()
168 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
196 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
169 'repository.admin')
197 'repository.admin')
170 def changelog_summary(self, repo_name):
198 def changelog_summary(self, repo_name):
171 if request.environ.get('HTTP_X_PARTIAL_XHR'):
199 if request.environ.get('HTTP_X_PARTIAL_XHR'):
172 _load_changelog_summary()
200 _load_changelog_summary()
173
201
174 return render('changelog/changelog_summary_data.html')
202 return render('changelog/changelog_summary_data.html')
175 raise HTTPNotFound()
203 raise HTTPNotFound()
General Comments 0
You need to be logged in to leave comments. Login now