comparison rhodecode/controllers/shortlog.py @ 3039:a520d542697e beta

Implemented file history page for showing detailed changelog for a given file - fixed git detection of filenode history when executed on directory - shortlog uses urlify_commit function now
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 28 Nov 2012 01:27:21 +0100
parents a16f9a76c26f
children ec483ce69ad9
comparison
equal deleted inserted replaced
3038:16456e7b2231 3039:a520d542697e
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 27
28 from pylons import tmpl_context as c, request, url 28 from pylons import tmpl_context as c, request, url
29 from pylons.i18n.translation import _
29 30
31 from rhodecode.lib import helpers as h
30 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator 32 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
31 from rhodecode.lib.base import BaseRepoController, render 33 from rhodecode.lib.base import BaseRepoController, render
32 from rhodecode.lib.helpers import RepoPage 34 from rhodecode.lib.helpers import RepoPage
33 from pylons.controllers.util import redirect 35 from pylons.controllers.util import redirect
34 from rhodecode.lib.utils2 import safe_int 36 from rhodecode.lib.utils2 import safe_int
37 from rhodecode.lib.vcs.exceptions import NodeDoesNotExistError, ChangesetError,\
38 RepositoryError
35 39
36 log = logging.getLogger(__name__) 40 log = logging.getLogger(__name__)
37 41
38 42
39 class ShortlogController(BaseRepoController): 43 class ShortlogController(BaseRepoController):
42 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 46 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
43 'repository.admin') 47 'repository.admin')
44 def __before__(self): 48 def __before__(self):
45 super(ShortlogController, self).__before__() 49 super(ShortlogController, self).__before__()
46 50
47 def index(self, repo_name): 51 def __get_cs_or_redirect(self, rev, repo_name, redirect_after=True):
52 """
53 Safe way to get changeset if error occur it redirects to tip with
54 proper message
55
56 :param rev: revision to fetch
57 :param repo_name: repo name to redirect after
58 """
59
60 try:
61 return c.rhodecode_repo.get_changeset(rev)
62 except RepositoryError, e:
63 h.flash(str(e), category='warning')
64 redirect(h.url('shortlog_home', repo_name=repo_name))
65
66 def index(self, repo_name, revision=None, f_path=None):
48 p = safe_int(request.params.get('page', 1), 1) 67 p = safe_int(request.params.get('page', 1), 1)
49 size = safe_int(request.params.get('size', 20), 20) 68 size = safe_int(request.params.get('size', 20), 20)
50 69
51 def url_generator(**kw): 70 def url_generator(**kw):
52 return url('shortlog_home', repo_name=repo_name, size=size, **kw) 71 return url('shortlog_home', repo_name=repo_name, size=size, **kw)
53 72
54 c.repo_changesets = RepoPage(c.rhodecode_repo, page=p, 73 collection = c.rhodecode_repo
74 c.file_history = f_path
75 if f_path:
76 f_path = f_path.lstrip('/')
77 # get the history for the file !
78 tip_cs = c.rhodecode_repo.get_changeset()
79 try:
80 collection = tip_cs.get_file_history(f_path)
81 except (NodeDoesNotExistError, ChangesetError):
82 #this node is not present at tip !
83 try:
84 cs = self.__get_cs_or_redirect(revision, repo_name)
85 collection = cs.get_file_history(f_path)
86 except RepositoryError, e:
87 h.flash(str(e), category='warning')
88 redirect(h.url('shortlog_home', repo_name=repo_name))
89 collection = list(reversed(collection))
90
91 c.repo_changesets = RepoPage(collection, page=p,
55 items_per_page=size, url=url_generator) 92 items_per_page=size, url=url_generator)
56 page_revisions = [x.raw_id for x in list(c.repo_changesets)] 93 page_revisions = [x.raw_id for x in list(collection)]
57 c.statuses = c.rhodecode_db_repo.statuses(page_revisions) 94 c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
58 95
59 if not c.repo_changesets: 96 if not c.repo_changesets:
97 h.flash(_('There are no changesets yet'), category='warning')
60 return redirect(url('summary_home', repo_name=repo_name)) 98 return redirect(url('summary_home', repo_name=repo_name))
61 99
62 c.shortlog_data = render('shortlog/shortlog_data.html') 100 c.shortlog_data = render('shortlog/shortlog_data.html')
63 if request.environ.get('HTTP_X_PARTIAL_XHR'): 101 if request.environ.get('HTTP_X_PARTIAL_XHR'):
64 return c.shortlog_data 102 return c.shortlog_data