%namespace name="base" file="/base/base.mako"/>
<%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/>
<%def name="diff_line_anchor(commit, filename, line, type)"><%
return '%s_%s_%i' % (h.md5_safe(commit+filename), type, line)
%>%def>
<%def name="action_class(action)">
<%
return {
'-': 'cb-deletion',
'+': 'cb-addition',
' ': 'cb-context',
}.get(action, 'cb-empty')
%>
%def>
<%def name="op_class(op_id)">
<%
return {
DEL_FILENODE: 'deletion', # file deleted
BIN_FILENODE: 'warning' # binary diff hidden
}.get(op_id, 'addition')
%>
%def>
<%def name="render_diffset(diffset, commit=None,
# collapse all file diff entries when there are more than this amount of files in the diff
collapse_when_files_over=20,
# collapse lines in the diff when more than this amount of lines changed in the file diff
lines_changed_limit=500,
# add a ruler at to the output
ruler_at_chars=0,
# show inline comments
use_comments=False,
# disable new comments
disable_new_comments=False,
# special file-comments that were deleted in previous versions
# it's used for showing outdated comments for deleted files in a PR
deleted_files_comments=None,
# for cache purpose
inline_comments=None,
# additional menu for PRs
pull_request_menu=None,
# show/hide todo next to comments
show_todos=True,
)">
<%
diffset_container_id = h.md5_safe(diffset.target_ref)
collapse_all = len(diffset.files) > collapse_when_files_over
active_pattern_entries = h.get_active_pattern_entries(getattr(c, 'repo_name', None))
from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
%>
%if use_comments:
## Template for injecting comments
%endif
%if c.user_session_attrs["diffmode"] == 'sideside':
%endif
%if ruler_at_chars:
%endif
%def>
<%def name="diff_ops(file_name, filediff)">
<%
from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
%>
${file_name}
## ops pills
%if filediff.limited_diff:
limited diff
%endif
%if NEW_FILENODE in filediff.patch['stats']['ops']:
created
%if filediff['target_mode'].startswith('120'):
symlink
%else:
${nice_mode(filediff['target_mode'])}
%endif
%endif
%if RENAMED_FILENODE in filediff.patch['stats']['ops']:
renamed
%endif
%if COPIED_FILENODE in filediff.patch['stats']['ops']:
copied
%endif
%if DEL_FILENODE in filediff.patch['stats']['ops']:
removed
%endif
%if CHMOD_FILENODE in filediff.patch['stats']['ops']:
${nice_mode(filediff['source_mode'])} ➡ ${nice_mode(filediff['target_mode'])}
%endif
%if BIN_FILENODE in filediff.patch['stats']['ops']:
binary
%if MOD_FILENODE in filediff.patch['stats']['ops']:
modified
%endif
%endif
${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}
${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}
%def>
<%def name="nice_mode(filemode)">
${(filemode.startswith('100') and filemode[3:] or filemode)}
%def>
<%def name="diff_menu(filediff, use_comments=False)">
%def>
<%def name="inline_comments_container(comments, active_pattern_entries=None, line_no='', f_path='')">
%def>
<%!
def get_inline_comments(comments, filename):
if hasattr(filename, 'str_path'):
filename = filename.str_path
if not isinstance(filename, str):
return None
if comments and filename in comments:
return comments[filename]
return None
def get_comments_for(diff_type, comments, filename, line_version, line_number):
if hasattr(filename, 'str_path'):
filename = filename.str_path
if not isinstance(filename, str):
return None
file_comments = get_inline_comments(comments, filename)
if file_comments is None:
return None
line_key = f'{line_version}{line_number}' ## e.g o37, n12
if line_key in file_comments:
data = file_comments.pop(line_key)
return data
%>
<%def name="render_hunk_lines_sideside(filediff, hunk, use_comments=False, inline_comments=None, active_pattern_entries=None)">
<% chunk_count = 1 %>
%for loop_obj, item in h.looper(hunk.sideside):
<%
line = item
i = loop_obj.index
prev_line = loop_obj.previous
old_line_anchor, new_line_anchor = None, None
if line.original.lineno:
old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, line.original.lineno, 'o')
if line.modified.lineno:
new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, line.modified.lineno, 'n')
line_action = line.modified.action or line.original.action
prev_line_action = prev_line and (prev_line.modified.action or prev_line.original.action)
%>
<% line_old_comments, line_old_comments_no_drafts = None, None %>
%if line.original.get_comment_args:
<%
line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args)
line_old_comments_no_drafts = [c for c in line_old_comments if not c.draft] if line_old_comments else []
has_outdated = any([x.outdated for x in line_old_comments_no_drafts])
%>
%endif
%if line_old_comments_no_drafts:
% if has_outdated:
% else:
% endif
%endif
|
%if line.original.lineno:
${line.original.lineno}
%endif
|
<% line_no = 'o{}'.format(line.original.lineno) %>
%if use_comments and line.original.lineno:
${render_add_comment_button(line_no=line_no, f_path=filediff.patch['filename'])}
%endif
${line.original.content or '' | n}
%if use_comments and line.original.lineno and line_old_comments:
${inline_comments_container(line_old_comments, active_pattern_entries=active_pattern_entries, line_no=line_no, f_path=filediff.patch['filename'])}
%endif
|
<% line_new_comments, line_new_comments_no_drafts = None, None %>
%if line.modified.get_comment_args:
<%
line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args)
line_new_comments_no_drafts = [c for c in line_new_comments if not c.draft] if line_new_comments else []
has_outdated = any([x.outdated for x in line_new_comments_no_drafts])
%>
%endif
%if line_new_comments_no_drafts:
% if has_outdated:
% else:
% endif
%endif
|
%if line.modified.lineno:
${line.modified.lineno}
%endif
|
<% line_no = 'n{}'.format(line.modified.lineno) %>
%if use_comments and line.modified.lineno:
${render_add_comment_button(line_no=line_no, f_path=filediff.patch['filename'])}
%endif
${line.modified.content or '' | n}
% if line_action in ['+', '-'] and prev_line_action not in ['+', '-']:
<% chunk_count +=1 %>
% endif
%if use_comments and line.modified.lineno and line_new_comments:
${inline_comments_container(line_new_comments, active_pattern_entries=active_pattern_entries, line_no=line_no, f_path=filediff.patch['filename'])}
%endif
|
%endfor
%def>
<%def name="render_hunk_lines_unified(filediff, hunk, use_comments=False, inline_comments=None, active_pattern_entries=None)">
%for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
<%
old_line_anchor, new_line_anchor = None, None
if old_line_no:
old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, old_line_no, 'o')
if new_line_no:
new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, new_line_no, 'n')
%>
<% comments, comments_no_drafts = None, None %>
%if comments_args:
<%
comments = get_comments_for('unified', inline_comments, *comments_args)
comments_no_drafts = [c for c in line_new_comments if not c.draft] if line_new_comments else []
has_outdated = any([x.outdated for x in comments_no_drafts])
%>
%endif
% if comments_no_drafts:
% if has_outdated:
% else:
% endif
% endif
|
%if old_line_anchor:
${old_line_no}
%endif
|
%if new_line_anchor:
${new_line_no}
%endif
|
<% line_no = '{}{}'.format(new_line_no and 'n' or 'o', new_line_no or old_line_no) %>
%if use_comments:
${render_add_comment_button(line_no=line_no, f_path=filediff.patch['filename'])}
%endif
${content or '' | n}
%if use_comments and comments:
${inline_comments_container(comments, active_pattern_entries=active_pattern_entries, line_no=line_no, f_path=filediff.patch['filename'])}
%endif
|
%endfor
%def>
<%def name="render_hunk_lines(filediff, diff_mode, hunk, use_comments, inline_comments, active_pattern_entries)">
% if diff_mode == 'unified':
${render_hunk_lines_unified(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
% elif diff_mode == 'sideside':
${render_hunk_lines_sideside(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
% else:
unknown diff mode |
% endif
%def>file changes
<%def name="render_add_comment_button(line_no='', f_path='')">
% if not c.rhodecode_user.is_default:
% endif
%def>
<%def name="render_diffset_menu(diffset, range_diff_on=None, commit=None, pull_request_menu=None)">
<% diffset_container_id = h.md5_safe(diffset.target_ref) %>
% if diffset:
%if diffset.limited_diff:
<% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files} %>
%else:
<% file_placeholder = h.literal(_ungettext('%(num)s file changed: %(linesadd)s inserted, %(linesdel)s deleted', '%(num)s files changed: %(linesadd)s inserted, %(linesdel)s deleted',
diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}) %>
%endif
## case on range-diff placeholder needs to be updated
% if range_diff_on is True:
<% file_placeholder = _('Disabled on range diff') %>
% endif
% endif
%def>