diff rhodecode/controllers/files.py @ 2995:32471bd1f4ee beta

Implemented generation of changesets based on whole diff instead of per file diff. That can give a big speed improvement for large changesets in repositories with large history. - improved handling of binary files - show renames of binary files - implemented new diff limit functionality - unify diff generation between hg and git - Added binary indicators for changed files, - added diff lib tests
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 05 Nov 2012 19:57:29 +0100
parents 6cd0f8f8aef1
children 37c7abd34d44
line wrap: on
line diff
--- a/rhodecode/controllers/files.py	Fri Nov 09 19:33:20 2012 +0100
+++ b/rhodecode/controllers/files.py	Mon Nov 05 19:57:29 2012 +0100
@@ -438,6 +438,7 @@
 
         #special case if we want a show rev only, it's impl here
         #to reduce JS and callbacks
+
         if request.GET.get('show_rev'):
             if str2bool(request.GET.get('annotate', 'False')):
                 _url = url('files_annotate_home', repo_name=c.repo_name,
@@ -450,18 +451,31 @@
         try:
             if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
                 c.changeset_1 = c.rhodecode_repo.get_changeset(diff1)
-                node1 = c.changeset_1.get_node(f_path)
+                try:
+                    node1 = c.changeset_1.get_node(f_path)
+                except NodeDoesNotExistError:
+                    c.changeset_1 = EmptyChangeset(cs=diff1,
+                                                   revision=c.changeset_1.revision,
+                                                   repo=c.rhodecode_repo)
+                    node1 = FileNode(f_path, '', changeset=c.changeset_1)
             else:
                 c.changeset_1 = EmptyChangeset(repo=c.rhodecode_repo)
-                node1 = FileNode('.', '', changeset=c.changeset_1)
+                node1 = FileNode(f_path, '', changeset=c.changeset_1)
 
             if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]:
                 c.changeset_2 = c.rhodecode_repo.get_changeset(diff2)
-                node2 = c.changeset_2.get_node(f_path)
+                try:
+                    node2 = c.changeset_2.get_node(f_path)
+                except NodeDoesNotExistError:
+                    c.changeset_2 = EmptyChangeset(cs=diff2,
+                                                   revision=c.changeset_2.revision,
+                                                   repo=c.rhodecode_repo)
+                    node2 = FileNode(f_path, '', changeset=c.changeset_2)
             else:
                 c.changeset_2 = EmptyChangeset(repo=c.rhodecode_repo)
-                node2 = FileNode('.', '', changeset=c.changeset_2)
+                node2 = FileNode(f_path, '', changeset=c.changeset_2)
         except RepositoryError:
+            log.error(traceback.format_exc())
             return redirect(url('files_home', repo_name=c.repo_name,
                                 f_path=f_path))
 
@@ -476,7 +490,7 @@
             response.content_disposition = (
                 'attachment; filename=%s' % diff_name
             )
-            return diff.raw_diff()
+            return diff.as_raw()
 
         elif c.action == 'raw':
             _diff = diffs.get_gitdiff(node1, node2,
@@ -484,7 +498,7 @@
                                       context=line_context)
             diff = diffs.DiffProcessor(_diff, format='gitdiff')
             response.content_type = 'text/plain'
-            return diff.raw_diff()
+            return diff.as_raw()
 
         else:
             fid = h.FID(diff2, node2.path)
@@ -498,8 +512,12 @@
                                          ignore_whitespace=ign_whitespace_lcl,
                                          line_context=line_context_lcl,
                                          enable_comments=False)
-
-            c.changes = [('', node2, diff, cs1, cs2, st,)]
+            op = ''
+            filename = node1.path
+            cs_changes = {
+                'fid': [cs1, cs2, op, filename, diff, st]
+            }
+            c.changes = cs_changes
 
         return render('files/file_diff.html')