##// END OF EJS Templates
moved out commit into scm model, and added cache invalidation after commit.
moved out commit into scm model, and added cache invalidation after commit.

File last commit:

r1311:6705eeeb beta
r1311:6705eeeb beta
Show More
files.py
409 lines | 15.6 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
source code cleanup: remove trailing white space, normalize file endings
r1203
fixes #79 cut off limit was added into .ini config files
r812 :created_on: Apr 21, 2010
:author: marcink
source code cleanup: remove trailing white space, normalize file endings
r1203 :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.
"""
fixed license issue #149
r1206 # 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.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
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.
source code cleanup: remove trailing white space, normalize file endings
r1203 #
renamed project to rhodecode
r547 # You should have received a copy of the GNU General Public License
fixed license issue #149
r1206 # along with this program. If not, see <http://www.gnu.org/licenses/>.
fixed issue with vcs stream
r1134
added os.sep for files controller...
r1200 import os
fixes #79 cut off limit was added into .ini config files
r812 import logging
changed raw action to show images instead of saying about binary file...
r1241 import mimetypes
Added server side file editing with commit
r1305 import traceback
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
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
Added server side file editing with commit
r1305 from rhodecode.lib import convert_line_endings, detect_mode
from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
from rhodecode.lib.base import BaseRepoController, render
from rhodecode.lib.utils import EmptyChangeset
import rhodecode.lib.helpers as h
from rhodecode.model.repo import RepoModel
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()
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
source code cleanup: remove trailing white space, normalize file endings
r1203
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
source code cleanup: remove trailing white space, normalize file endings
r1203
fixes for rawfile, annotation, download. It will check now if it's a filenode....
r1189 :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
Added server side file editing with commit
r1305 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
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:
files: fixes error when passing a diff without parameters and caused server crash...
r1224 cs = self.__get_cs_or_redirect(post_revision, repo_name)
clean and fixes in files controller
r1137 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
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
renamed project to rhodecode
r547 return render('files/files.html')
Added server side file editing with commit
r1305 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
renamed project to rhodecode
r547 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' % \
added os.sep for files controller...
r1200 f_path.split(os.sep)[-1].encode('utf8', 'replace')
fixes for rawfile, annotation, download. It will check now if it's a filenode....
r1189
renamed project to rhodecode
r547 response.content_type = file_node.mimetype
return file_node.content
Added server side file editing with commit
r1305 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
renamed project to rhodecode
r547 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
changed raw action to show images instead of saying about binary file...
r1241 raw_mimetype_mapping = {
# map original mimetype to a mimetype used for "show as raw"
# you can also provide a content-disposition to override the
# default "attachment" disposition.
# orig_type: (new_type, new_dispo)
# show images inline:
'image/x-icon': ('image/x-icon', 'inline'),
'image/png': ('image/png', 'inline'),
'image/gif': ('image/gif', 'inline'),
'image/jpeg': ('image/jpeg', 'inline'),
'image/svg+xml': ('image/svg+xml', 'inline'),
}
mimetype = file_node.mimetype
try:
mimetype, dispo = raw_mimetype_mapping[mimetype]
except KeyError:
# we don't know anything special about this, handle it safely
if file_node.is_binary:
# do same as download raw for binary files
mimetype, dispo = 'application/octet-stream', 'attachment'
else:
# do not just use the original mimetype, but force text/plain,
# otherwise it would serve text/html and that might be unsafe.
# Note: underlying vcs library fakes text/plain mimetype if the
PEP8ify - controllers
r1245 # mimetype can not be determined and it thinks it is not
# binary.This might lead to erroneous text display in some
# cases, but helps in other cases, like with text files
# without extension.
changed raw action to show images instead of saying about binary file...
r1241 mimetype, dispo = 'text/plain', 'inline'
if dispo == 'attachment':
dispo = 'attachment; filename=%s' % \
f_path.split(os.sep)[-1].encode('utf8', 'replace')
response.content_disposition = dispo
response.content_type = mimetype
renamed project to rhodecode
r547 return file_node.content
Fixes for raw_id, needed for git...
r636
Added server side file editing with commit
r1305 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
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
Added server side file editing with commit
r1305 @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin')
def edit(self, repo_name, revision, f_path):
r_post = request.POST
c.cs = self.__get_cs_or_redirect(revision, repo_name)
c.file = self.__get_filenode_or_redirect(repo_name, c.cs, f_path)
c.file_history = self._get_node_history(c.cs, f_path)
c.f_path = f_path
if r_post:
old_content = c.file.content
Added support for ascendent characters for inMemoryCommit
r1306 sl = old_content.splitlines(1)
first_line = sl[0] if sl else ''
Added server side file editing with commit
r1305 # modes: 0 - Unix, 1 - Mac, 2 - DOS
Added support for ascendent characters for inMemoryCommit
r1306 mode = detect_mode(first_line, 0)
Added server side file editing with commit
r1305 content = convert_line_endings(r_post.get('content'), mode)
Added support for ascendent characters for inMemoryCommit
r1306
Added server side file editing with commit
r1305 message = r_post.get('message') or (_('Edited %s via RhodeCode')
% (f_path))
moved out commit into scm model, and added cache invalidation after commit.
r1311 author = self.rhodecode_user.full_contact
Added server side file editing with commit
r1305
if content == old_content:
h.flash(_('No changes'),
category='warning')
Added support for ascendent characters for inMemoryCommit
r1306 return redirect(url('changeset_home', repo_name=c.repo_name,
revision='tip'))
Added server side file editing with commit
r1305 try:
moved out commit into scm model, and added cache invalidation after commit.
r1311 self.scm_model.commit_change(repo=c.rhodecode_repo,
repo_name=repo_name, cs=c.cs,
author=author, message=message,
content=content, f_path=f_path)
Added server side file editing with commit
r1305 h.flash(_('Successfully committed to %s' % f_path),
category='success')
Added support for ascendent characters for inMemoryCommit
r1306
moved out commit into scm model, and added cache invalidation after commit.
r1311 except Exception:
Added server side file editing with commit
r1305 log.error(traceback.format_exc())
h.flash(_('Error occurred during commit'), category='error')
return redirect(url('changeset_home',
repo_name=c.repo_name, revision='tip'))
return render('files/files_edit.html')
@HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
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
changes for archivals in rhodecode. Also made it work for git that way
r1308 import tempfile
archive = tempfile.mkstemp()[1]
t = open(archive, 'wb')
cs.fill_archive(stream=t, kind=fileformat)
def get_chunked_archive(archive):
stream = open(archive, 'rb')
while True:
data = stream.read(4096)
if not data:
os.remove(archive)
break
yield data
return get_chunked_archive(archive)
fixed archival in rhodecode to use new functions from vcs
r948
Added server side file editing with commit
r1305 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
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
Added show as raw into big diff
r1273 c.big_diff = False
renamed project to rhodecode
r547
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:
files: fixes error when passing a diff without parameters and caused server crash...
r1224 c.changeset_1 = EmptyChangeset(repo=c.rhodecode_repo)
renamed project to rhodecode
r547 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:
files: fixes error when passing a diff without parameters and caused server crash...
r1224 c.changeset_2 = EmptyChangeset(repo=c.rhodecode_repo)
renamed project to rhodecode
r547 node2 = FileNode('.', '', changeset=c.changeset_2)
except RepositoryError:
return redirect(url('files_home',
repo_name=c.repo_name, f_path=f_path))
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')
pep8ify
r1212 elif node1.size > self.cut_off_limit or \
node2.size > self.cut_off_limit:
Added show as raw into big diff
r1273 c.cur_diff = ''
c.big_diff = True
memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit....
r1149 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')
pep8ify
r1212 elif node1.size > self.cut_off_limit or \
node2.size > self.cut_off_limit:
Added show as raw into big diff
r1273 c.cur_diff = ''
c.big_diff = True
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
Added show as raw into big diff
r1273 if not c.cur_diff and not c.big_diff:
memory optimizations, call diffs only when needed ie. after checking for binary, and cutoff limit....
r1149 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