diffs: simplified the datastructure of fillediff. Hopefully this

will allow better Garbage Collection.
This commit is contained in:
Marcin Kuzminski 2017-06-28 14:03:57 +02:00
parent 372c7c267c
commit f53db19687
4 changed files with 45 additions and 42 deletions

View file

@ -267,8 +267,10 @@ class ChangesetController(BaseRepoController):
repo_name=c.repo_name,
source_node_getter=_node_getter(commit1),
target_node_getter=_node_getter(commit2),
comments=inline_comments
).render_patchset(_parsed, commit1.raw_id, commit2.raw_id)
comments=inline_comments)
diffset = diffset.render_patchset(
_parsed, commit1.raw_id, commit2.raw_id)
c.changes[commit.raw_id] = diffset
else:
# downloads/raw we only need RAW diff nothing else

View file

@ -271,11 +271,13 @@ class CompareController(BaseRepoController):
return None
return get_node
c.diffset = codeblocks.DiffSet(
diffset = codeblocks.DiffSet(
repo_name=source_repo.repo_name,
source_node_getter=_node_getter(source_commit),
target_node_getter=_node_getter(target_commit),
).render_patchset(_parsed, source_ref, target_ref)
)
c.diffset = diffset.render_patchset(
_parsed, source_ref, target_ref)
c.preview_mode = merge
c.source_commit = source_commit

View file

@ -471,31 +471,29 @@ class DiffSet(object):
source_file_type = source_lexer.name
target_file_type = target_lexer.name
op_hunks = patch['chunks'][0]
hunks = patch['chunks'][1:]
filediff = AttributeDict({
'source_file_path': source_file_path,
'target_file_path': target_file_path,
'source_filenode': source_filenode,
'target_filenode': target_filenode,
'hunks': [],
'source_file_type': target_file_type,
'target_file_type': source_file_type,
'patch': patch,
'patch': {'filename': patch['filename'], 'stats': patch['stats']},
'operation': patch['operation'],
'source_mode': patch['stats']['old_mode'],
'target_mode': patch['stats']['new_mode'],
'limited_diff': isinstance(patch, LimitedDiffContainer),
'hunks': [],
'diffset': self,
})
for hunk in hunks:
for hunk in patch['chunks'][1:]:
hunkbit = self.parse_hunk(hunk, source_file, target_file)
hunkbit.filediff = filediff
hunkbit.source_file_path = source_file_path
hunkbit.target_file_path = target_file_path
filediff.hunks.append(hunkbit)
left_comments = {}
if source_file_path in self.comments_store:
for lineno, comments in self.comments_store[source_file_path].items():
left_comments[lineno] = comments
@ -503,8 +501,8 @@ class DiffSet(object):
if target_file_path in self.comments_store:
for lineno, comments in self.comments_store[target_file_path].items():
left_comments[lineno] = comments
filediff.left_comments = left_comments
return filediff
def parse_hunk(self, hunk, source_file, target_file):
@ -519,6 +517,7 @@ class DiffSet(object):
before, after = [], []
for line in hunk['lines']:
if line['action'] == 'unmod':
result.lines.extend(
self.parse_lines(before, after, source_file, target_file))
@ -567,7 +566,8 @@ class DiffSet(object):
before_tokens = [('nonl', before['line'])]
else:
before_tokens = self.get_line_tokens(
line_text=before['line'], line_number=before['old_lineno'],
line_text=before['line'],
line_number=before['old_lineno'],
file=source_file)
original.lineno = before['old_lineno']
original.content = before['line']

View file

@ -147,14 +147,14 @@ collapse_all = len(diffset.files) > collapse_when_files_over
%for i, filediff in enumerate(diffset.files):
<%
lines_changed = filediff['patch']['stats']['added'] + filediff['patch']['stats']['deleted']
lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
over_lines_changed_limit = lines_changed > lines_changed_limit
%>
<input ${collapse_all and 'checked' or ''} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox">
<div
class="filediff"
data-f-path="${filediff['patch']['filename']}"
id="a_${h.FID('', filediff['patch']['filename'])}">
data-f-path="${filediff.patch['filename']}"
id="a_${h.FID('', filediff.patch['filename'])}">
<label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
<div class="filediff-collapse-indicator"></div>
${diff_ops(filediff)}
@ -162,7 +162,7 @@ collapse_all = len(diffset.files) > collapse_when_files_over
${diff_menu(filediff, use_comments=use_comments)}
<table class="cb cb-diff-${c.diffmode} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
%if not filediff.hunks:
%for op_id, op_text in filediff['patch']['stats']['ops'].items():
%for op_id, op_text in filediff.patch['stats']['ops'].items():
<tr>
<td class="cb-text cb-${op_class(op_id)}" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=6'}>
%if op_id == DEL_FILENODE:
@ -176,7 +176,7 @@ collapse_all = len(diffset.files) > collapse_when_files_over
</tr>
%endfor
%endif
%if filediff.patch['is_limited_diff']:
%if filediff.limited_diff:
<tr class="cb-warning cb-collapser">
<td class="cb-text" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=6'}>
${_('The requested commit is too big and content was truncated.')} <a href="${link_for(fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
@ -322,7 +322,6 @@ collapse_all = len(diffset.files) > collapse_when_files_over
<%def name="diff_ops(filediff)">
<%
stats = filediff['patch']['stats']
from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
%>
@ -330,9 +329,9 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
%if filediff.source_file_path and filediff.target_file_path:
%if filediff.source_file_path != filediff.target_file_path:
## file was renamed, or copied
%if RENAMED_FILENODE in stats['ops']:
%if RENAMED_FILENODE in filediff.patch['stats']['ops']:
<strong>${filediff.target_file_path}</strong> ⬅ <del>${filediff.source_file_path}</del>
%elif COPIED_FILENODE in stats['ops']:
%elif COPIED_FILENODE in filediff.patch['stats']['ops']:
<strong>${filediff.target_file_path}</strong> ⬅ ${filediff.source_file_path}
%endif
%else:
@ -350,19 +349,19 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
%endif
</span>
<span class="pill-group" style="float: left">
%if filediff.patch['is_limited_diff']:
%if filediff.limited_diff:
<span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
%endif
%if RENAMED_FILENODE in stats['ops']:
%if RENAMED_FILENODE in filediff.patch['stats']['ops']:
<span class="pill" op="renamed">renamed</span>
%endif
%if COPIED_FILENODE in stats['ops']:
%if COPIED_FILENODE in filediff.patch['stats']['ops']:
<span class="pill" op="copied">copied</span>
%endif
%if NEW_FILENODE in stats['ops']:
%if NEW_FILENODE in filediff.patch['stats']['ops']:
<span class="pill" op="created">created</span>
%if filediff['target_mode'].startswith('120'):
<span class="pill" op="symlink">symlink</span>
@ -371,11 +370,11 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
%endif
%endif
%if DEL_FILENODE in stats['ops']:
%if DEL_FILENODE in filediff.patch['stats']['ops']:
<span class="pill" op="removed">removed</span>
%endif
%if CHMOD_FILENODE in stats['ops']:
%if CHMOD_FILENODE in filediff.patch['stats']['ops']:
<span class="pill" op="mode">
${nice_mode(filediff['source_mode'])} ➡ ${nice_mode(filediff['target_mode'])}
</span>
@ -385,17 +384,17 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
<a class="pill filediff-anchor" href="#a_${h.FID('', filediff.patch['filename'])}">¶</a>
<span class="pill-group" style="float: right">
%if BIN_FILENODE in stats['ops']:
%if BIN_FILENODE in filediff.patch['stats']['ops']:
<span class="pill" op="binary">binary</span>
%if MOD_FILENODE in stats['ops']:
%if MOD_FILENODE in filediff.patch['stats']['ops']:
<span class="pill" op="modified">modified</span>
%endif
%endif
%if stats['added']:
<span class="pill" op="added">+${stats['added']}</span>
%if filediff.patch['stats']['added']:
<span class="pill" op="added">+${filediff.patch['stats']['added']}</span>
%endif
%if stats['deleted']:
<span class="pill" op="deleted">-${stats['deleted']}</span>
%if filediff.patch['stats']['deleted']:
<span class="pill" op="deleted">-${filediff.patch['stats']['deleted']}</span>
%endif
</span>
@ -408,7 +407,7 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
<%def name="diff_menu(filediff, use_comments=False)">
<div class="filediff-menu">
%if filediff.diffset.source_ref:
%if filediff.patch['operation'] in ['D', 'M']:
%if filediff.operation in ['D', 'M']:
<a
class="tooltip"
href="${h.url('files_home',repo_name=filediff.diffset.repo_name,f_path=filediff.source_file_path,revision=filediff.diffset.source_ref)}"
@ -424,7 +423,7 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
${_('Show file before')}
</span> |
%endif
%if filediff.patch['operation'] in ['A', 'M']:
%if filediff.operation in ['A', 'M']:
<a
class="tooltip"
href="${h.url('files_home',repo_name=filediff.diffset.source_repo_name,f_path=filediff.target_file_path,revision=filediff.diffset.target_ref)}"
@ -460,10 +459,10 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
## TODO: dan: refactor ignorews_url and context_url into the diff renderer same as diffmode=unified/sideside. Also use ajax to load more context (by clicking hunks)
%if hasattr(c, 'ignorews_url'):
${c.ignorews_url(request.GET, h.FID('', filediff['patch']['filename']))}
${c.ignorews_url(request.GET, h.FID('', filediff.patch['filename']))}
%endif
%if hasattr(c, 'context_url'):
${c.context_url(request.GET, h.FID('', filediff['patch']['filename']))}
${c.context_url(request.GET, h.FID('', filediff.patch['filename']))}
%endif
%if use_comments:
@ -503,9 +502,9 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
<%
old_line_anchor, new_line_anchor = None, None
if line.original.lineno:
old_line_anchor = diff_line_anchor(hunk.filediff.source_file_path, line.original.lineno, 'o')
old_line_anchor = diff_line_anchor(hunk.source_file_path, line.original.lineno, 'o')
if line.modified.lineno:
new_line_anchor = diff_line_anchor(hunk.filediff.target_file_path, line.modified.lineno, 'n')
new_line_anchor = diff_line_anchor(hunk.target_file_path, line.modified.lineno, 'n')
%>
<tr class="cb-line">
@ -579,9 +578,9 @@ from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
<%
old_line_anchor, new_line_anchor = None, None
if old_line_no:
old_line_anchor = diff_line_anchor(hunk.filediff.source_file_path, old_line_no, 'o')
old_line_anchor = diff_line_anchor(hunk.source_file_path, old_line_no, 'o')
if new_line_no:
new_line_anchor = diff_line_anchor(hunk.filediff.target_file_path, new_line_no, 'n')
new_line_anchor = diff_line_anchor(hunk.target_file_path, new_line_no, 'n')
%>
<tr class="cb-line">
<td class="cb-data ${action_class(action)}">