##// END OF EJS Templates
fixed sorting in repo switcher
fixed sorting in repo switcher

File last commit:

r252:3782a6d6 default
r256:c4901082 default
Show More
files.py
178 lines | 6.8 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>
# 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
"""
Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
r245 from mercurial import archival
from pylons import request, response, session, tmpl_context as c, url
Added archives support. Version bump
r209 from pylons_app.lib.auth import LoginRequired
added empty controllers for branches tags files graph, routing and test for them
r93 from pylons_app.lib.base import BaseController, render
Updated basic files browser with, pygments
r99 from pylons_app.model.hg_model import HgModel
Added archives support. Version bump
r209 from vcs.exceptions import RepositoryError, ChangesetError
moved diff libs to vcs. updated htmls and css for diff and source
r158 from vcs.utils import diffs as differ
Added archives support. Version bump
r209 import logging
Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
r245 import tempfile
Added archives support. Version bump
r209
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()
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 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
prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).raw_id
next_rev = repo.get_changeset(get_next_rev(cur_rev)).raw_id
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 try:
c.file_msg = c.changeset.get_file_message(f_path)
except:
c.file_msg = None
Changeg graph to changelog, and changelog to shortlog
r142 c.cur_rev = c.changeset.raw_id
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
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)
c.cur_rev = cs.raw_id
c.f_path = f_path
c.annotate = cs.get_file_annotate(f_path)
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')
implemented rawdiff and diff download into diff view....
r160 c.action = 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)
c.changeset_1 = c.repo.get_changeset(diff1)
c.changeset_2 = c.repo.get_changeset(diff2)
Fixed differ to properly extract filenames, and dates from diff file. and swaped order of columns with lines nr in diff html
r152
implemented simple diffs for history of files.
r129 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1._short)
c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2._short)
moved diff libs to vcs. updated htmls and css for diff and source
r158 f_udiff = differ.get_udiff(c.changeset_1.get_node(f_path),
c.changeset_2.get_node(f_path))
implemented rawdiff and diff download into diff view....
r160
diff = differ.DiffProcessor(f_udiff)
if action == 'download':
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()
elif action == 'raw':
c.cur_diff = '<pre class="raw">%s</pre>' % diff.raw_diff()
elif action == 'diff':
c.cur_diff = diff.as_html()
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:
n_desc = 'r%s:%s' % (chs.revision, chs._short)
hist_l.append((chs._short, n_desc,))
return hist_l