##// END OF EJS Templates
vcs: introduce 'branches' attribute on changesets, making it possible for Git to show multiple branches for a changeset...
vcs: introduce 'branches' attribute on changesets, making it possible for Git to show multiple branches for a changeset Mercurial changesets will always have have exactly one branch (which might be "default"). The VCS data model was the same. Git allows for a changeset to have 0 or more branches ... and possibly one of them as active. The right data model is thus to have an enumerable of branches. We thus add a 'branches' attribute and use it where applicable. The existing 'branch' attribute used some heuristics to decide which branch use as "the" branch ... and in some places code (and tests) rely on that. We thus keep that old method, knowing that some of its uses probably should move to 'branches'. The code for retrieving Git branches is based on work by Dominik Ruf.

File last commit:

r7067:3dbb625d default
r7067:3dbb625d default
Show More
changeset.html
207 lines | 9.8 KiB | text/html | HtmlLexer
## -*- coding: utf-8 -*-
<%inherit file="/base/base.html"/>
<%namespace name="comment" file="/changeset/changeset_file_comment.html"/>
<%block name="title">
${_('%s Changeset') % c.repo_name} - ${h.show_id(c.changeset)}
</%block>
<%def name="breadcrumbs_links()">
${_('Changeset')} - <span class='changeset_hash'>${h.show_id(c.changeset)}</span>
</%def>
<%block name="header_menu">
${self.menu('repositories')}
</%block>
<%def name="main()">
${self.repo_context_bar('changelog', c.changeset.raw_id)}
<div class="panel panel-primary">
<div class="panel-heading clearfix">
${self.breadcrumbs()}
</div>
<script>
var _USERS_AC_DATA = ${h.js(c.users_array)};
AJAX_COMMENT_URL = ${h.js(url('changeset_comment',repo_name=c.repo_name,revision=c.changeset.raw_id))};
AJAX_COMMENT_DELETE_URL = ${h.js(url('changeset_comment_delete',repo_name=c.repo_name,comment_id='__COMMENT_ID__'))};
</script>
<div class="panel-body">
<div class="panel panel-default">
<div class="panel-heading clearfix">
${self.parent_child_navigation()}
<div class="pull-left" title="${_('Changeset status')}">
%if c.statuses:
<i class="icon-circle changeset-status-${c.statuses[0]}"></i>
[${h.changeset_status_lbl(c.statuses[0])}]
%endif
</div>
<div class="diff-actions pull-left">
<a href="${h.url('changeset_raw_home',repo_name=c.repo_name,revision=c.changeset.raw_id)}"
data-toggle="tooltip"
title="${_('Raw diff')}"><i class="icon-diff"></i></a>
<a href="${h.url('changeset_patch_home',repo_name=c.repo_name,revision=c.changeset.raw_id)}"
data-toggle="tooltip"
title="${_('Patch diff')}"><i class="icon-file-powerpoint"></i></a>
<a href="${h.url('changeset_download_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='download')}"
data-toggle="tooltip"
title="${_('Download diff')}"><i class="icon-floppy"></i></a>
${c.ignorews_url(request.GET)}
${c.context_url(request.GET)}
</div>
</div>
<div class="panel-body">
<div class="form-group changeset_content_header clearfix">
<div class="pull-right">
<span class="logtags">
%if len(c.changeset.parents)>1:
<span class="label label-merge">${_('Merge')}</span>
%endif
%for book in c.changeset.bookmarks:
<span class="label label-bookmark" title="${_('Bookmark %s') % book}">${h.link_to(book,h.url('changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id))}</span>
%endfor
%for tag in c.changeset.tags:
<span class="label label-tag" title="${_('Tag %s') % tag}">${h.link_to(tag,h.url('changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id))}</span>
%endfor
%for branch in c.changeset.branches:
<span class="label label-branch" title="${_('Branch %s') % branch}">${h.link_to(branch,h.url('changelog_home',repo_name=c.repo_name,branch=branch))}</span>
%endfor
</span>
<div class="changes">
% if (len(c.changeset.affected_files) <= c.affected_files_cut_off) or c.fulldiff:
<span class="label deleted" title="${_('Removed')}">${len(c.changeset.removed)}</span>
<span class="label changed" title="${_('Changed')}">${len(c.changeset.changed)}</span>
<span class="label added" title="${_('Added')}">${len(c.changeset.added)}</span>
% else:
<span class="label deleted" title="${_('Affected %s files') % len(c.changeset.affected_files)}">!</span>
<span class="label changed" title="${_('Affected %s files') % len(c.changeset.affected_files)}">!</span>
<span class="label added" title="${_('Affected %s files') % len(c.changeset.affected_files)}">!</span>
% endif
</div>
</div>
<div class="pull-left">
<div class="author">
${h.gravatar_div(h.email_or_none(c.changeset.author), size=20)}
<span><b>${h.person(c.changeset.author,'full_name_and_username')}</b> - ${h.age(c.changeset.date,True)} ${h.fmt_date(c.changeset.date)}</span><br/>
<span>${h.email_or_none(c.changeset.author)}</span><br/>
</div>
<% rev = c.changeset.extra.get('source') %>
%if rev:
<div>
${_('Grafted from:')} ${h.link_to(h.short_id(rev),h.url('changeset_home',repo_name=c.repo_name,revision=rev), class_="changeset_hash")}
</div>
%endif
<% rev = c.changeset.extra.get('transplant_source', '').encode('hex') %>
%if rev:
<div>
${_('Transplanted from:')} ${h.link_to(h.short_id(rev),h.url('changeset_home',repo_name=c.repo_name,revision=rev), class_="changeset_hash")}
</div>
%endif
% if hasattr(c.changeset, 'successors') and c.changeset.successors:
<div class='successors'>
<span class='successors_header'>${_('Replaced by:')} </span>
% for i, s in enumerate(c.changeset.successors):
<%
comma = ""
if i != len(c.changeset.successors)-1:
comma = ", "
%>
<a class='successors_hash' href="${h.url('changeset_home',repo_name=c.repo_name, revision=s)}">${s}</a>${comma}
% endfor
</div>
% endif
% if hasattr(c.changeset, 'precursors') and c.changeset.precursors:
<div class='precursors'>
<span class='precursors_header'>${_('Preceded by:')} </span>
% for i, s in enumerate(c.changeset.precursors):
<%
comma = ""
if i != len(c.changeset.precursors)-1:
comma = ", "
%>
<a class="precursors_hash" href="${h.url('changeset_home',repo_name=c.repo_name, revision=s)}">${s}</a>${comma}
% endfor
</div>
% endif
</div>
</div>
<div class="form-group">${h.urlify_text(c.changeset.message, c.repo_name)}</div>
<div>
<% a_rev, cs_rev, file_diff_data = c.changes[c.changeset.raw_id] %>
% if c.limited_diff:
${ungettext('%s file changed', '%s files changed', len(file_diff_data)) % len(file_diff_data)}:
% else:
${ungettext('%s file changed with %s insertions and %s deletions', '%s files changed with %s insertions and %s deletions', len(file_diff_data)) % (len(file_diff_data), c.lines_added, c.lines_deleted)}:
%endif
</div>
<div class="cs_files">
%for fid, url_fid, op, a_path, path, diff, stats in file_diff_data:
<div class="cs_${op} clearfix">
<span class="node">
<i class="icon-diff-${op}"></i>${h.link_to(h.safe_unicode(path), '#%s' % fid)}
</span>
<div class="changes">${h.fancy_file_stats(stats)}</div>
</div>
%endfor
%if c.limited_diff:
<h5>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}">${_('Show full diff anyway')}</a></h5>
%endif
</div>
<div class="comments-number">
${comment.comment_count(c.inline_cnt, len(c.comments))}
</div>
</div>
</div>
## diff block
<div class="commentable-diff">
<%namespace name="diff_block" file="/changeset/diff_block.html"/>
${diff_block.diff_block_js()}
<% a_rev, cs_rev, file_diff_data = c.changes[c.changeset.raw_id] %>
${diff_block.diff_block(c.repo_name, 'rev', a_rev, a_rev,
c.repo_name, 'rev', cs_rev, cs_rev, file_diff_data)}
% if c.limited_diff:
<h4>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}">${_('Show full diff anyway')}</a></h4>
% endif
</div>
## template for inline comment form
${comment.comment_inline_form()}
## render comments and inlines
${comment.generate_comments()}
## main comment form and it status
${comment.comments()}
</div>
## FORM FOR MAKING JS ACTION AS CHANGESET COMMENTS
<script type="text/javascript">
$(document).ready(function(){
$('.code-difftable').on('click', '.add-bubble', function(e){
show_comment_form($(this));
});
move_comments($(".comments .comments-list-chunk"));
// hack: re-navigate to target after JS is done ... if a target is set and setting href thus won't reload
if (window.location.hash != "") {
window.location.href = window.location.href;
}
});
</script>
</div>
</%def>