# HG changeset patch # User Marcin Kuzminski # Date 2010-09-10 23:52:16 # Node ID 183cee11057883048c249980421c3f8d0892c600 # Parent e01a85f9fc9052c6eefa9a7ec7b7bfa40a44983c first implementation of #34 changeset raw diff based on udiff from python diff --git a/pylons_app/config/routing.py b/pylons_app/config/routing.py --- a/pylons_app/config/routing.py +++ b/pylons_app/config/routing.py @@ -128,6 +128,9 @@ def make_map(config): map.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}', controller='changeset', revision='tip', conditions=dict(function=check_repo)) + map.connect('raw_changeset_home', '/{repo_name:.*}/raw-changeset/{revision}', + controller='changeset',action='raw_changeset', revision='tip', + conditions=dict(function=check_repo)) map.connect('summary_home', '/{repo_name:.*}/summary', controller='summary', conditions=dict(function=check_repo)) map.connect('shortlog_home', '/{repo_name:.*}/shortlog', diff --git a/pylons_app/controllers/changeset.py b/pylons_app/controllers/changeset.py --- a/pylons_app/controllers/changeset.py +++ b/pylons_app/controllers/changeset.py @@ -2,7 +2,6 @@ # encoding: utf-8 # changeset controller for pylons # Copyright (C) 2009-2010 Marcin Kuzminski - # 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 @@ -22,7 +21,7 @@ Created on April 25, 2010 changeset controller for pylons @author: marcink """ -from pylons import tmpl_context as c, url, request +from pylons import tmpl_context as c, url, request, response from pylons.controllers.util import redirect from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator from pylons_app.lib.base import BaseController, render @@ -64,12 +63,7 @@ class ChangesetController(BaseController else: f_udiff = differ.get_udiff(filenode_old, node) diff = differ.DiffProcessor(f_udiff).as_html() - try: - diff = unicode(diff) - except: - log.warning('Decoding failed of %s', filenode_old) - log.warning('Decoding failed of %s', node) - diff = 'unsupported type' + cs1 = None cs2 = node.last_changeset.raw_id c.changes.append(('added', node, diff, cs1, cs2)) @@ -81,12 +75,7 @@ class ChangesetController(BaseController else: f_udiff = differ.get_udiff(filenode_old, node) diff = differ.DiffProcessor(f_udiff).as_html() - try: - diff = unicode(diff) - except: - log.warning('Decoding failed of %s', filenode_old) - log.warning('Decoding failed of %s', node) - diff = 'unsupported type' + cs1 = filenode_old.last_changeset.raw_id cs2 = node.last_changeset.raw_id c.changes.append(('changed', node, diff, cs1, cs2)) @@ -95,3 +84,53 @@ class ChangesetController(BaseController c.changes.append(('removed', node, None, None, None)) return render('changeset/changeset.html') + + def raw_changeset(self,revision): + + hg_model = HgModel() + try: + c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision) + except RepositoryError: + log.error(traceback.format_exc()) + return redirect(url('hg_home')) + else: + try: + c.changeset_old = c.changeset.parents[0] + except IndexError: + c.changeset_old = None + c.changes = [] + + for node in c.changeset.added: + filenode_old = FileNode(node.path, '') + if filenode_old.is_binary or node.is_binary: + diff = 'binary file' + else: + f_udiff = differ.get_udiff(filenode_old, node) + diff = differ.DiffProcessor(f_udiff).raw_diff() + + cs1 = None + cs2 = node.last_changeset.raw_id + c.changes.append(('added', node, diff, cs1, cs2)) + + for node in c.changeset.changed: + filenode_old = c.changeset_old.get_node(node.path) + if filenode_old.is_binary or node.is_binary: + diff = 'binary file' + else: + f_udiff = differ.get_udiff(filenode_old, node) + diff = differ.DiffProcessor(f_udiff).raw_diff() + + cs1 = filenode_old.last_changeset.raw_id + cs2 = node.last_changeset.raw_id + c.changes.append(('changed', node, diff, cs1, cs2)) + + response.content_type = 'text/plain' + + parent = True if len(c.changeset.parents) > 0 else False + c.parent_tmpl = 'Parent %s' % c.changeset.parents[0]._hex if parent else '' + + c.diffs = '' + for x in c.changes: + c.diffs += x[2] + + return render('changeset/raw_changeset.html') diff --git a/pylons_app/templates/changeset/raw_changeset.html b/pylons_app/templates/changeset/raw_changeset.html new file mode 100644 --- /dev/null +++ b/pylons_app/templates/changeset/raw_changeset.html @@ -0,0 +1,8 @@ +# HG changeset patch +# User ${c.changeset.author} +# Date ${"%d %d" % c.changeset._ctx.date()} +# Node ID ${c.changeset._hex} +# ${c.parent_tmpl} +${c.changeset.message} + +${c.diffs|n} \ No newline at end of file