##// END OF EJS Templates
fixes for issue #149
fixes for issue #149

File last commit:

r1217:a3b2b4b4 default
r1217:a3b2b4b4 default
Show More
files.py
276 lines | 10.0 KiB | text/x-python | PythonLexer
fixes #79 cut off limit was added into .ini config files
r812 # -*- coding: utf-8 -*-
"""
rhodecode.controllers.files
~~~~~~~~~~~~~~~~~~~~~~~~~~~
renamed project to rhodecode
r547
fixes #79 cut off limit was added into .ini config files
r812 Files controller for RhodeCode
:created_on: Apr 21, 2010
:author: marcink
changes for release 1.1.5
r1136 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
fixes #79 cut off limit was added into .ini config files
r812 :license: GPLv3, see COPYING for more details.
"""
fixes for issue #149
r1217 # 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.
#
renamed project to rhodecode
r547 # 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.
fixes for issue #149
r1217 #
renamed project to rhodecode
r547 # You should have received a copy of the GNU General Public License
fixes for issue #149
r1217 # along with this program. If not, see <http://www.gnu.org/licenses/>.
fixes #79 cut off limit was added into .ini config files
r812 import tempfile
import logging
import rhodecode.lib.helpers as h
renamed project to rhodecode
r547 from mercurial import archival
fixes #79 cut off limit was added into .ini config files
r812
renamed project to rhodecode
r547 from pylons import request, response, session, tmpl_context as c, url
from pylons.i18n.translation import _
from pylons.controllers.util import redirect
fixes #79 cut off limit was added into .ini config files
r812
renamed project to rhodecode
r547 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
from rhodecode.lib.base import BaseController, render
from rhodecode.lib.utils import EmptyChangeset
Refactor codes for scm model...
r691 from rhodecode.model.scm import ScmModel
fixes #79 cut off limit was added into .ini config files
r812
merged found bugs and fixed for stable release:...
r921 from vcs.exceptions import RepositoryError, ChangesetError, \
ChangesetDoesNotExistError, EmptyRepositoryError
renamed project to rhodecode
r547 from vcs.nodes import FileNode
from vcs.utils import diffs as differ
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 log = logging.getLogger(__name__)
class FilesController(BaseController):
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 @LoginRequired()
@HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
Fixes for raw_id, needed for git...
r636 'repository.admin')
renamed project to rhodecode
r547 def __before__(self):
super(FilesController, self).__before__()
fixed small issue made on latest patches
r813 c.cut_off_limit = self.cut_off_limit
renamed project to rhodecode
r547
changes for release 1.1.5
r1136 def __get_cs_or_redirect(self, rev, repo_name):
"""
Safe way to get changeset if error occur it redirects to tip with
proper message
:param rev: revision to fetch
:param repo_name: repo name to redirect after
"""
_repo = ScmModel().get_repo(c.repo_name)
try:
return _repo.get_changeset(rev)
except EmptyRepositoryError, e:
h.flash(_('There are no files yet'), category='warning')
redirect(h.url('summary_home', repo_name=repo_name))
except RepositoryError, e:
h.flash(str(e), category='warning')
redirect(h.url('files_home', repo_name=repo_name, revision='tip'))
renamed project to rhodecode
r547 def index(self, repo_name, revision, f_path):
changes for release 1.1.5
r1136 cs = self.__get_cs_or_redirect(revision, repo_name)
c.repo = ScmModel().get_repo(c.repo_name)
renamed project to rhodecode
r547 revision = request.POST.get('at_rev', None) or revision
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 def get_next_rev(cur):
max_rev = len(c.repo.revisions) - 1
r = cur + 1
if r > max_rev:
r = max_rev
return r
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 def get_prev_rev(cur):
r = cur - 1
return r
c.f_path = f_path
changes for release 1.1.5
r1136 c.changeset = cs
cur_rev = c.changeset.revision
prev_rev = c.repo.get_changeset(get_prev_rev(cur_rev)).raw_id
next_rev = c.repo.get_changeset(get_next_rev(cur_rev)).raw_id
Fixes for raw_id, needed for git...
r636
changes for release 1.1.5
r1136 c.url_prev = url('files_home', repo_name=c.repo_name,
revision=prev_rev, f_path=f_path)
c.url_next = url('files_home', repo_name=c.repo_name,
revision=next_rev, f_path=f_path)
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 try:
changes for release 1.1.5
r1136 c.files_list = c.changeset.get_node(f_path)
c.file_history = self._get_history(c.repo, c.files_list, f_path)
some changes for #45....
r644 except RepositoryError, e:
h.flash(str(e), category='warning')
changes for release 1.1.5
r1136 redirect(h.url('files_home', repo_name=repo_name,
revision=revision))
some changes for #45....
r644
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 return render('files/files.html')
def rawfile(self, repo_name, revision, f_path):
changes for release 1.1.5
r1136 cs = self.__get_cs_or_redirect(revision, repo_name)
try:
file_node = cs.get_node(f_path)
except RepositoryError, e:
h.flash(str(e), category='warning')
redirect(h.url('files_home', repo_name=repo_name,
revision=cs.raw_id))
fname = f_path.split('/')[-1].encode('utf8', 'replace')
response.content_disposition = 'attachment; filename=%s' % fname
renamed project to rhodecode
r547 response.content_type = file_node.mimetype
return file_node.content
def raw(self, repo_name, revision, f_path):
changes for release 1.1.5
r1136 cs = self.__get_cs_or_redirect(revision, repo_name)
try:
file_node = cs.get_node(f_path)
except RepositoryError, e:
h.flash(str(e), category='warning')
redirect(h.url('files_home', repo_name=repo_name,
revision=cs.raw_id))
renamed project to rhodecode
r547 response.content_type = 'text/plain'
return file_node.content
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 def annotate(self, repo_name, revision, f_path):
changes for release 1.1.5
r1136 cs = self.__get_cs_or_redirect(revision, repo_name)
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774 try:
changes for release 1.1.5
r1136 c.file = cs.get_node(f_path)
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774 except RepositoryError, e:
h.flash(str(e), category='warning')
changes for release 1.1.5
r1136 redirect(h.url('files_home', repo_name=repo_name, revision=cs.raw_id))
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774
changes for release 1.1.5
r1136 c.file_history = self._get_history(ScmModel().get_repo(c.repo_name), c.file, f_path)
c.cs = cs
renamed project to rhodecode
r547 c.f_path = f_path
return render('files/files_annotate.html')
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 def archivefile(self, repo_name, revision, fileformat):
archive_specs = {
'.tar.bz2': ('application/x-tar', 'tbz2'),
'.tar.gz': ('application/x-tar', 'tgz'),
'.zip': ('application/zip', 'zip'),
}
if not archive_specs.has_key(fileformat):
return 'Unknown archive type %s' % fileformat
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 def read_in_chunks(file_object, chunk_size=1024 * 40):
"""Lazy function (generator) to read a file piece by piece.
Default chunk size: 40k."""
while True:
data = file_object.read(chunk_size)
if not data:
break
Fixes for raw_id, needed for git...
r636 yield data
renamed project to rhodecode
r547 archive = tempfile.TemporaryFile()
Refactor codes for scm model...
r691 repo = ScmModel().get_repo(repo_name).repo
renamed project to rhodecode
r547 fname = '%s-%s%s' % (repo_name, revision, fileformat)
archival.archive(repo, archive, revision, archive_specs[fileformat][1],
prefix='%s-%s' % (repo_name, revision))
response.content_type = archive_specs[fileformat][0]
response.content_disposition = 'attachment; filename=%s' % fname
archive.seek(0)
return read_in_chunks(archive)
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 def diff(self, repo_name, f_path):
Refactor codes for scm model...
r691 hg_model = ScmModel()
renamed project to rhodecode
r547 diff1 = request.GET.get('diff1')
diff2 = request.GET.get('diff2')
c.action = request.GET.get('diff')
c.no_changes = diff1 == diff2
c.f_path = f_path
c.repo = hg_model.get_repo(c.repo_name)
try:
if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
c.changeset_1 = c.repo.get_changeset(diff1)
node1 = c.changeset_1.get_node(f_path)
else:
c.changeset_1 = EmptyChangeset()
node1 = FileNode('.', '', changeset=c.changeset_1)
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
c.changeset_2 = c.repo.get_changeset(diff2)
node2 = c.changeset_2.get_node(f_path)
else:
c.changeset_2 = EmptyChangeset()
node2 = FileNode('.', '', changeset=c.changeset_2)
except RepositoryError:
return redirect(url('files_home',
repo_name=c.repo_name, f_path=f_path))
f_udiff = differ.get_udiff(node1, node2)
diff = differ.DiffProcessor(f_udiff)
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 if c.action == 'download':
diff_name = '%s_vs_%s.diff' % (diff1, diff2)
response.content_type = 'text/plain'
response.content_disposition = 'attachment; filename=%s' \
Fixes for raw_id, needed for git...
r636 % diff_name
changes for release 1.1.5
r1136 if node1.is_binary or node2.is_binary:
return _('binary file changed')
renamed project to rhodecode
r547 return diff.raw_diff()
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 elif c.action == 'raw':
fixed raw diff as purly raw without html
r649 response.content_type = 'text/plain'
changes for release 1.1.5
r1136 if node1.is_binary or node2.is_binary:
return _('binary file changed')
fixed raw diff as purly raw without html
r649 return diff.raw_diff()
fixed annotation bug, added history to annotation....
r662
renamed project to rhodecode
r547 elif c.action == 'diff':
fixes #79 cut off limit was added into .ini config files
r812 if node1.size > self.cut_off_limit or node2.size > self.cut_off_limit:
renamed project to rhodecode
r547 c.cur_diff = _('Diff is to big to display')
changes for release 1.1.5
r1136 elif node1.is_binary or node2.is_binary:
c.cur_diff = _('Binary file')
renamed project to rhodecode
r547 else:
c.cur_diff = diff.as_html()
else:
#default option
fixes #79 cut off limit was added into .ini config files
r812 if node1.size > self.cut_off_limit or node2.size > self.cut_off_limit:
renamed project to rhodecode
r547 c.cur_diff = _('Diff is to big to display')
changes for release 1.1.5
r1136 elif node1.is_binary or node2.is_binary:
c.cur_diff = _('Binary file')
renamed project to rhodecode
r547 else:
c.cur_diff = diff.as_html()
Fixes for raw_id, needed for git...
r636
changes for release 1.1.5
r1136 if not c.cur_diff:
c.no_changes = True
renamed project to rhodecode
r547 return render('files/file_diff.html')
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 def _get_history(self, repo, node, f_path):
from vcs.nodes import NodeKind
if not node.kind is NodeKind.FILE:
return []
changesets = node.history
hist_l = []
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774
changesets_group = ([], _("Changesets"))
branches_group = ([], _("Branches"))
tags_group = ([], _("Tags"))
renamed project to rhodecode
r547 for chs in changesets:
n_desc = 'r%s:%s' % (chs.revision, chs.short_id)
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774 changesets_group[0].append((chs.raw_id, n_desc,))
hist_l.append(changesets_group)
for name, chs in c.repository_branches.items():
#chs = chs.split(':')[-1]
branches_group[0].append((chs, name),)
hist_l.append(branches_group)
for name, chs in c.repository_tags.items():
#chs = chs.split(':')[-1]
tags_group[0].append((chs, name),)
hist_l.append(tags_group)
renamed project to rhodecode
r547 return hist_l