changelog.html
296 lines
| 16.2 KiB
| text/html
|
HtmlLexer
r547 | ## -*- coding: utf-8 -*- | |||
<%inherit file="/base/base.html"/> | ||||
<%def name="title()"> | ||||
|
r2417 | ${_('%s Changelog') % c.repo_name} - ${c.rhodecode_name} | ||
r547 | </%def> | |||
<%def name="breadcrumbs_links()"> | ||||
|
r2492 | ${h.link_to(_(u'Home'),h.url('/'))} | ||
r547 | » | |||
r3392 | ${h.repo_link(c.rhodecode_db_repo.groups_and_repo)} | |||
r547 | » | |||
|
r2312 | <% size = c.size if c.size <= c.total_cs else c.total_cs %> | ||
r3392 | ${_('changelog')} - ${ungettext('showing %d out of %d revision', 'showing %d out of %d revisions', size) % (size, c.total_cs)} | |||
r547 | </%def> | |||
<%def name="page_nav()"> | ||||
|
r3197 | ${self.menu('changelog')} | ||
r547 | </%def> | |||
<%def name="main()"> | ||||
<div class="box"> | ||||
<!-- box / title --> | ||||
<div class="title"> | ||||
${self.breadcrumbs()} | ||||
</div> | ||||
<div class="table"> | ||||
|
r3197 | % if c.pagination: | ||
<div id="graph"> | ||||
<div id="graph_nodes"> | ||||
<canvas id="graph_canvas"></canvas> | ||||
</div> | ||||
<div id="graph_content"> | ||||
|
r3485 | <div class="info_box" style="clear: both;padding: 10px 6px;min-height: 12px;text-align: right;"> | ||
r2885 | <a href="#" class="ui-btn small" id="rev_range_container" style="display:none"></a> | |||
r2927 | <a href="#" class="ui-btn small" id="rev_range_clear" style="display:none">${_('Clear selection')}</a> | |||
r2973 | ||||
r2363 | %if c.rhodecode_db_repo.fork: | |||
|
r3486 | <a id="compare_fork" title="${_('Compare fork with %s' % c.rhodecode_db_repo.fork.repo_name)}" href="${h.url('compare_url',repo_name=c.rhodecode_db_repo.fork.repo_name,org_ref_type='branch',org_ref='default',other_repo=c.repo_name,other_ref_type='branch',other_ref=request.GET.get('branch') or 'default',merge=1)}" class="ui-btn small">${_('Compare fork with parent')}</a> | ||
r2363 | %endif | |||
r2773 | %if h.is_hg(c.rhodecode_repo): | |||
|
r3463 | <a id="open_new_pr" href="${h.url('pullrequest_home',repo_name=c.repo_name)}" class="ui-btn small">${_('Open new pull request')}</a> | ||
r2773 | %endif | |||
r2363 | </div> | |||
|
r3197 | <div class="container_header"> | ||
${h.form(h.url.current(),method='get')} | ||||
<div class="info_box" style="float:left"> | ||||
${h.submit('set',_('Show'),class_="ui-btn")} | ||||
${h.text('size',size=1,value=c.size)} | ||||
${_('revisions')} | ||||
</div> | ||||
${h.end_form()} | ||||
r1656 | <div style="float:right">${h.select('branch_filter',c.branch_name,c.branch_filters)}</div> | |||
|
r3197 | </div> | ||
r1888 | ||||
|
r3197 | %for cnt,cs in enumerate(c.pagination): | ||
<div id="chg_${cnt+1}" class="container ${'tablerow%s' % (cnt%2)}"> | ||||
<div class="left"> | ||||
<div> | ||||
${h.checkbox(cs.raw_id,class_="changeset_range")} | ||||
<span class="tooltip" title="${h.tooltip(h.age(cs.date))}"><a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id)}"><span class="changeset_id">${cs.revision}:<span class="changeset_hash">${h.short_id(cs.raw_id)}</span></span></a></span> | ||||
</div> | ||||
<div class="author"> | ||||
<div class="gravatar"> | ||||
<img alt="gravatar" src="${h.gravatar_url(h.email_or_none(cs.author),16)}"/> | ||||
</div> | ||||
<div title="${cs.author}" class="user">${h.shorter(h.person(cs.author),22)}</div> | ||||
</div> | ||||
|
r2416 | <div class="date">${h.fmt_date(cs.date)}</div> | ||
|
r3197 | </div> | ||
<div class="mid"> | ||||
r2426 | <div class="message">${h.urlify_commit(cs.message, c.repo_name,h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id))}</div> | |||
|
r3445 | <div class="expand"><span class="expandtext">↓ ${_('Show more')} ↓</span></div> | ||
|
r3197 | </div> | ||
<div class="right"> | ||||
<div class="changes"> | ||||
r2744 | <div id="changed_total_${cs.raw_id}" style="float:right;" class="changed_total tooltip" title="${h.tooltip(_('Affected number of files, click to show more details'))}">${len(cs.affected_files)}</div> | |||
r1884 | <div class="comments-container"> | |||
%if len(c.comments.get(cs.raw_id,[])) > 0: | ||||
r1885 | <div class="comments-cnt" title="${('comments')}"> | |||
<a href="${h.url('changeset_home',repo_name=c.repo_name,revision=cs.raw_id,anchor='comment-%s' % c.comments[cs.raw_id][0].comment_id)}"> | ||||
<div class="comments-cnt">${len(c.comments[cs.raw_id])}</div> | ||||
<img src="${h.url('/images/icons/comments.png')}"> | ||||
</a> | ||||
</div> | ||||
r1888 | %endif | |||
r1884 | </div> | |||
r2217 | <div class="changeset-status-container"> | |||
%if c.statuses.get(cs.raw_id): | ||||
r2239 | <div title="${_('Changeset status')}" class="changeset-status-lbl">${c.statuses.get(cs.raw_id)[1]}</div> | |||
r2443 | <div class="changeset-status-ico"> | |||
%if c.statuses.get(cs.raw_id)[2]: | ||||
r3214 | <a class="tooltip" title="${_('Click to open associated pull request #%s' % c.statuses.get(cs.raw_id)[2])}" href="${h.url('pullrequest_show',repo_name=c.statuses.get(cs.raw_id)[3],pull_request_id=c.statuses.get(cs.raw_id)[2])}"><img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses.get(cs.raw_id)[0])}" /></a> | |||
r2443 | %else: | |||
<img src="${h.url('/images/icons/flag_status_%s.png' % c.statuses.get(cs.raw_id)[0])}" /> | ||||
%endif | ||||
</div> | ||||
r2217 | %endif | |||
</div> | ||||
|
r3197 | </div> | ||
%if cs.parents: | ||||
%for p_cs in reversed(cs.parents): | ||||
<div class="parent">${_('Parent')} | ||||
<span class="changeset_id">${p_cs.revision}:<span class="changeset_hash">${h.link_to(h.short_id(p_cs.raw_id), | ||||
h.url('changeset_home',repo_name=c.repo_name,revision=p_cs.raw_id),title=p_cs.message)}</span></span> | ||||
</div> | ||||
%endfor | ||||
%else: | ||||
r1888 | <div class="parent">${_('No parents')}</div> | |||
%endif | ||||
|
r3197 | <span class="logtags"> | ||
%if len(cs.parents)>1: | ||||
<span class="merge">${_('merge')}</span> | ||||
%endif | ||||
%if cs.branch: | ||||
<span class="branchtag" title="${'%s %s' % (_('branch'),cs.branch)}"> | ||||
${h.link_to(h.shorter(cs.branch),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} | ||||
r2247 | </span> | |||
|
r3197 | %endif | ||
r2247 | %if h.is_hg(c.rhodecode_repo): | |||
%for book in cs.bookmarks: | ||||
<span class="bookbook" title="${'%s %s' % (_('bookmark'),book)}"> | ||||
${h.link_to(h.shorter(book),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))} | ||||
r2269 | </span> | |||
%endfor | ||||
r2247 | %endif | |||
|
r3197 | %for tag in cs.tags: | ||
<span class="tagtag" title="${'%s %s' % (_('tag'),tag)}"> | ||||
${h.link_to(h.shorter(tag),h.url('files_home',repo_name=c.repo_name,revision=cs.raw_id))}</span> | ||||
%endfor | ||||
</span> | ||||
</div> | ||||
</div> | ||||
r1888 | ||||
|
r3197 | %endfor | ||
<div class="pagination-wh pagination-left"> | ||||
${c.pagination.pager('$link_previous ~2~ $link_next')} | ||||
</div> | ||||
</div> | ||||
</div> | ||||
r1888 | ||||
|
r3197 | <script type="text/javascript" src="${h.url('/js/graph.js')}"></script> | ||
<script type="text/javascript"> | ||||
YAHOO.util.Event.onDOMReady(function(){ | ||||
r1888 | ||||
r977 | //Monitor range checkboxes and build a link to changesets | |||
r1888 | //ranges | |||
r977 | var checkboxes = YUD.getElementsByClassName('changeset_range'); | |||
var url_tmpl = "${h.url('changeset_home',repo_name=c.repo_name,revision='__REVRANGE__')}"; | ||||
|
r3116 | var pr_tmpl = "${h.url('pullrequest_home',repo_name=c.repo_name)}"; | ||
|
r3464 | |||
var checkbox_checker = function(e){ | ||||
|
r3197 | var clicked_cb = e.currentTarget; | ||
r977 | var checked_checkboxes = []; | |||
for (pos in checkboxes){ | ||||
if(checkboxes[pos].checked){ | ||||
checked_checkboxes.push(checkboxes[pos]); | ||||
} | ||||
} | ||||
r2996 | if(YUD.get('open_new_pr')){ | |||
|
r3485 | if(checked_checkboxes.length>1){ | ||
YUD.setStyle('open_new_pr','display','none'); | ||||
} else { | ||||
YUD.setStyle('open_new_pr','display',''); | ||||
if(checked_checkboxes.length>0){ | ||||
YUD.get('open_new_pr').innerHTML = _TM['Open new pull request for selected changesets']; | ||||
}else{ | ||||
YUD.get('open_new_pr').innerHTML = _TM['Open new pull request']; | ||||
} | ||||
r2996 | } | |||
r2927 | } | |||
r2973 | ||||
r3076 | if(checked_checkboxes.length>0){ | |||
|
r3197 | var rev_end = checked_checkboxes[0].name; | ||
var rev_start = checked_checkboxes[checked_checkboxes.length-1].name; | ||||
r977 | var url = url_tmpl.replace('__REVRANGE__', | |||
|
r3197 | rev_start+'...'+rev_end); | ||
r1888 | ||||
|
r3445 | var link = (rev_start == rev_end) | ||
r3449 | ? _TM['Show selected change __S'] | |||
: _TM['Show selected changes __S -> __E']; | ||||
r3447 | ||||
r2927 | link = link.replace('__S',rev_start.substr(0,6)); | |||
link = link.replace('__E',rev_end.substr(0,6)); | ||||
YUD.get('rev_range_container').href = url; | ||||
YUD.get('rev_range_container').innerHTML = link; | ||||
YUD.setStyle('rev_range_container','display',''); | ||||
YUD.setStyle('rev_range_clear','display',''); | ||||
r2973 | ||||
|
r3116 | YUD.get('open_new_pr').href = pr_tmpl + '?rev_start={0}&rev_end={1}'.format(rev_start,rev_end); | ||
|
r3465 | YUD.setStyle('compare_fork','display','none'); | ||
r977 | } | |||
else{ | ||||
|
r3197 | YUD.setStyle('rev_range_container','display','none'); | ||
YUD.setStyle('rev_range_clear','display','none'); | ||||
|
r3485 | YUD.get('open_new_pr').href = pr_tmpl | ||
|
r3465 | YUD.setStyle('compare_fork','display',''); | ||
r977 | } | |||
|
r3464 | }; | ||
YUE.onDOMReady(checkbox_checker); | ||||
YUE.on(checkboxes,'click', checkbox_checker); | ||||
r2927 | YUE.on('rev_range_clear','click',function(e){ | |||
for (var i=0; i<checkboxes.length; i++){ | ||||
var cb = checkboxes[i]; | ||||
cb.checked = false; | ||||
} | ||||
YUE.preventDefault(e); | ||||
}) | ||||
r1865 | var msgs = YUQ('.message'); | |||
|
r1879 | // get first element height | ||
r1934 | var el = YUQ('#graph_content .container')[0]; | |||
r1865 | var row_h = el.clientHeight; | |||
for(var i=0;i<msgs.length;i++){ | ||||
|
r3197 | var m = msgs[i]; | ||
r1865 | ||||
|
r3197 | var h = m.clientHeight; | ||
var pad = YUD.getStyle(m,'padding'); | ||||
if(h > row_h){ | ||||
var offset = row_h - (h+12); | ||||
YUD.setStyle(m.nextElementSibling,'display','block'); | ||||
YUD.setStyle(m.nextElementSibling,'margin-top',offset+'px'); | ||||
}; | ||||
r1865 | } | |||
YUE.on(YUQ('.expand'),'click',function(e){ | ||||
|
r3197 | var elem = e.currentTarget.parentNode.parentNode; | ||
YUD.setStyle(e.currentTarget,'display','none'); | ||||
YUD.setStyle(elem,'height','auto'); | ||||
r1888 | ||||
|
r3197 | //redraw the graph, line_count and jsdata are global vars | ||
|
r2924 | set_canvas(100); | ||
r1888 | ||||
r1865 | var r = new BranchRenderer(); | |||
|
r2924 | r.render(jsdata,100,line_count); | ||
r1888 | ||||
r1865 | }) | |||
r1888 | ||||
// Fetch changeset details | ||||
r1431 | YUE.on(YUD.getElementsByClassName('changed_total'),'click',function(e){ | |||
|
r3197 | var id = e.currentTarget.id; | ||
var url = "${h.url('changelog_details',repo_name=c.repo_name,cs='__CS__')}"; | ||||
var url = url.replace('__CS__',id.replace('changed_total_','')); | ||||
ypjax(url,id,function(){tooltip_activate()}); | ||||
r1431 | }); | |||
r1888 | ||||
r1656 | // change branch filter | |||
YUE.on(YUD.get('branch_filter'),'change',function(e){ | ||||
|
r3197 | var selected_branch = e.currentTarget.options[e.currentTarget.selectedIndex].value; | ||
var url_main = "${h.url('changelog_home',repo_name=c.repo_name)}"; | ||||
var url = "${h.url('changelog_home',repo_name=c.repo_name,branch='__BRANCH__')}"; | ||||
var url = url.replace('__BRANCH__',selected_branch); | ||||
if(selected_branch != ''){ | ||||
window.location = url; | ||||
}else{ | ||||
window.location = url_main; | ||||
} | ||||
r1888 | ||||
r1656 | }); | |||
r1888 | ||||
|
r3197 | function set_canvas(width) { | ||
var c = document.getElementById('graph_nodes'); | ||||
var t = document.getElementById('graph_content'); | ||||
canvas = document.getElementById('graph_canvas'); | ||||
var div_h = t.clientHeight; | ||||
c.style.height=div_h+'px'; | ||||
canvas.setAttribute('height',div_h); | ||||
c.style.height=width+'px'; | ||||
canvas.setAttribute('width',width); | ||||
}; | ||||
var heads = 1; | ||||
var line_count = 0; | ||||
var jsdata = ${c.jsdata|n}; | ||||
r1888 | ||||
|
r3197 | for (var i=0;i<jsdata.length;i++) { | ||
|
r2924 | var in_l = jsdata[i][2]; | ||
for (var j in in_l) { | ||||
var m = in_l[j][1]; | ||||
if (m > line_count) | ||||
line_count = m; | ||||
} | ||||
|
r3197 | } | ||
set_canvas(100); | ||||
r1888 | ||||
|
r3197 | var r = new BranchRenderer(); | ||
r.render(jsdata,100,line_count); | ||||
r1888 | ||||
|
r3197 | }); | ||
</script> | ||||
%else: | ||||
${_('There are no changes yet')} | ||||
%endif | ||||
r547 | </div> | |||
r1888 | </div> | |||
r1865 | </%def> | |||