changeset 545:2e2ae0af3962

merged
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 05 Oct 2010 21:26:44 +0200
parents c43b1a6d3ba9 (current diff) d8778cde98f0 (diff)
children 7c2f5e4d7bbf
files
diffstat 4 files changed, 116 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/controllers/changeset.py	Tue Oct 05 02:35:41 2010 +0200
+++ b/pylons_app/controllers/changeset.py	Tue Oct 05 21:26:44 2010 +0200
@@ -22,11 +22,12 @@
 @author: marcink
 """
 from pylons import tmpl_context as c, url, request, response
+from pylons.i18n.translation import _
 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.model.hg_model import HgModel
-from vcs.exceptions import RepositoryError
+from vcs.exceptions import RepositoryError, ChangesetError
 from vcs.nodes import FileNode
 from vcs.utils import diffs as differ
 import logging
@@ -44,6 +45,88 @@
         
     def index(self, revision):
         hg_model = HgModel()
+        cut_off_limit = 1024 * 100
+        
+        def wrap_to_table(str):
+            
+            return '''<table class="code-difftable">
+                        <tr class="line">
+                        <td class="lineno new"></td>
+                        <td class="code"><pre>%s</pre></td>
+                        </tr>
+                      </table>''' % str
+            
+        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 = []
+            
+            #===================================================================
+            # ADDED FILES
+            #===================================================================
+            c.sum_added = 0
+            for node in c.changeset.added:
+                
+                filenode_old = FileNode(node.path, '')
+                if filenode_old.is_binary or node.is_binary:
+                    diff = wrap_to_table(_('binary file'))
+                else:
+                    c.sum_added += node.size
+                    if c.sum_added < cut_off_limit:
+                        f_udiff = differ.get_udiff(filenode_old, node)
+                        diff = differ.DiffProcessor(f_udiff).as_html()
+                    else:
+                        diff = wrap_to_table(_('Changeset is to big and was cut'
+                                            ' off, see raw changeset instead'))
+                        
+                cs1 = None
+                cs2 = node.last_changeset.short_id                                        
+                c.changes.append(('added', node, diff, cs1, cs2))
+            
+            #===================================================================
+            # CHANGED FILES
+            #===================================================================
+            c.sum_removed = 0    
+            for node in c.changeset.changed:
+                try:
+                    filenode_old = c.changeset_old.get_node(node.path)
+                except ChangesetError:
+                    filenode_old = FileNode(node.path, '')
+                    
+                if filenode_old.is_binary or node.is_binary:
+                    diff = wrap_to_table(_('binary file'))
+                else:
+                    c.sum_removed += node.size
+                    if c.sum_removed < cut_off_limit:
+                        f_udiff = differ.get_udiff(filenode_old, node)
+                        diff = differ.DiffProcessor(f_udiff).as_html()
+                    else:
+                        diff = wrap_to_table(_('Changeset is to big and was cut'
+                                            ' off, see raw changeset instead'))
+
+                cs1 = filenode_old.last_changeset.short_id
+                cs2 = node.last_changeset.short_id                    
+                c.changes.append(('changed', node, diff, cs1, cs2))
+                
+            #===================================================================
+            # REMOVED FILES    
+            #===================================================================
+            for node in c.changeset.removed:
+                c.changes.append(('removed', node, None, None, None))            
+            
+        return render('changeset/changeset.html')
+
+    def raw_changeset(self, revision):
+        
+        hg_model = HgModel()
+        method = request.GET.get('diff', 'show')
         try:
             c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
         except RepositoryError:
@@ -59,52 +142,7 @@
             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).as_html()
-
-                cs1 = None
-                cs2 = node.last_changeset.short_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).as_html()
-
-                cs1 = filenode_old.last_changeset.short_id
-                cs2 = node.last_changeset.short_id                    
-                c.changes.append(('changed', node, diff, cs1, cs2))
-                
-            for node in c.changeset.removed:
-                c.changes.append(('removed', node, None, None, None))            
-            
-        return render('changeset/changeset.html')
-
-    def raw_changeset(self,revision):
-        
-        hg_model = HgModel()
-        method = request.GET.get('diff','show')
-        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'
+                    diff = _('binary file')
                 else:    
                     f_udiff = differ.get_udiff(filenode_old, node)
                     diff = differ.DiffProcessor(f_udiff).raw_diff()
@@ -116,7 +154,7 @@
             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'
+                    diff = _('binary file')
                 else:    
                     f_udiff = differ.get_udiff(filenode_old, node)
                     diff = differ.DiffProcessor(f_udiff).raw_diff()
@@ -129,7 +167,7 @@
         if method == 'download':
             response.content_disposition = 'attachment; filename=%s.patch' % revision 
         parent = True if len(c.changeset.parents) > 0 else False
-        c.parent_tmpl = 'Parent  %s' % c.changeset.parents[0]._hex if parent else ''
+        c.parent_tmpl = 'Parent  %s' % c.changeset.parents[0].raw_id if parent else ''
     
         c.diffs = ''
         for x in c.changes:
--- a/pylons_app/controllers/files.py	Tue Oct 05 02:35:41 2010 +0200
+++ b/pylons_app/controllers/files.py	Tue Oct 05 21:26:44 2010 +0200
@@ -24,6 +24,7 @@
 """
 from mercurial import archival
 from pylons import request, response, session, tmpl_context as c, url
+from pylons.i18n.translation import _
 from pylons.controllers.util import redirect
 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
 from pylons_app.lib.base import BaseController, render
@@ -155,26 +156,27 @@
         c.repo = hg_model.get_repo(c.repo_name)
 
         try:
-            if diff1 not in ['', None, 'None', '0' * 12]:
+            if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
                 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]:
+                node1 = FileNode('.', '', changeset=c.changeset_1)
+                
+            if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
                 c.changeset_2 = c.repo.get_changeset(diff2)
                 node2 = c.changeset_2.get_node(f_path)
             else:
                 c.changeset_2 = EmptyChangeset()
-                node2 = FileNode('.', '') 
+                node2 = FileNode('.', '', changeset=c.changeset_2)
         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.short_id)
         c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2.short_id)
+        
         f_udiff = differ.get_udiff(node1, node2)
-        
         diff = differ.DiffProcessor(f_udiff)
                                 
         if c.action == 'download':
@@ -187,10 +189,16 @@
         elif c.action == 'raw':
             c.cur_diff = '<pre class="raw">%s</pre>' % h.escape(diff.raw_diff())
         elif c.action == 'diff':
-            c.cur_diff = diff.as_html()
+            if node1.size > c.file_size_limit or node2.size > c.file_size_limit:
+                c.cur_diff = _('Diff is to big to display')
+            else:
+                c.cur_diff = diff.as_html()
         else:
             #default option
-            c.cur_diff = diff.as_html()
+            if node1.size > c.file_size_limit or node2.size > c.file_size_limit:
+                c.cur_diff = _('Diff is to big to display')
+            else:
+                c.cur_diff = diff.as_html()
         
         if not c.cur_diff: c.no_changes = True    
         return render('files/file_diff.html')
--- a/pylons_app/lib/utils.py	Tue Oct 05 02:35:41 2010 +0200
+++ b/pylons_app/lib/utils.py	Tue Oct 05 21:26:44 2010 +0200
@@ -251,11 +251,14 @@
         region_invalidate(_full_changelog_cached, None, *args)
         
 class EmptyChangeset(BaseChangeset):
+    """
+    An dummy empty changeset.
+    """
     
     revision = -1
     message = ''
     author = ''
-    
+    date = ''
     @LazyProperty
     def raw_id(self):
         """
@@ -268,6 +271,15 @@
     def short_id(self):
         return self.raw_id[:12]
 
+    def get_file_changeset(self, path):
+        return self
+    
+    def get_file_content(self, path):
+        return u''
+    
+    def get_file_size(self, path):
+        return 0
+    
 def repo2db_mapper(initial_repo_list, remove_obsolete=False):
     """
     maps all found repositories into db
--- a/pylons_app/templates/changeset/raw_changeset.html	Tue Oct 05 02:35:41 2010 +0200
+++ b/pylons_app/templates/changeset/raw_changeset.html	Tue Oct 05 21:26:44 2010 +0200
@@ -1,7 +1,7 @@
 # HG changeset patch
 # User ${c.changeset.author|n}
 # Date ${"%d %d" % c.changeset._ctx.date()}
-# Node ID ${c.changeset._hex}
+# Node ID ${c.changeset.raw_id}
 # ${c.parent_tmpl}
 ${c.changeset.message}