##// END OF EJS Templates
some fixups in cache, added fallback and cache invalidation when key not found in cached repos list,...
some fixups in cache, added fallback and cache invalidation when key not found in cached repos list, added extra test, some other small fixes

File last commit:

r512:d945c95b default
r535:72778dda default
Show More
files.py
207 lines | 8.0 KiB | text/x-python | PythonLexer
licensing updates, code cleanups
r252 #!/usr/bin/env python
# encoding: utf-8
# files controller for pylons
# Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com>
Implemented permissions into hg app, secured admin controllers, templates and repository specific controllers
r318
licensing updates, code cleanups
r252 # 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
"""
Implemented permissions into hg app, secured admin controllers, templates and repository specific controllers
r318 from mercurial import archival
from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import redirect
from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
from pylons_app.lib.base import BaseController, render
fixes #24, added generator that generates equally distrybuted colors. Thus skipping creating one large coloring history.
r438 from pylons_app.lib.utils import EmptyChangeset
Implemented permissions into hg app, secured admin controllers, templates and repository specific controllers
r318 from pylons_app.model.hg_model import HgModel
from vcs.exceptions import RepositoryError, ChangesetError
from vcs.nodes import FileNode
from vcs.utils import diffs as differ
import logging
import pylons_app.lib.helpers as h
import tempfile
Implemented mercurial style diff-lib
r131
added empty controllers for branches tags files graph, routing and test for them
r93 log = logging.getLogger(__name__)
class FilesController(BaseController):
Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user....
r191
@LoginRequired()
Implemented permissions into hg app, secured admin controllers, templates and repository specific controllers
r318 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
'repository.admin')
Updated basic files browser with, pygments
r99 def __before__(self):
Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user....
r191 super(FilesController, self).__before__()
added limit for showing pygemntized source codes larger than 250kb.
r485 c.file_size_limit = 250 * 1024 #limit of file size to display
added empty controllers for branches tags files graph, routing and test for them
r93
Updated basic files browser with, pygments
r99 def index(self, repo_name, revision, f_path):
hg_model = HgModel()
c.repo = repo = hg_model.get_repo(c.repo_name)
Updated template for summary (archives links)...
r149 revision = request.POST.get('at_rev', None) or revision
fixed error when browsing revisions on path that doesn't exist. Fixed files browsing. Fixed templates in branches and tags
r145
Updated template for summary (archives links)...
r149 def get_next_rev(cur):
fixed error when browsing revisions on path that doesn't exist. Fixed files browsing. Fixed templates in branches and tags
r145 max_rev = len(c.repo.revisions) - 1
Updated template for summary (archives links)...
r149 r = cur + 1
if r > max_rev:
r = max_rev
return r
def get_prev_rev(cur):
r = cur - 1
return r
Updated basic files browser with, pygments
r99 c.f_path = f_path
Updated template for summary (archives links)...
r149
Added rawfile support, and few fixes for file
r147
fixed files when repository is empty
r138 try:
Updated template for summary (archives links)...
r149 cur_rev = repo.get_changeset(revision).revision
refactoring for new vcs implementation...
r512 prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).short_id
next_rev = repo.get_changeset(get_next_rev(cur_rev)).short_id
Updated template for summary (archives links)...
r149
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)
c.changeset = repo.get_changeset(revision)
Added rawfile support, and few fixes for file
r147
refactoring for new vcs implementation...
r512 c.cur_rev = c.changeset.short_id
Changeg graph to changelog, and changelog to shortlog
r142 c.rev_nr = c.changeset.revision
fixed files when repository is empty
r138 c.files_list = c.changeset.get_node(f_path)
c.file_history = self._get_history(repo, c.files_list, f_path)
Added rawfile support, and few fixes for file
r147
fixed error when browsing revisions on path that doesn't exist. Fixed files browsing. Fixed templates in branches and tags
r145 except (RepositoryError, ChangesetError):
fixed files when repository is empty
r138 c.files_list = None
Updated basic files browser with, pygments
r99
Implemented file history.
r128 return render('files/files.html')
Added rawfile support, and few fixes for file
r147 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)
implemented rawdiff and diff download into diff view....
r160 response.content_type = file_node.mimetype
response.content_disposition = 'attachment; filename=%s' \
Added rawfile support, and few fixes for file
r147 % f_path.split('/')[-1]
return file_node.content
added limit for showing pygemntized source codes larger than 250kb.
r485
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'
return file_node.content
Added rawfile support, and few fixes for file
r147
Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user....
r191 def annotate(self, repo_name, revision, f_path):
hg_model = HgModel()
c.repo = hg_model.get_repo(c.repo_name)
cs = c.repo.get_changeset(revision)
c.file = cs.get_node(f_path)
c.file_msg = cs.get_file_message(f_path)
refactoring for new vcs implementation...
r512 c.cur_rev = cs.short_id
templating fixes
r375 c.rev_nr = cs.revision
Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user....
r191 c.f_path = f_path
removed unneded value
r335
Authenticated controller with LoginRequired decorator, and cleaned __before__ (used in baseController now). fixed User for clone url with logged in session user....
r191 return render('files/files_annotate.html')
Updated template for summary (archives links)...
r149 def archivefile(self, repo_name, revision, fileformat):
Added archives support. Version bump
r209 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
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
yield data
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)
Updated template for summary (archives links)...
r149
implemented simple diffs for history of files.
r129 def diff(self, repo_name, f_path):
hg_model = HgModel()
diff1 = request.GET.get('diff1')
diff2 = request.GET.get('diff2')
fixed bug when diff command was different than available options
r337 c.action = request.GET.get('diff')
Implemented mercurial style diff-lib
r131 c.no_changes = diff1 == diff2
implemented simple diffs for history of files.
r129 c.f_path = f_path
c.repo = hg_model.get_repo(c.repo_name)
Fixed differ to properly extract filenames, and dates from diff file. and swaped order of columns with lines nr in diff html
r152
fixed bugs when putting empty or unknown changesets into diff
r275 try:
if diff1 not in ['', None, 'None', '0' * 12]:
c.changeset_1 = c.repo.get_changeset(diff1)
node1 = c.changeset_1.get_node(f_path)
else:
c.changeset_1 = EmptyChangeset()
node1 = FileNode('.', '')
if diff2 not in ['', None, 'None', '0' * 12]:
c.changeset_2 = c.repo.get_changeset(diff2)
node2 = c.changeset_2.get_node(f_path)
else:
c.changeset_2 = EmptyChangeset()
node2 = FileNode('.', '')
except RepositoryError:
return redirect(url('files_home',
repo_name=c.repo_name, f_path=f_path))
refactoring for new vcs implementation...
r512 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1.short_id)
c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2.short_id)
fixed bugs when putting empty or unknown changesets into diff
r275 f_udiff = differ.get_udiff(node1, node2)
implemented rawdiff and diff download into diff view....
r160
diff = differ.DiffProcessor(f_udiff)
fixed bug when diff command was different than available options
r337 if c.action == 'download':
implemented rawdiff and diff download into diff view....
r160 diff_name = '%s_vs_%s.diff' % (diff1, diff2)
response.content_type = 'text/plain'
response.content_disposition = 'attachment; filename=%s' \
% diff_name
return diff.raw_diff()
fixed bug when diff command was different than available options
r337 elif c.action == 'raw':
fixed bug when displaying html not escaped data as raw diff.
r272 c.cur_diff = '<pre class="raw">%s</pre>' % h.escape(diff.raw_diff())
fixed bug when diff command was different than available options
r337 elif c.action == 'diff':
implemented rawdiff and diff download into diff view....
r160 c.cur_diff = diff.as_html()
fixed bug when diff command was different than available options
r337 else:
#default option
c.cur_diff = diff.as_html()
Bugfix for empty diff
r349
if not c.cur_diff: c.no_changes = True
implemented simple diffs for history of files.
r129 return render('files/file_diff.html')
Implemented file history.
r128 def _get_history(self, repo, node, f_path):
from vcs.nodes import NodeKind
if not node.kind is NodeKind.FILE:
return []
implemented simple diffs for history of files.
r129 changesets = node.history
Implemented file history.
r128 hist_l = []
for chs in changesets:
refactoring for new vcs implementation...
r512 n_desc = 'r%s:%s' % (chs.revision, chs.short_id)
hist_l.append((chs.short_id, n_desc,))
Implemented file history.
r128 return hist_l