##// END OF EJS Templates
implemented #91,...
implemented #91, updated docs, and changelog bumped to newest libs possible for setup.py requirements

File last commit:

r872:b956e6f4 beta
r872:b956e6f4 beta
Show More
files.py
263 lines | 9.3 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
:copyright: (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
: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.
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
implemented #91,...
r872 from vcs.exceptions import RepositoryError, ChangesetError, ChangesetDoesNotExistError
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
def index(self, repo_name, revision, f_path):
Refactor codes for scm model...
r691 hg_model = ScmModel()
fixed annotation bug, added history to annotation....
r662 c.repo = hg_model.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
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 try:
fixed annotation bug, added history to annotation....
r662 c.changeset = c.repo.get_changeset(revision)
some changes for #45....
r644 cur_rev = c.changeset.revision
fixed annotation bug, added history to annotation....
r662 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
renamed project to rhodecode
r547 c.url_prev = url('files_home', repo_name=c.repo_name,
Fixes for raw_id, needed for git...
r636 revision=prev_rev, f_path=f_path)
renamed project to rhodecode
r547 c.url_next = url('files_home', repo_name=c.repo_name,
some changes for #45....
r644 revision=next_rev, f_path=f_path)
Fixes for raw_id, needed for git...
r636
some changes for #45....
r644 try:
c.files_list = c.changeset.get_node(f_path)
fixed annotation bug, added history to annotation....
r662 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')
redirect(h.url('files_home', repo_name=repo_name, revision=revision))
Fixes for raw_id, needed for git...
r636
some changes for #45....
r644 except RepositoryError, e:
h.flash(str(e), category='warning')
redirect(h.url('files_home', repo_name=repo_name, revision='tip'))
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):
Refactor codes for scm model...
r691 hg_model = ScmModel()
renamed project to rhodecode
r547 c.repo = hg_model.get_repo(c.repo_name)
file_node = c.repo.get_changeset(revision).get_node(f_path)
response.content_type = file_node.mimetype
response.content_disposition = 'attachment; filename=%s' \
Fixes for raw_id, needed for git...
r636 % f_path.split('/')[-1]
renamed project to rhodecode
r547 return file_node.content
def raw(self, repo_name, revision, f_path):
Refactor codes for scm model...
r691 hg_model = ScmModel()
renamed project to rhodecode
r547 c.repo = hg_model.get_repo(c.repo_name)
file_node = c.repo.get_changeset(revision).get_node(f_path)
response.content_type = 'text/plain'
Fixes for raw_id, needed for git...
r636
renamed project to rhodecode
r547 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):
Refactor codes for scm model...
r691 hg_model = ScmModel()
renamed project to rhodecode
r547 c.repo = hg_model.get_repo(c.repo_name)
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774
try:
c.cs = c.repo.get_changeset(revision)
c.file = c.cs.get_node(f_path)
except RepositoryError, e:
h.flash(str(e), category='warning')
redirect(h.url('files_home', repo_name=repo_name, revision=revision))
fixed annotation bug, added history to annotation....
r662 c.file_history = self._get_history(c.repo, c.file, 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):
info = fname.split('.')
revision, fileformat = info[0], '.' + '.'.join(info[1:])
renamed project to rhodecode
r547 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):
implemented #91,...
r872 return _('Unknown archive type %s') % fileformat
repo = ScmModel().get_repo(repo_name)
try:
repo.get_changeset(revision)
except ChangesetDoesNotExistError:
return _('Unknown revision %s') % revision
archive = tempfile.TemporaryFile()
localrepo = repo.repo
fname = '%s-%s%s' % (repo_name, revision, fileformat)
archival.archive(localrepo, 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)
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 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
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'
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')
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')
else:
c.cur_diff = diff.as_html()
Fixes for raw_id, needed for git...
r636
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
added tags, and branches to file history select box, fixed annotation changeset errors crash on wrongly given revions
r774
# [
# ([("u1", "User1"), ("u2", "User2")], "Users"),
# ([("g1", "Group1"), ("g2", "Group2")], "Groups")
# ]