Changeset - 7a0004efde12
[Not reviewed]
beta
0 1 0
Marcin Kuzminski - 15 years ago 2011-04-23 14:52:44
marcin@python-works.com
Added extra check for very large diffs in changesets, sometimes for very large diffs the diff parser could kill CPU.
1 file changed with 18 insertions and 3 deletions:
0 comments (0 inline, 0 general)
rhodecode/controllers/changeset.py
Show inline comments
 
@@ -88,8 +88,9 @@ class ChangesetController(BaseRepoContro
 
        c.sum_removed = 0
 
        c.lines_added = 0
 
        c.lines_deleted = 0
 
        c.cut_off = False
 
        c.cut_off = False # defines if cut off limit is reached
 

	
 
        # Iterate over ranges (default changeset view is always one changeset)
 
        for changeset in c.cs_ranges:
 
            c.changes[changeset.raw_id] = []
 
            try:
 
@@ -101,17 +102,23 @@ class ChangesetController(BaseRepoContro
 
            # ADDED FILES
 
            #==================================================================
 
            for node in changeset.added:
 

	
 
                filenode_old = FileNode(node.path, '', EmptyChangeset())
 
                if filenode_old.is_binary or node.is_binary:
 
                    diff = wrap_to_table(_('binary file'))
 
                    st = (0, 0)
 
                else:
 
                    # in this case node.size is good parameter since those are
 
                    # added nodes and their size defines how many changes were
 
                    # made
 
                    c.sum_added += node.size
 
                    if c.sum_added < self.cut_off_limit:
 
                        f_gitdiff = differ.get_gitdiff(filenode_old, node)
 
                        d = differ.DiffProcessor(f_gitdiff, format='gitdiff')
 

	
 
                        st = d.stat()
 
                        diff = d.as_html()
 
                        st = d.stat()
 

	
 
                    else:
 
                        diff = wrap_to_table(_('Changeset is to big and '
 
                                               'was cut off, see raw '
 
@@ -134,6 +141,7 @@ class ChangesetController(BaseRepoContro
 
                    try:
 
                        filenode_old = changeset_parent.get_node(node.path)
 
                    except ChangesetError:
 
                        log.warning('Unable to fetch parent node for diff')
 
                        filenode_old = FileNode(node.path, '',
 
                                                EmptyChangeset())
 

	
 
@@ -146,8 +154,15 @@ class ChangesetController(BaseRepoContro
 
                            f_gitdiff = differ.get_gitdiff(filenode_old, node)
 
                            d = differ.DiffProcessor(f_gitdiff,
 
                                                     format='gitdiff')
 
                            diff = d.as_html()
 
                            st = d.stat()
 
                            if (st[0] + st[1]) * 256 > self.cut_off_limit:
 
                                diff = wrap_to_table(_('Diff is to big '
 
                                                       'and was cut off, see '
 
                                                       'raw diff instead'))
 
                            else:
 
                                diff = d.as_html()
 

	
 

	
 
                            if diff:
 
                                c.sum_removed += len(diff)
 
                        else:
0 comments (0 inline, 0 general)