@@ -3,7 +3,8 @@
rhodecode.controllers.changeset
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
changeset controller for pylons
changeset controller for pylons showoing changes beetween
revisions
:created_on: Apr 25, 2010
:author: marcink
@@ -40,6 +41,7 @@ from rhodecode.model.scm import ScmModel
from vcs.exceptions import RepositoryError, ChangesetError
from vcs.nodes import FileNode
from vcs.utils import diffs as differ
from vcs.utils.ordered_dict import OrderedDict
log = logging.getLogger(__name__)
@@ -63,25 +65,67 @@ class ChangesetController(BaseController
</tr>
</table>''' % str
def get_cs_range(repo, rev_start, rev_end):
"""
Temp fix function until VCS will handle that
see issue #48
:param rev_start:
:param rev_end:
start_cs = repo.get_changeset(rev_start)
end_cs = repo.get_changeset(rev_end)
if start_cs.revision >= end_cs.revision:
raise Exception('Start cannot be after End')
yield start_cs
while 1:
next = start_cs.next()
yield next
start_cs = next
if next == end_cs:
break
#======================================================================
# REAL CODE BELOW
#get ranges of revisions if preset
rev_range = revision.split('...')[:2]
try:
c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
repo = hg_model.get_repo(c.repo_name)
if len(rev_range) == 2:
rev_start = rev_range[0]
rev_end = rev_range[1]
rev_ranges = get_cs_range(repo, rev_start, rev_end)
else:
rev_ranges = [repo.get_changeset(revision)]
except RepositoryError, e:
log.error(traceback.format_exc())
h.flash(str(e), category='warning')
return redirect(url('home'))
c.changeset_old = c.changeset.parents[0]
except IndexError:
c.changeset_old = None
c.changes = []
c.changes = OrderedDict()
c.sum_added = 0
c.sum_removed = 0
c.cs_ranges = list(rev_ranges)
#===================================================================
for changeset in c.cs_ranges:
c.changes[changeset.raw_id] = []
changeset_parent = changeset.parents[0]
changeset_parent = None
#==================================================================
# ADDED FILES
for node in c.changeset.added:
for node in changeset.added:
filenode_old = FileNode(node.path, '', EmptyChangeset())
if filenode_old.is_binary or node.is_binary:
diff = wrap_to_table(_('binary file'))
@@ -97,15 +141,14 @@ class ChangesetController(BaseController
cs1 = None
cs2 = node.last_changeset.raw_id
c.changes.append(('added', node, diff, cs1, cs2))
c.changes[changeset.raw_id].append(('added', node, diff, cs1, cs2))
# CHANGED FILES
for node in c.changeset.changed:
for node in changeset.changed:
filenode_old = c.changeset_old.get_node(node.path)
filenode_old = changeset_parent.get_node(node.path)
except ChangesetError:
@@ -125,15 +168,21 @@ class ChangesetController(BaseController
cs1 = filenode_old.last_changeset.raw_id
c.changes.append(('changed', node, diff, cs1, cs2))
c.changes[changeset.raw_id].append(('changed', node, diff, cs1, cs2))
# REMOVED FILES
for node in c.changeset.removed:
c.changes.append(('removed', node, None, None, None))
for node in changeset.removed:
c.changes[changeset.raw_id].append(('removed', node, None, None, None))
return render('changeset/changeset.html')
if len(c.cs_ranges) == 1:
c.changeset = c.cs_ranges[0]
c.changes = c.changes[c.changeset.raw_id]
return render('changeset/changeset_range.html')
def raw_changeset(self, revision):
@@ -148,9 +197,9 @@ class ChangesetController(BaseController
c.changeset_parent = c.changeset.parents[0]
c.changeset_parent = None
@@ -166,7 +215,7 @@ class ChangesetController(BaseController
filenode_old = c.changeset_parent.get_node(node.path)
diff = _('binary file')
@@ -1510,7 +1510,9 @@ float:left;
border:1px solid #CCC;
padding:10px;
}
#graph_content #rev_range_container{
padding:10px 0px;
#graph_content .container {
border-bottom:1px solid #CCC;
border-left:1px solid #CCC;
@@ -1531,6 +1533,9 @@ padding-bottom:5px;
font-weight:700;
padding-bottom:5px;
#graph_content .container .left .date span{
vertical-align: text-top;
#graph_content .container .left .message {
font-size:100%;
@@ -32,21 +32,25 @@ ${c.repo_name} ${_('Changelog')} - ${c.r
</div>
<div id="graph_content">
<div class="container_header">
${h.form(h.url.current(),method='get')}
<div class="info_box">
<span>${_('Show')}:</span>
${h.text('size',size=1,value=c.size)}
<span>${_('revisions')}</span>
${h.submit('set',_('set'))}
${h.end_form()}
<div id="rev_range_container" style="display:none"></div>
%for cnt,cs in enumerate(c.pagination):
<div id="chg_${cnt+1}" class="container">
<div class="left">
<div class="date">${_('commit')} ${cs.revision}: ${h.short_id(cs.raw_id)}@${cs.date}</div>
<div class="date">
${h.checkbox(cs.short_id,class_="changeset_range")}
<span>${_('commit')} ${cs.revision}: ${h.short_id(cs.raw_id)}@${cs.date}</span>
<div class="author">
<div class="gravatar">
<img alt="gravatar" src="${h.gravatar_url(h.email(cs.author),20)}"/>
@@ -113,6 +117,37 @@ ${c.repo_name} ${_('Changelog')} - ${c.r
<script type="text/javascript" src="/js/graph.js"></script>
<script type="text/javascript">
YAHOO.util.Event.onDOMReady(function(){
//Monitor range checkboxes and build a link to changesets
//ranges
var checkboxes = YUD.getElementsByClassName('changeset_range');
var url_tmpl = "${h.url('changeset_home',repo_name=c.repo_name,revision='__REVRANGE__')}";
YUE.on(checkboxes,'click',function(e){
var checked_checkboxes = [];
for (pos in checkboxes){
if(checkboxes[pos].checked){
checked_checkboxes.push(checkboxes[pos]);
if(checked_checkboxes.length>1){
var rev_end = checked_checkboxes[0].name;
var rev_start = checked_checkboxes[checked_checkboxes.length-1].name;
var url = url_tmpl.replace('__REVRANGE__',
rev_start+'...'+rev_end);
var link = "<a href="+url+">${_('Show selected changes __S -> __E')}</a>"
link = link.replace('__S',rev_start);
link = link.replace('__E',rev_end);
YUD.get('rev_range_container').innerHTML = link;
YUD.setStyle('rev_range_container','display','');
else{
YUD.setStyle('rev_range_container','display','none');
});
function set_canvas() {
var c = document.getElementById('graph_nodes');
var t = document.getElementById('graph_content');
@@ -125,7 +160,10 @@ ${c.repo_name} ${_('Changelog')} - ${c.r
set_canvas();
var jsdata = ${c.jsdata|n};
var r = new BranchRenderer();
r.render(jsdata);
</script>
%else:
@@ -23,7 +23,7 @@
${self.breadcrumbs()}
<div class="table">
<div id="body" class="diffblock">
<div class="diffblock">
<div class="code-header">
<div>
${_('Changeset')} - r${c.changeset.revision}:${h.short_id(c.changeset.raw_id)}
@@ -81,7 +81,7 @@
<span style="font-size:1.1em;font-weight: bold">${_('Files affected')}</span>
<div class="cs_files">
%for change,filenode,diff,cs1,cs2 in c.changes:
<div class="cs_${change}">${h.link_to(filenode.path,h.url.current(anchor='CHANGE-%s'%filenode.path))}</div>
<div class="cs_${change}">${h.link_to(filenode.path,h.url.current(anchor=h.repo_name_slug('C%s' % filenode.path)))}</div>
%endfor
@@ -91,8 +91,8 @@
%if change !='removed':
<div style="clear:both;height:10px"></div>
<div id="${'CHANGE-%s'%filenode.path}" class="code-header">
<div id="${h.repo_name_slug('C%s' % filenode.path)}" class="code-header">
<div class="changeset_header">
<span class="changeset_file">
${h.link_to_if(change!='removed',filenode.path,h.url('files_home',repo_name=c.repo_name,
@@ -118,7 +118,5 @@
%endif
</%def>
\ No newline at end of file
new file 100644
<%inherit file="/base/base.html"/>
<%def name="title()">
${c.repo_name} ${_('Changesets')} - r${c.cs_ranges[0].revision}:${h.short_id(c.cs_ranges[0].raw_id)} -> r${c.cs_ranges[-1].revision}:${h.short_id(c.cs_ranges[-1].raw_id)} - ${c.rhodecode_name}
<%def name="breadcrumbs_links()">
${h.link_to(u'Home',h.url('/'))}
»
${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
${_('Changesets')} - r${c.cs_ranges[0].revision}:${h.short_id(c.cs_ranges[0].raw_id)} -> r${c.cs_ranges[-1].revision}:${h.short_id(c.cs_ranges[-1].raw_id)}
<%def name="page_nav()">
${self.menu('changelog')}
<%def name="main()">
<div class="box">
<!-- box / title -->
<div class="title">
##» <span>${h.link_to(_('raw diff'),
##h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='show'))}</span>
##» <span>${h.link_to(_('download diff'),
##h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='download'))}</span>
<div id="changeset_content">
<div class="container">
%for cs in c.cs_ranges:
${cs}
%for change,filenode,diff,cs1,cs2 in c.changes[cs.raw_id]:
<div class="cs_${change}">${h.link_to(filenode.path,h.url.current(anchor=h.repo_name_slug('C%s-%s' % (cs.short_id,filenode.path))))}</div>
<div id="${h.repo_name_slug('C%s-%s' % (cs.short_id,filenode.path))}" class="code-header">
revision=filenode.changeset.raw_id,f_path=filenode.path))}
</span>
%if 1:
» <span>${h.link_to(_('diff'),
h.url('files_diff_home',repo_name=c.repo_name,f_path=filenode.path,diff2=cs2,diff1=cs1,diff='diff'))}</span>
» <span>${h.link_to(_('raw diff'),
h.url('files_diff_home',repo_name=c.repo_name,f_path=filenode.path,diff2=cs2,diff1=cs1,diff='raw'))}</span>
» <span>${h.link_to(_('download diff'),
h.url('files_diff_home',repo_name=c.repo_name,f_path=filenode.path,diff2=cs2,diff1=cs1,diff='download'))}</span>
<div class="code-body">
%if diff:
${diff|n}
${_('No changes in this file')}
Status change: