##// END OF EJS Templates
implemented manual repo rescann and remapping
implemented manual repo rescann and remapping

File last commit:

r337:fa3835d3 default
r348:e8fc8754 default
Show More
files.py
196 lines | 7.5 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
from pylons_app.lib.utils import EmptyChangeset, get_repo_slug
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 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)
fixed bug for last commit message in file source
r267
Added rawfile support, and few fixes for file
r147
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
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))
c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1.raw_id)
c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2.raw_id)
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()
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