|
|
## -*- coding: utf-8 -*-
|
|
|
|
|
|
<%inherit file="/base/base.html"/>
|
|
|
<%namespace name="diff_block" file="/changeset/diff_block.html"/>
|
|
|
|
|
|
<%def name="title()">
|
|
|
${_('%s Commit') % c.repo_name} - ${h.show_id(c.commit)}
|
|
|
%if c.rhodecode_name:
|
|
|
· ${h.branding(c.rhodecode_name)}
|
|
|
%endif
|
|
|
</%def>
|
|
|
|
|
|
<%def name="menu_bar_nav()">
|
|
|
${self.menu_items(active='repositories')}
|
|
|
</%def>
|
|
|
|
|
|
<%def name="menu_bar_subnav()">
|
|
|
${self.repo_menu(active='changelog')}
|
|
|
</%def>
|
|
|
|
|
|
<%def name="main()">
|
|
|
<script>
|
|
|
// TODO: marcink switch this to pyroutes
|
|
|
AJAX_COMMENT_DELETE_URL = "${url('changeset_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__')}";
|
|
|
templateContext.commit_data.commit_id = "${c.commit.raw_id}";
|
|
|
</script>
|
|
|
<div class="box">
|
|
|
<div class="title">
|
|
|
${self.repo_page_title(c.rhodecode_db_repo)}
|
|
|
</div>
|
|
|
|
|
|
<div id="changeset_compare_view_content" class="summary changeset">
|
|
|
<div class="summary-detail">
|
|
|
<div class="summary-detail-header">
|
|
|
<span class="breadcrumbs files_location">
|
|
|
<h4>${_('Commit')}
|
|
|
<code>
|
|
|
${h.show_id(c.commit)}
|
|
|
</code>
|
|
|
</h4>
|
|
|
</span>
|
|
|
<span id="parent_link">
|
|
|
<a href="#" title="${_('Parent Commit')}">${_('Parent')}</a>
|
|
|
</span>
|
|
|
|
|
|
|
<span id="child_link">
|
|
|
<a href="#" title="${_('Child Commit')}">${_('Child')}</a>
|
|
|
</span>
|
|
|
</div>
|
|
|
|
|
|
<div class="fieldset">
|
|
|
<div class="left-label">
|
|
|
${_('Description')}:
|
|
|
</div>
|
|
|
<div class="right-content">
|
|
|
<div id="trimmed_message_box" class="commit">${h.urlify_commit_message(c.commit.message,c.repo_name)}</div>
|
|
|
<div id="message_expand" style="display:none;">
|
|
|
${_('Expand')}
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
%if c.statuses:
|
|
|
<div class="fieldset">
|
|
|
<div class="left-label">
|
|
|
${_('Commit status')}:
|
|
|
</div>
|
|
|
<div class="right-content">
|
|
|
<div class="changeset-status-ico">
|
|
|
<div class="${'flag_status %s' % c.statuses[0]} pull-left"></div>
|
|
|
</div>
|
|
|
<div title="${_('Commit status')}" class="changeset-status-lbl">[${h.commit_status_lbl(c.statuses[0])}]</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
%endif
|
|
|
|
|
|
<div class="fieldset">
|
|
|
<div class="left-label">
|
|
|
${_('References')}:
|
|
|
</div>
|
|
|
<div class="right-content">
|
|
|
<div class="tags">
|
|
|
|
|
|
%if c.commit.merge:
|
|
|
<span class="mergetag tag">
|
|
|
${_('merge')}
|
|
|
</span>
|
|
|
%endif
|
|
|
|
|
|
%if h.is_hg(c.rhodecode_repo):
|
|
|
%for book in c.commit.bookmarks:
|
|
|
<span class="booktag tag" title="${_('Bookmark %s') % book}">
|
|
|
<a href="${h.url('files_home',repo_name=c.repo_name,revision=c.commit.raw_id)}"><i class="icon-bookmark"></i>${h.shorter(book)}</a>
|
|
|
</span>
|
|
|
%endfor
|
|
|
%endif
|
|
|
|
|
|
%for tag in c.commit.tags:
|
|
|
<span class="tagtag tag" title="${_('Tag %s') % tag}">
|
|
|
<a href="${h.url('files_home',repo_name=c.repo_name,revision=c.commit.raw_id)}"><i class="icon-tag"></i>${tag}</a>
|
|
|
</span>
|
|
|
%endfor
|
|
|
|
|
|
%if c.commit.branch:
|
|
|
<span class="branchtag tag" title="${_('Branch %s') % c.commit.branch}">
|
|
|
<a href="${h.url('files_home',repo_name=c.repo_name,revision=c.commit.raw_id)}"><i class="icon-code-fork"></i>${h.shorter(c.commit.branch)}</a>
|
|
|
</span>
|
|
|
%endif
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="fieldset">
|
|
|
<div class="left-label">
|
|
|
${_('Diffs')}:
|
|
|
</div>
|
|
|
<div class="right-content">
|
|
|
<div class="diff-actions">
|
|
|
<a href="${h.url('changeset_raw_home',repo_name=c.repo_name,revision=c.commit.raw_id)}" class="tooltip" title="${h.tooltip(_('Raw diff'))}">
|
|
|
${_('Raw Diff')}
|
|
|
</a>
|
|
|
|
|
|
|
<a href="${h.url('changeset_patch_home',repo_name=c.repo_name,revision=c.commit.raw_id)}" class="tooltip" title="${h.tooltip(_('Patch diff'))}">
|
|
|
${_('Patch Diff')}
|
|
|
</a>
|
|
|
|
|
|
|
<a href="${h.url('changeset_download_home',repo_name=c.repo_name,revision=c.commit.raw_id,diff='download')}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
|
|
|
${_('Download Diff')}
|
|
|
</a>
|
|
|
|
|
|
|
${c.ignorews_url(request.GET)}
|
|
|
|
|
|
|
${c.context_url(request.GET)}
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="fieldset">
|
|
|
<div class="left-label">
|
|
|
${_('Comments')}:
|
|
|
</div>
|
|
|
<div class="right-content">
|
|
|
<div class="comments-number">
|
|
|
%if c.comments:
|
|
|
<a href="#comments">${ungettext("%d Commit comment", "%d Commit comments", len(c.comments)) % len(c.comments)}</a>,
|
|
|
%else:
|
|
|
${ungettext("%d Commit comment", "%d Commit comments", len(c.comments)) % len(c.comments)}
|
|
|
%endif
|
|
|
%if c.inline_cnt:
|
|
|
## this is replaced with a proper link to first comment via JS linkifyComments() func
|
|
|
<a href="#inline-comments" id="inline-comments-counter">${ungettext("%d Inline Comment", "%d Inline Comments", c.inline_cnt) % c.inline_cnt}</a>
|
|
|
%else:
|
|
|
${ungettext("%d Inline Comment", "%d Inline Comments", c.inline_cnt) % c.inline_cnt}
|
|
|
%endif
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
</div> <!-- end summary-detail -->
|
|
|
|
|
|
<div id="commit-stats" class="sidebar-right">
|
|
|
<div class="summary-detail-header">
|
|
|
<h4 class="item">
|
|
|
${_('Author')}
|
|
|
</h4>
|
|
|
</div>
|
|
|
<div class="sidebar-right-content">
|
|
|
${self.gravatar_with_user(c.commit.author)}
|
|
|
<div class="user-inline-data">- ${h.age_component(c.commit.date)}</div>
|
|
|
</div>
|
|
|
</div><!-- end sidebar -->
|
|
|
</div> <!-- end summary -->
|
|
|
<div class="cs_files_title">
|
|
|
<span class="cs_files_expand">
|
|
|
<span id="files_link"><a href="#" title="${_('Browse files at current commit')}">${_('Browse files')}</a></span> |
|
|
|
|
|
|
<span id="expand_all_files">${_('Expand All')}</span> | <span id="collapse_all_files">${_('Collapse All')}</span>
|
|
|
</span>
|
|
|
<h2>
|
|
|
${diff_block.diff_summary_text(len(c.files), c.lines_added, c.lines_deleted, c.limited_diff)}
|
|
|
</h2>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="cs_files">
|
|
|
|
|
|
%if not c.files:
|
|
|
<p class="empty_data">${_('No files')}</p>
|
|
|
%endif
|
|
|
|
|
|
<table class="compare_view_files commit_diff">
|
|
|
%for FID, (cs1, cs2, change, path, diff, stats, file) in c.changes[c.commit.raw_id].iteritems():
|
|
|
<tr class="cs_${change} collapse_file" fid="${FID}">
|
|
|
<td class="cs_icon_td">
|
|
|
<span class="collapse_file_icon" fid="${FID}"></span>
|
|
|
</td>
|
|
|
<td class="cs_icon_td">
|
|
|
<div class="flag_status not_reviewed hidden"></div>
|
|
|
</td>
|
|
|
<td class="cs_${change}" id="a_${FID}">
|
|
|
<div class="node">
|
|
|
<a href="#a_${FID}">
|
|
|
<i class="icon-file-${change.lower()}"></i>
|
|
|
${h.safe_unicode(path)}
|
|
|
</a>
|
|
|
</div>
|
|
|
</td>
|
|
|
<td>
|
|
|
<div class="changes pull-right">${h.fancy_file_stats(stats)}</div>
|
|
|
<div class="comment-bubble pull-right" data-path="${path}">
|
|
|
<i class="icon-comment"></i>
|
|
|
</div>
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr fid="${FID}" id="diff_${FID}" class="diff_links">
|
|
|
<td></td>
|
|
|
<td></td>
|
|
|
<td class="cs_${change}">
|
|
|
${diff_block.diff_menu(c.repo_name, h.safe_unicode(path), cs1, cs2, change, file)}
|
|
|
</td>
|
|
|
<td class="td-actions rc-form">
|
|
|
${c.ignorews_url(request.GET, h.FID(cs2,path))} |
|
|
|
${c.context_url(request.GET, h.FID(cs2,path))} |
|
|
|
<div data-comment-id="${h.FID(cs2,path)}" class="btn-link show-inline-comments comments-visible">
|
|
|
<span class="comments-show">${_('Show comments')}</span>
|
|
|
<span class="comments-hide">${_('Hide comments')}</span>
|
|
|
</div>
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr id="tr_${FID}">
|
|
|
<td></td>
|
|
|
<td></td>
|
|
|
<td class="injected_diff" colspan="2">
|
|
|
<div class="diff-container" id="${'diff-container-%s' % (id(change))}">
|
|
|
<div id="${FID}" class="diffblock margined comm">
|
|
|
<div class="code-body">
|
|
|
<div class="full_f_path" path="${h.safe_unicode(path)}"></div>
|
|
|
${diff|n}
|
|
|
% if file and file["is_limited_diff"]:
|
|
|
% if file["exceeds_limit"]:
|
|
|
${diff_block.file_message()}
|
|
|
% else:
|
|
|
<h5>${_('Diff was truncated. File content available only in full diff.')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a></h5>
|
|
|
% endif
|
|
|
% endif
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</td>
|
|
|
</tr>
|
|
|
%endfor
|
|
|
</table>
|
|
|
</div>
|
|
|
|
|
|
% if c.limited_diff:
|
|
|
${diff_block.changeset_message()}
|
|
|
% endif
|
|
|
|
|
|
## template for inline comment form
|
|
|
<%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
|
|
|
${comment.comment_inline_form()}
|
|
|
|
|
|
## render comments and inlines
|
|
|
${comment.generate_comments()}
|
|
|
|
|
|
## main comment form and it status
|
|
|
${comment.comments(h.url('changeset_comment', repo_name=c.repo_name, revision=c.commit.raw_id),
|
|
|
h.commit_status(c.rhodecode_db_repo, c.commit.raw_id))}
|
|
|
|
|
|
## FORM FOR MAKING JS ACTION AS CHANGESET COMMENTS
|
|
|
<script type="text/javascript">
|
|
|
|
|
|
$(document).ready(function() {
|
|
|
|
|
|
var boxmax = parseInt($('#trimmed_message_box').css('max-height'), 10);
|
|
|
if($('#trimmed_message_box').height() === boxmax){
|
|
|
$('#message_expand').show();
|
|
|
}
|
|
|
|
|
|
$('#message_expand').on('click', function(e){
|
|
|
$('#trimmed_message_box').css('max-height', 'none');
|
|
|
$(this).hide();
|
|
|
});
|
|
|
|
|
|
$('.show-inline-comments').on('click', function(e){
|
|
|
var boxid = $(this).attr('data-comment-id');
|
|
|
var button = $(this);
|
|
|
|
|
|
if(button.hasClass("comments-visible")) {
|
|
|
$('#{0} .inline-comments'.format(boxid)).each(function(index){
|
|
|
$(this).hide();
|
|
|
})
|
|
|
button.removeClass("comments-visible");
|
|
|
} else {
|
|
|
$('#{0} .inline-comments'.format(boxid)).each(function(index){
|
|
|
$(this).show();
|
|
|
})
|
|
|
button.addClass("comments-visible");
|
|
|
}
|
|
|
});
|
|
|
|
|
|
|
|
|
// next links
|
|
|
$('#child_link').on('click', function(e){
|
|
|
// fetch via ajax what is going to be the next link, if we have
|
|
|
// >1 links show them to user to choose
|
|
|
if(!$('#child_link').hasClass('disabled')){
|
|
|
$.ajax({
|
|
|
url: '${h.url('changeset_children',repo_name=c.repo_name, revision=c.commit.raw_id)}',
|
|
|
success: function(data) {
|
|
|
if(data.results.length === 0){
|
|
|
$('#child_link').html('${_('No Child Commits')}').addClass('disabled');
|
|
|
}
|
|
|
if(data.results.length === 1){
|
|
|
var commit = data.results[0];
|
|
|
window.location = pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}','revision': commit.raw_id});
|
|
|
}
|
|
|
else if(data.results.length === 2){
|
|
|
$('#child_link').addClass('disabled');
|
|
|
$('#child_link').addClass('double');
|
|
|
var _html = '';
|
|
|
_html +='<a title="__title__" href="__url__">__rev__</a> '
|
|
|
.replace('__rev__','r{0}:{1}'.format(data.results[0].revision, data.results[0].raw_id.substr(0,6)))
|
|
|
.replace('__title__', data.results[0].message)
|
|
|
.replace('__url__', pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}','revision': data.results[0].raw_id}));
|
|
|
_html +=' | '
|
|
|
_html +='<a title="__title__" href="__url__">__rev__</a> '
|
|
|
.replace('__rev__','r{0}:{1}'.format(data.results[1].revision, data.results[1].raw_id.substr(0,6)))
|
|
|
.replace('__title__', data.results[1].message)
|
|
|
.replace('__url__', pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}','revision': data.results[1].raw_id}));
|
|
|
$('#child_link').html(_html);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
e.preventDefault();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// prev links
|
|
|
$('#parent_link').on('click', function(e){
|
|
|
// fetch via ajax what is going to be the next link, if we have
|
|
|
// >1 links show them to user to choose
|
|
|
if(!$('#parent_link').hasClass('disabled')){
|
|
|
$.ajax({
|
|
|
url: '${h.url('changeset_parents',repo_name=c.repo_name, revision=c.commit.raw_id)}',
|
|
|
success: function(data) {
|
|
|
if(data.results.length === 0){
|
|
|
$('#parent_link').html('${_('No Parent Commits')}').addClass('disabled');
|
|
|
}
|
|
|
if(data.results.length === 1){
|
|
|
var commit = data.results[0];
|
|
|
window.location = pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}','revision': commit.raw_id});
|
|
|
}
|
|
|
else if(data.results.length === 2){
|
|
|
$('#parent_link').addClass('disabled');
|
|
|
$('#parent_link').addClass('double');
|
|
|
var _html = '';
|
|
|
_html +='<a title="__title__" href="__url__">Parent __rev__</a>'
|
|
|
.replace('__rev__','r{0}:{1}'.format(data.results[0].revision, data.results[0].raw_id.substr(0,6)))
|
|
|
.replace('__title__', data.results[0].message)
|
|
|
.replace('__url__', pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}','revision': data.results[0].raw_id}));
|
|
|
_html +=' | '
|
|
|
_html +='<a title="__title__" href="__url__">Parent __rev__</a>'
|
|
|
.replace('__rev__','r{0}:{1}'.format(data.results[1].revision, data.results[1].raw_id.substr(0,6)))
|
|
|
.replace('__title__', data.results[1].message)
|
|
|
.replace('__url__', pyroutes.url('changeset_home', {'repo_name': '${c.repo_name}','revision': data.results[1].raw_id}));
|
|
|
$('#parent_link').html(_html);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
e.preventDefault();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
if (location.hash) {
|
|
|
var result = splitDelimitedHash(location.hash);
|
|
|
var line = $('html').find(result.loc);
|
|
|
offsetScroll(line, 70);
|
|
|
}
|
|
|
|
|
|
// browse tree @ revision
|
|
|
$('#files_link').on('click', function(e){
|
|
|
window.location = '${h.url('files_home',repo_name=c.repo_name, revision=c.commit.raw_id, f_path='')}';
|
|
|
e.preventDefault();
|
|
|
});
|
|
|
|
|
|
// inject comments into their proper positions
|
|
|
var file_comments = $('.inline-comment-placeholder');
|
|
|
renderInlineComments(file_comments, true);
|
|
|
})
|
|
|
</script>
|
|
|
|
|
|
</%def>
|
|
|
|