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('/'))}
+    &raquo;
+    ${h.link_to(c.repo_name,h.url('summary_home',repo_name=c.repo_name))}
+    &raquo;
+    ${_('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)}
+				 ##&raquo; <span>${h.link_to(_('raw diff'),
+				##h.url('raw_changeset_home',repo_name=c.repo_name,revision=c.changeset.raw_id,diff='show'))}</span>
+				 ##&raquo; <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:
+					&raquo; <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>
+					&raquo; <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>
+					&raquo; <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