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

File last commit:

r1190:0d7a127e beta
r1194:07963dd1 beta
Show More
files.py
303 lines | 10.9 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
fixed copyright year to 2011
r902 :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.
"""
renamed project to rhodecode
r547 # 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; version 2
# of the License or (at your opinion) any later version of the license.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
fixed issue with vcs stream
r1134
fixes #79 cut off limit was added into .ini config files
r812 import logging
import rhodecode.lib.helpers as h
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
another major codes rewrite:...
r1045 from rhodecode.lib.base import BaseRepoController, render
renamed project to rhodecode
r547 from rhodecode.lib.utils import EmptyChangeset
another major codes rewrite:...
r1045 from rhodecode.model.repo import RepoModel
fixes #79 cut off limit was added into .ini config files
r812
fixed archival in rhodecode to use new functions from vcs
r948 from vcs.backends import ARCHIVE_SPECS
fixed issue with vcs stream
r1134 from vcs.exceptions import RepositoryError, ChangesetDoesNotExistError, \
EmptyRepositoryError, ImproperArchiveTypeError, VCSError
another major codes rewrite:...
r1045 from vcs.nodes import FileNode, NodeKind
renamed project to rhodecode
r547 from vcs.utils import diffs as differ
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 log = logging.getLogger(__name__)
fixed issue with vcs stream
r1134
another major codes rewrite:...
r1045 class FilesController(BaseRepoController):
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
clean and fixes in files controller
r1137 def __get_cs_or_redirect(self, rev, repo_name):
another major codes rewrite:...
r1045 """
clean and fixes in files controller
r1137 Safe way to get changeset if error occur it redirects to tip with
proper message
another major codes rewrite:...
r1045 :param rev: revision to fetch
:param repo_name: repo name to redirect after
"""
try:
return c.rhodecode_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'))
fixes for rawfile, annotation, download. It will check now if it's a filenode....
r1189
def __get_filenode_or_redirect(self, repo_name, cs, path):
"""
Returns file_node, if error occurs or given path is directory,
it'll redirect to top level path
:param repo_name: repo_name
:param cs: given changeset
:param path: path to lookup
"""
try:
file_node = cs.get_node(path)
if file_node.is_dir():
raise RepositoryError('given path is a directory')
except RepositoryError, e:
h.flash(str(e), category='warning')
redirect(h.url('files_home', repo_name=repo_name,
revision=cs.raw_id))
return file_node
renamed project to rhodecode
r547 def index(self, repo_name, revision, f_path):
clean and fixes in files controller
r1137 #reditect to given revision from form if given
post_revision = request.POST.get('at_rev', None)
if post_revision:
cs = self.__get_cs_or_redirect(revision, repo_name)
redirect(url('files_home', repo_name=c.repo_name,
revision=cs.raw_id, f_path=f_path))
Fixes for raw_id, needed for git...
r636
Fixed url bug when using numeric revision in file browser,...
r884
clean and fixes in files controller
r1137 c.changeset = self.__get_cs_or_redirect(revision, repo_name)
c.branch = request.GET.get('branch', None)
c.f_path = f_path
Fixed url bug when using numeric revision in file browser,...
r884
clean and fixes in files controller
r1137 cur_rev = c.changeset.revision
Fixes for raw_id, needed for git...
r636
clean and fixes in files controller
r1137 #prev link
try:
prev_rev = c.rhodecode_repo.get_changeset(cur_rev).prev(c.branch)
c.url_prev = url('files_home', repo_name=c.repo_name,
revision=prev_rev.raw_id, f_path=f_path)
if c.branch:
c.url_prev += '?branch=%s' % c.branch
except (ChangesetDoesNotExistError, VCSError):
c.url_prev = '#'
Changed prev/next in file browser to new vcs methods
r883
clean and fixes in files controller
r1137 #next link
try:
next_rev = c.rhodecode_repo.get_changeset(cur_rev).next(c.branch)
c.url_next = url('files_home', repo_name=c.repo_name,
revision=next_rev.raw_id, f_path=f_path)
if c.branch:
c.url_next += '?branch=%s' % c.branch
except (ChangesetDoesNotExistError, VCSError):
c.url_next = '#'
Fixes for raw_id, needed for git...
r636
fixes for rawfile, annotation, download. It will check now if it's a filenode....
r1189 #files or dirs
clean and fixes in files controller
r1137 try:
c.files_list = c.changeset.get_node(f_path)
use cs get history instead of node.history, node history have to much reference calls
r1190
if c.files_list.is_file():
c.file_history = self._get_node_history(c.changeset, f_path)
else:
c.file_history = []
some changes for #45....
r644 except RepositoryError, e:
h.flash(str(e), category='warning')
clean and fixes in files controller
r1137 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):
clean and fixes in files controller
r1137 cs = self.__get_cs_or_redirect(revision, repo_name)
fixes for rawfile, annotation, download. It will check now if it's a filenode....
r1189 file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path)
another major codes rewrite:...
r1045
fixes for rawfile, annotation, download. It will check now if it's a filenode....
r1189 response.content_disposition = 'attachment; filename=%s' % \
f_path.split('/')[-1].encode('utf8', 'replace')
renamed project to rhodecode
r547 response.content_type = file_node.mimetype
return file_node.content
def raw(self, repo_name, revision, f_path):
clean and fixes in files controller
r1137 cs = self.__get_cs_or_redirect(revision, repo_name)
fixes for rawfile, annotation, download. It will check now if it's a filenode....
r1189 file_node = self.__get_filenode_or_redirect(repo_name, cs, f_path)
another major codes rewrite:...
r1045
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):
use cs get history instead of node.history, node history have to much reference calls
r1190 c.cs = self.__get_cs_or_redirect(revision, repo_name)
c.file = self.__get_filenode_or_redirect(repo_name, c.cs, f_path)
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774
use cs get history instead of node.history, node history have to much reference calls
r1190 c.file_history = self._get_node_history(c.cs, f_path)
renamed project to rhodecode
r547 c.f_path = f_path
return render('files/files_annotate.html')
Fixes for raw_id, needed for git...
r636
implemented #91,...
r872 def archivefile(self, repo_name, fname):
fixed error when trying to make download on empty repository
r945
added branch/tag options to download links in summary
r942 fileformat = None
revision = None
fixed archival in rhodecode to use new functions from vcs
r948 ext = None
fixed error when trying to make download on empty repository
r945
fixed archival in rhodecode to use new functions from vcs
r948 for a_type, ext_data in ARCHIVE_SPECS.items():
archive_spec = fname.split(ext_data[1])
if len(archive_spec) == 2 and archive_spec[1] == '':
fileformat = a_type or ext_data[1]
added branch/tag options to download links in summary
r942 revision = archive_spec[0]
fixed archival in rhodecode to use new functions from vcs
r948 ext = ext_data[1]
implemented #91,...
r872
try:
another major codes rewrite:...
r1045 dbrepo = RepoModel().get_by_repo_name(repo_name)
another major code rafactor, reimplemented (almost from scratch)...
r1038 if dbrepo.enable_downloads is False:
implemented #84 downloads can be enabled/disabled per each repository from now.
r962 return _('downloads disabled')
another major codes rewrite:...
r1045 cs = c.rhodecode_repo.get_changeset(revision)
fixed key error on unknown archival
r950 content_type = ARCHIVE_SPECS[fileformat][0]
implemented #91,...
r872 except ChangesetDoesNotExistError:
return _('Unknown revision %s') % revision
fixed error when trying to make download on empty repository
r945 except EmptyRepositoryError:
return _('Empty repository')
fixed typo in exception
r961 except (ImproperArchiveTypeError, KeyError):
fixed archival in rhodecode to use new functions from vcs
r948 return _('Unknown archive type')
implemented #91,...
r872
fixed key error on unknown archival
r950 response.content_type = content_type
response.content_disposition = 'attachment; filename=%s-%s%s' \
% (repo_name, revision, ext)
Fixes for raw_id, needed for git...
r636
fixed problems with archives
r1151 return cs.get_chunked_archive(stream=None, kind=fileformat)
fixed archival in rhodecode to use new functions from vcs
r948
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 def diff(self, repo_name, f_path):
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
try:
if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
another major codes rewrite:...
r1045 c.changeset_1 = c.rhodecode_repo.get_changeset(diff1)
renamed project to rhodecode
r547 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]:
another major codes rewrite:...
r1045 c.changeset_2 = c.rhodecode_repo.get_changeset(diff2)
renamed project to rhodecode
r547 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))
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 if c.action == 'download':
fixed files diffs to use gitdiff enabled diffs
r1132 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
format='gitdiff')
changed raw and download diffs to gitdiff
r1044
renamed project to rhodecode
r547 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
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 files diffs to use gitdiff enabled diffs
r1132 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
format='gitdiff')
fixed raw diff as purly raw without html
r649 response.content_type = 'text/plain'
return diff.raw_diff()
fixed annotation bug, added history to annotation....
r662
renamed project to rhodecode
r547 elif c.action == 'diff':
memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit....
r1149
if node1.is_binary or node2.is_binary:
c.cur_diff = _('Binary file')
elif node1.size > self.cut_off_limit or node2.size > self.cut_off_limit:
c.cur_diff = _('Diff is too big to display')
else:
diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
fixed files diffs to use gitdiff enabled diffs
r1132 format='gitdiff')
renamed project to rhodecode
r547 c.cur_diff = diff.as_html()
else:
memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit....
r1149
renamed project to rhodecode
r547 #default option
memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit....
r1149 if node1.is_binary or node2.is_binary:
fixed binary file issues
r1043 c.cur_diff = _('Binary file')
memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit....
r1149 elif node1.size > self.cut_off_limit or node2.size > self.cut_off_limit:
c.cur_diff = _('Diff is too big to display')
renamed project to rhodecode
r547 else:
memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit....
r1149 diff = differ.DiffProcessor(differ.get_gitdiff(node1, node2),
format='gitdiff')
renamed project to rhodecode
r547 c.cur_diff = diff.as_html()
Fixes for raw_id, needed for git...
r636
memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit....
r1149 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
use cs get history instead of node.history, node history have to much reference calls
r1190 def _get_node_history(self, cs, f_path):
changesets = cs.get_file_history(f_path)
renamed project to rhodecode
r547 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)
another major codes rewrite:...
r1045 for name, chs in c.rhodecode_repo.branches.items():
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774 #chs = chs.split(':')[-1]
branches_group[0].append((chs, name),)
hist_l.append(branches_group)
another major codes rewrite:...
r1045 for name, chs in c.rhodecode_repo.tags.items():
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774 #chs = chs.split(':')[-1]
tags_group[0].append((chs, name),)
hist_l.append(tags_group)
renamed project to rhodecode
r547 return hist_l
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774