changeset 466:183cee110578

first implementation of #34 changeset raw diff based on udiff from python
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 11 Sep 2010 01:52:16 +0200
parents e01a85f9fc90
children 3fc3ce53659b 9dd372c7166c
files pylons_app/config/routing.py pylons_app/controllers/changeset.py pylons_app/templates/changeset/raw_changeset.html
diffstat 3 files changed, 64 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/config/routing.py	Wed Sep 08 01:33:38 2010 +0200
+++ b/pylons_app/config/routing.py	Sat Sep 11 01:52:16 2010 +0200
@@ -128,6 +128,9 @@
     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',
--- a/pylons_app/controllers/changeset.py	Wed Sep 08 01:33:38 2010 +0200
+++ b/pylons_app/controllers/changeset.py	Sat Sep 11 01:52:16 2010 +0200
@@ -2,7 +2,6 @@
 # encoding: utf-8
 # changeset 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
@@ -22,7 +21,7 @@
 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 @@
                 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 @@
                 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 @@
                 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')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pylons_app/templates/changeset/raw_changeset.html	Sat Sep 11 01:52:16 2010 +0200
@@ -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