Files
@ c674d994b07c
Branch filter:
Location: kallithea/pylons_app/controllers/files.py - annotation
c674d994b07c
4.8 KiB
text/x-python
html fix
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | aec4c0071cb3 aec4c0071cb3 5b57295601b6 aec4c0071cb3 aec4c0071cb3 aec4c0071cb3 5b57295601b6 5b57295601b6 f905f45c457e 3f01d02c2cc6 b68b2246e5a6 49c7e191c2cd aec4c0071cb3 aec4c0071cb3 aec4c0071cb3 b68b2246e5a6 b68b2246e5a6 5b57295601b6 b68b2246e5a6 aec4c0071cb3 5b57295601b6 5b57295601b6 5b57295601b6 b3c93efd1c97 3f01d02c2cc6 b3c93efd1c97 3f01d02c2cc6 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 5b57295601b6 b3c93efd1c97 873fd2dc62c2 5f42d751c719 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 873fd2dc62c2 873fd2dc62c2 873fd2dc62c2 873fd2dc62c2 873fd2dc62c2 f7218849798a f7218849798a 5f42d751c719 5f42d751c719 873fd2dc62c2 3f01d02c2cc6 5f42d751c719 5b57295601b6 9deb6f1d5b90 9deb6f1d5b90 873fd2dc62c2 873fd2dc62c2 873fd2dc62c2 873fd2dc62c2 0f7f93df5802 0f7f93df5802 873fd2dc62c2 873fd2dc62c2 873fd2dc62c2 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b68b2246e5a6 b3c93efd1c97 b3c93efd1c97 b3c93efd1c97 42d46deb124d 42d46deb124d 42d46deb124d 42d46deb124d 0f7f93df5802 49c7e191c2cd 42d46deb124d 42d46deb124d 42d46deb124d 42d46deb124d 0c00fbaff55a 42d46deb124d 42d46deb124d f905f45c457e f905f45c457e 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 0f7f93df5802 42d46deb124d 42d46deb124d 9deb6f1d5b90 9deb6f1d5b90 9deb6f1d5b90 9deb6f1d5b90 42d46deb124d 9deb6f1d5b90 9deb6f1d5b90 9deb6f1d5b90 9deb6f1d5b90 9deb6f1d5b90 | import logging
from pylons import request, response, session, tmpl_context as c, url, config, app_globals as g
from pylons.controllers.util import abort, redirect
from pylons_app.lib.base import BaseController, render
from pylons_app.lib.utils import get_repo_slug
from pylons_app.model.hg_model import HgModel
from vcs.utils import diffs as differ
from vcs.exceptions import RepositoryError, ChangesetError
from pylons_app.lib.auth import LoginRequired
log = logging.getLogger(__name__)
class FilesController(BaseController):
@LoginRequired()
def __before__(self):
super(FilesController, self).__before__()
def index(self, repo_name, revision, f_path):
hg_model = HgModel()
c.repo = repo = hg_model.get_repo(c.repo_name)
revision = request.POST.get('at_rev', None) or revision
def get_next_rev(cur):
max_rev = len(c.repo.revisions) - 1
r = cur + 1
if r > max_rev:
r = max_rev
return r
def get_prev_rev(cur):
r = cur - 1
return r
c.f_path = f_path
try:
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)
try:
c.file_msg = c.changeset.get_file_message(f_path)
except:
c.file_msg = None
c.cur_rev = c.changeset.raw_id
c.rev_nr = c.changeset.revision
c.files_list = c.changeset.get_node(f_path)
c.file_history = self._get_history(repo, c.files_list, f_path)
except (RepositoryError, ChangesetError):
c.files_list = None
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' \
% f_path.split('/')[-1]
return file_node.content
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')
def archivefile(self, repo_name, revision, fileformat):
return '%s %s %s' % (repo_name, revision, fileformat)
def diff(self, repo_name, f_path):
hg_model = HgModel()
diff1 = request.GET.get('diff1')
diff2 = request.GET.get('diff2')
c.action = action = request.GET.get('diff')
c.no_changes = diff1 == diff2
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)
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)
f_udiff = differ.get_udiff(c.changeset_1.get_node(f_path),
c.changeset_2.get_node(f_path))
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()
return render('files/file_diff.html')
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)
hist_l.append((chs._short, n_desc,))
return hist_l
|