##// END OF EJS Templates
Implemented whoosh index building as paster command....
Implemented whoosh index building as paster command. docs update fixed manifest.in for missing yui file. Fixed setup to beta added base for paster upgrade-db command

File last commit:

r662:373ee703 beta
r683:341beaa9 beta
Show More
files.py
218 lines | 8.1 KiB | text/x-python | PythonLexer
renamed project to rhodecode
r547 #!/usr/bin/env python
# encoding: utf-8
# files controller for pylons
# Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
# 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.
"""
Created on April 21, 2010
files controller for pylons
@author: marcink
"""
from mercurial import archival
from pylons import request, response, session, tmpl_context as c, url
from pylons.i18n.translation import _
from pylons.controllers.util import redirect
from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
from rhodecode.lib.base import BaseController, render
from rhodecode.lib.utils import EmptyChangeset
Code refactoring,models renames...
r629 from rhodecode.model.hg import HgModel
renamed project to rhodecode
r547 from vcs.exceptions import RepositoryError, ChangesetError
from vcs.nodes import FileNode
from vcs.utils import diffs as differ
import logging
import rhodecode.lib.helpers as h
import tempfile
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__()
c.file_size_limit = 250 * 1024 #limit of file size to display
def index(self, repo_name, revision, f_path):
hg_model = HgModel()
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)
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=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):
hg_model = HgModel()
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):
hg_model = HgModel()
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):
hg_model = HgModel()
c.repo = hg_model.get_repo(c.repo_name)
fixed annotation bug, added history to annotation....
r662 c.cs = c.repo.get_changeset(revision)
c.file = c.cs.get_node(f_path)
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
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()
repo = HgModel().get_repo(repo_name).repo
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):
hg_model = HgModel()
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':
if node1.size > c.file_size_limit or node2.size > c.file_size_limit:
c.cur_diff = _('Diff is to big to display')
else:
c.cur_diff = diff.as_html()
else:
#default option
if node1.size > c.file_size_limit or node2.size > c.file_size_limit:
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 = []
for chs in changesets:
n_desc = 'r%s:%s' % (chs.revision, chs.short_id)
Fixes for raw_id, needed for git...
r636 hist_l.append((chs.raw_id, n_desc,))
renamed project to rhodecode
r547 return hist_l