Mercurial > kallithea
changeset 977:28524453bb76 beta
started work on #93 added rev ranges view, checkboxes in changelog to view ranges of changes
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Sun, 30 Jan 2011 22:56:37 +0100 |
parents | de535f8b1e8b |
children | 6d2239363c81 |
files | rhodecode/controllers/changeset.py rhodecode/public/css/style.css rhodecode/templates/changelog/changelog.html rhodecode/templates/changeset/changeset.html rhodecode/templates/changeset/changeset_range.html |
diffstat | 5 files changed, 224 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/rhodecode/controllers/changeset.py Fri Jan 28 22:12:28 2011 +0100 +++ b/rhodecode/controllers/changeset.py Sun Jan 30 22:56:37 2011 +0100 @@ -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 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 @@ </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')) - else: - try: - 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] = [] + try: + changeset_parent = changeset.parents[0] + except IndexError: + changeset_parent = None + + + #================================================================== # ADDED FILES - #=================================================================== - c.sum_added = 0 - 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 @@ 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 - #=================================================================== - c.sum_removed = 0 - for node in c.changeset.changed: + #================================================================== + for node in changeset.changed: try: - filenode_old = c.changeset_old.get_node(node.path) + filenode_old = changeset_parent.get_node(node.path) except ChangesetError: filenode_old = FileNode(node.path, '', EmptyChangeset()) @@ -125,15 +168,21 @@ cs1 = filenode_old.last_changeset.raw_id cs2 = node.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.html') + else: + return render('changeset/changeset_range.html') def raw_changeset(self, revision): @@ -148,9 +197,9 @@ return redirect(url('home')) else: try: - c.changeset_old = c.changeset.parents[0] + c.changeset_parent = c.changeset.parents[0] except IndexError: - c.changeset_old = None + c.changeset_parent = None c.changes = [] for node in c.changeset.added: @@ -166,7 +215,7 @@ c.changes.append(('added', node, diff, cs1, cs2)) for node in c.changeset.changed: - filenode_old = c.changeset_old.get_node(node.path) + filenode_old = c.changeset_parent.get_node(node.path) if filenode_old.is_binary or node.is_binary: diff = _('binary file') else:
--- a/rhodecode/public/css/style.css Fri Jan 28 22:12:28 2011 +0100 +++ b/rhodecode/public/css/style.css Sun Jan 30 22:56:37 2011 +0100 @@ -1510,7 +1510,9 @@ 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 @@ font-weight:700; padding-bottom:5px; } +#graph_content .container .left .date span{ +vertical-align: text-top; +} #graph_content .container .left .message { font-size:100%;
--- a/rhodecode/templates/changelog/changelog.html Fri Jan 28 22:12:28 2011 +0100 +++ b/rhodecode/templates/changelog/changelog.html Sun Jan 30 22:56:37 2011 +0100 @@ -32,21 +32,25 @@ </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'))} - </div> - ${h.end_form()} - + ${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'))} + + </div> + ${h.end_form()} + <div id="rev_range_container" style="display:none"></div> </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> <div class="author"> <div class="gravatar"> <img alt="gravatar" src="${h.gravatar_url(h.email(cs.author),20)}"/> @@ -113,6 +117,37 @@ <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 @@ set_canvas(); var jsdata = ${c.jsdata|n}; var r = new BranchRenderer(); - r.render(jsdata); + r.render(jsdata); + + + }); </script> %else:
--- a/rhodecode/templates/changeset/changeset.html Fri Jan 28 22:12:28 2011 +0100 +++ b/rhodecode/templates/changeset/changeset.html Sun Jan 30 22:56:37 2011 +0100 @@ -23,7 +23,7 @@ ${self.breadcrumbs()} </div> <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 </div> </div> @@ -91,8 +91,8 @@ %for change,filenode,diff,cs1,cs2 in c.changes: %if change !='removed': <div style="clear:both;height:10px"></div> - <div id="body" class="diffblock"> - <div id="${'CHANGE-%s'%filenode.path}" class="code-header"> + <div class="diffblock"> + <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 @@ </div> %endif %endfor - </div> -</div> - + </div> </%def> \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rhodecode/templates/changeset/changeset_range.html Sun Jan 30 22:56:37 2011 +0100 @@ -0,0 +1,86 @@ +<%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> + +<%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> + +<%def name="page_nav()"> + ${self.menu('changelog')} +</%def> + +<%def name="main()"> +<div class="box"> + <!-- box / title --> + <div class="title"> + ${self.breadcrumbs()} + </div> + <div class="table"> + <div id="body" class="diffblock"> + <div class="code-header"> + <div> + ${_('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)} + ##» <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> + </div> + </div> + <div id="changeset_content"> + <div class="container"> + + </div> + <span style="font-size:1.1em;font-weight: bold">${_('Files affected')}</span> + <div class="cs_files"> + %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> + %endfor + %endfor + </div> + </div> + + </div> + %for cs in c.cs_ranges: + %for change,filenode,diff,cs1,cs2 in c.changes[cs.raw_id]: + %if change !='removed': + <div style="clear:both;height:10px"></div> + <div class="diffblock"> + <div id="${h.repo_name_slug('C%s-%s' % (cs.short_id,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, + 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> + %endif + </div> + </div> + <div class="code-body"> + %if diff: + ${diff|n} + %else: + ${_('No changes in this file')} + %endif + </div> + </div> + %endif + %endfor + %endfor + </div> +</%def> \ No newline at end of file