Mercurial > kallithea
diff rhodecode/controllers/files.py @ 1789:17caf4efe15c beta
implements #308 rewrote diffs to enable displaying full diff on each file
- fixed escaping of html special chars in file editor
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Mon, 19 Dec 2011 00:11:20 +0200 |
parents | 5610fd9b6803 |
children | ef0066e95be5 |
line wrap: on
line diff
--- a/rhodecode/controllers/files.py Sun Dec 18 04:41:52 2011 +0200 +++ b/rhodecode/controllers/files.py Mon Dec 19 00:11:20 2011 +0200 @@ -27,19 +27,18 @@ import logging import traceback -from os.path import join as jn - -from pylons import request, response, session, tmpl_context as c, url +from pylons import request, response, tmpl_context as c, url from pylons.i18n.translation import _ from pylons.controllers.util import redirect from pylons.decorators import jsonify from vcs.conf import settings from vcs.exceptions import RepositoryError, ChangesetDoesNotExistError, \ - EmptyRepositoryError, ImproperArchiveTypeError, VCSError, NodeAlreadyExistsError -from vcs.nodes import FileNode, NodeKind + EmptyRepositoryError, ImproperArchiveTypeError, VCSError, \ + NodeAlreadyExistsError +from vcs.nodes import FileNode - +from rhodecode.lib.compat import OrderedDict from rhodecode.lib import convert_line_endings, detect_mode, safe_str from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator from rhodecode.lib.base import BaseRepoController, render @@ -47,6 +46,9 @@ from rhodecode.lib import diffs import rhodecode.lib.helpers as h from rhodecode.model.repo import RepoModel +from rhodecode.controllers.changeset import anchor_url, _ignorews_url,\ + _context_url, get_line_ctx, get_ignore_ws +from rhodecode.lib.diffs import wrapped_diff log = logging.getLogger(__name__) @@ -105,7 +107,6 @@ return file_node - def __get_paths(self, changeset, starting_path): """recursive walk in root dir and return a set of all path in that dir based on repository walk function @@ -128,7 +129,7 @@ @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', 'repository.admin') def index(self, repo_name, revision, f_path): - #reditect to given revision from form if given + # redirect to given revision from form if given post_revision = request.POST.get('at_rev', None) if post_revision: cs = self.__get_cs_or_redirect(post_revision, repo_name) @@ -141,7 +142,7 @@ cur_rev = c.changeset.revision - #prev link + # prev link try: prev_rev = c.rhodecode_repo.get_changeset(cur_rev).prev(c.branch) c.url_prev = url('files_home', repo_name=c.repo_name, @@ -151,7 +152,7 @@ except (ChangesetDoesNotExistError, VCSError): c.url_prev = '#' - #next link + # next link try: next_rev = c.rhodecode_repo.get_changeset(cur_rev).next(c.branch) c.url_next = url('files_home', repo_name=c.repo_name, @@ -161,7 +162,7 @@ except (ChangesetDoesNotExistError, VCSError): c.url_next = '#' - #files or dirs + # files or dirs try: c.file = c.changeset.get_node(f_path) @@ -407,13 +408,17 @@ def diff(self, repo_name, f_path): ignore_whitespace = request.GET.get('ignorews') == '1' line_context = request.GET.get('context', 3) - diff1 = request.GET.get('diff1') - diff2 = request.GET.get('diff2') + 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.big_diff = False - + c.anchor_url = anchor_url + c.ignorews_url = _ignorews_url + c.context_url = _context_url + c.changes = OrderedDict() + c.changes[diff2] = [] try: if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]: c.changeset_1 = c.rhodecode_repo.get_changeset(diff1) @@ -429,14 +434,14 @@ c.changeset_2 = EmptyChangeset(repo=c.rhodecode_repo) node2 = FileNode('.', '', changeset=c.changeset_2) except RepositoryError: - return redirect(url('files_home', - repo_name=c.repo_name, f_path=f_path)) + return redirect(url('files_home', repo_name=c.repo_name, + f_path=f_path)) if c.action == 'download': _diff = diffs.get_gitdiff(node1, node2, ignore_whitespace=ignore_whitespace, context=line_context) - diff = diffs.DiffProcessor(_diff,format='gitdiff') + diff = diffs.DiffProcessor(_diff, format='gitdiff') diff_name = '%s_vs_%s.diff' % (diff1, diff2) response.content_type = 'text/plain' @@ -448,42 +453,25 @@ _diff = diffs.get_gitdiff(node1, node2, ignore_whitespace=ignore_whitespace, context=line_context) - diff = diffs.DiffProcessor(_diff,format='gitdiff') + diff = diffs.DiffProcessor(_diff, format='gitdiff') response.content_type = 'text/plain' return diff.raw_diff() - elif c.action == 'diff': - if node1.is_binary or node2.is_binary: - c.cur_diff = _('Binary file') - elif node1.size > self.cut_off_limit or \ - node2.size > self.cut_off_limit: - c.cur_diff = '' - c.big_diff = True - else: - _diff = diffs.get_gitdiff(node1, node2, - ignore_whitespace=ignore_whitespace, - context=line_context) - diff = diffs.DiffProcessor(_diff,format='gitdiff') - c.cur_diff = diff.as_html() else: + fid = h.FID(diff2, node2.path) + line_context_lcl = get_line_ctx(fid, request.GET) + ign_whitespace_lcl = get_ignore_ws(fid, request.GET) - #default option - if node1.is_binary or node2.is_binary: - c.cur_diff = _('Binary file') - elif node1.size > self.cut_off_limit or \ - node2.size > self.cut_off_limit: - c.cur_diff = '' - c.big_diff = True + lim = request.GET.get('fulldiff') or self.cut_off_limit + _, cs1, cs2, diff, st = wrapped_diff(filenode_old=node1, + filenode_new=node2, + cut_off_limit=lim, + ignore_whitespace=ign_whitespace_lcl, + line_context=line_context_lcl, + enable_comments=False) - else: - _diff = diffs.get_gitdiff(node1, node2, - ignore_whitespace=ignore_whitespace, - context=line_context) - diff = diffs.DiffProcessor(_diff,format='gitdiff') - c.cur_diff = diff.as_html() + c.changes = [('', node2, diff, cs1, cs2, st,)] - if not c.cur_diff and not c.big_diff: - c.no_changes = True return render('files/file_diff.html') def _get_node_history(self, cs, f_path): @@ -501,12 +489,10 @@ hist_l.append(changesets_group) for name, chs in c.rhodecode_repo.branches.items(): - #chs = chs.split(':')[-1] branches_group[0].append((chs, name),) hist_l.append(branches_group) for name, chs in c.rhodecode_repo.tags.items(): - #chs = chs.split(':')[-1] tags_group[0].append((chs, name),) hist_l.append(tags_group)