Commit add268a4 authored by emassip's avatar emassip

Integrated revision graph into scmid column.

Allow wrapping of comment text so that the width doesn't overlap the sidebar while using multiple repositories.
Some code cleanup also.

git-svn-id: https://svn.redmine.org/redmine/trunk@8850 e93f8b46-1217-0410-a6f0-8f06a7374b81
parent 3497a124
......@@ -271,7 +271,6 @@ module RepositoriesHelper
commits_by_scmid[commit.scmid] = {
:parent_scmids => commit.parents.collect { |parent| parent.scmid },
:rdmid => commit_index,
:space => 0,
:refs => refs_map.include?(commit.scmid) ? refs_map[commit.scmid].join(" ") : nil,
:scmid => commit.scmid,
:href => block_given? ? yield(commit.scmid) : commit.scmid
......@@ -280,40 +279,40 @@ module RepositoriesHelper
heads.sort! { |head1, head2| head1.to_s <=> head2.to_s }
mark_index = 0
space = nil
heads.each do |head|
if commits_by_scmid.include? head.scmid
mark_index = mark_chain(mark_index += 1, commits_by_scmid[head.scmid], commits_by_scmid)
space = index_head((space || -1) + 1, head, commits_by_scmid)
end
end
# when no head matched anything use first commit
if mark_index == 0
mark_chain(mark_index += 1, commits_by_scmid.values.first, commits_by_scmid)
end
commits_by_scmid
space ||= index_head(0, commits.first, commits_by_scmid)
return commits_by_scmid, space
end
def mark_chain(mark_index, commit, commits_by_scmid)
def index_head(space, commit, commits_by_scmid)
stack = [[mark_index, commit]]
mark_max_index = mark_index
stack = [[space, commits_by_scmid[commit.scmid]]]
max_space = space
until stack.empty?
mark_index, commit = stack.pop
commit[:space] = mark_index if commit[:space] == 0
space, commit = stack.pop
commit[:space] = space if commit[:space].nil?
mark_index -=1
space -= 1
commit[:parent_scmids].each_with_index do |parent_scmid, parent_index|
parent_commit = commits_by_scmid[parent_scmid]
if parent_commit and parent_commit[:space] == 0
if parent_commit and parent_commit[:space].nil?
stack.unshift [mark_index += 1, parent_commit]
stack.unshift [space += 1, parent_commit]
end
end
mark_max_index = mark_index if mark_max_index < mark_index
max_space = space if max_space < space
end
mark_max_index
max_space
end
end
......@@ -4,9 +4,10 @@
<script type="text/javascript" charset="utf-8">
Event.observe(window, 'load', function(){
revisionGraph(
document.getElementById("holder"),
<%= commits.to_json.html_safe %>);
document.getElementById('holder'),
<%= commits.to_json.html_safe %>,
<%= space %>);
});
</script>
<div id="holder" class="graph"></div>
<div id="holder" class="revision-graph" style="width: <%= (space + 1) * 20 %>px;"></div>
......@@ -6,9 +6,6 @@
) do %>
<table class="list changesets">
<thead><tr>
<% if show_revision_graph %>
<th></th>
<% end %>
<th>#</th>
<th></th>
<th></th>
......@@ -18,40 +15,30 @@
</tr></thead>
<tbody>
<% show_diff = revisions.size > 1 %>
<%= if show_revision_graph && revisions && revisions.any?
indexed_commits, graph_space = index_commits(revisions, @repository.branches) do |scmid|
url_for(
:controller => 'repositories',
:action => 'revision',
:id => project,
:repository_id => @repository.identifier_param,
:rev => scmid)
end
render :partial => 'revision_graph',
:locals => {
:commits => indexed_commits,
:space => graph_space
}
end %>
<% line_num = 1 %>
<% revisions.each do |changeset| %>
<tr class="changeset <%= cycle 'odd', 'even' %>">
<% if show_revision_graph %>
<% if line_num == 1 %>
<td class="revision_graph" rowspan="<%= revisions.size %>">
<%= render :partial => 'revision_graph',
:locals => {
:commits => index_commits(
revisions,
@repository.branches) do |scmid|
url_for(
:controller => 'repositories',
:action => 'revision',
:id => project,
:repository_id => @repository.identifier_param,
:rev => scmid)
end
} %>
</td>
<% end %>
<% end %>
<td class="id"><%= link_to_revision(changeset, @repository) %></td>
<td class="id"<%= show_revision_graph ? " style=\"padding-left:#{(graph_space + 1) * 20}px\"" : '' %>><%= link_to_revision(changeset, @repository) %></td>
<td class="checkbox"><%= radio_button_tag('rev', changeset.identifier, (line_num==1), :id => "cb-#{line_num}", :onclick => "$('cbto-#{line_num+1}').checked=true;") if show_diff && (line_num < revisions.size) %></td>
<td class="checkbox"><%= radio_button_tag('rev_to', changeset.identifier, (line_num==2), :id => "cbto-#{line_num}", :onclick => "if ($('cb-#{line_num}').checked==true) {$('cb-#{line_num-1}').checked=true;}") if show_diff && (line_num > 1) %></td>
<td class="committed_on"><%= format_time(changeset.committed_on) %></td>
<td class="author"><%= h truncate(changeset.author.to_s, :length => 30) %></td>
<% if show_revision_graph %>
<td class="comments_nowrap">
<%= textilizable(truncate(truncate_at_line_break(changeset.comments, 0), :length => 90)) %>
</td>
<% else %>
<td class="comments"><%= textilizable(truncate_at_line_break(changeset.comments)) %></td>
<% end %>
<td class="comments"><%= textilizable(truncate_at_line_break(changeset.comments)) %></td>
</tr>
<% line_num += 1 %>
<% end %>
......
function revisionGraph(holder, commits_hash) {
function revisionGraph(holder, commits_hash, graph_space) {
var LEFT_PADDING = 3,
TOP_PADDING = 10,
XSTEP = 20;
var YSTEP = $$('tr.changeset')[0].getHeight();
var XSTEP = 20,
CIRCLE_INROW_OFFSET = 10;
var commits_by_scmid = $H(commits_hash),
commits = commits_by_scmid.values();
// init max dimensions
var max_rdmid = max_space = 0;
commits.each(function(commit) {
var max_rdmid = commits.length - 1;
max_rdmid = Math.max(max_rdmid, commit.rdmid);
max_space = Math.max(max_space, commit.space);
});
var commit_table_rows = $$('table.changesets tr.changeset');
// init dimensions
var graph_offset = $(holder).getLayout().get('top'),
graph_width = (graph_space + 1) * XSTEP,
graph_height = commit_table_rows[max_rdmid].getLayout().get('top') + commit_table_rows[max_rdmid].getLayout().get('height') - graph_offset;
var graph_height = max_rdmid * YSTEP + YSTEP,
graph_width = max_space * XSTEP + XSTEP;
// init colors
var colors = ['#000'];
for (var k = 0; k < max_space; k++) {
var colors = [];
for (var k = 0; k < graph_space + 1; k++) {
colors.push(Raphael.getColor());
}
......@@ -37,8 +33,8 @@ function revisionGraph(holder, commits_hash) {
commits.each(function(commit) {
y = TOP_PADDING + YSTEP *(max_rdmid - commit.rdmid);
x = LEFT_PADDING + XSTEP * commit.space;
y = commit_table_rows[max_rdmid - commit.rdmid].getLayout().get('top') - graph_offset + CIRCLE_INROW_OFFSET;
x = XSTEP / 2 + XSTEP * commit.space;
graph.circle(x, y, 3).attr({fill: colors[commit.space], stroke: 'none'});
......@@ -64,8 +60,8 @@ function revisionGraph(holder, commits_hash) {
parent_commit = commits_by_scmid.get(parent_scmid);
if (parent_commit) {
parent_y = TOP_PADDING + YSTEP * (max_rdmid - parent_commit.rdmid);
parent_x = LEFT_PADDING + XSTEP * parent_commit.space;
parent_y = commit_table_rows[max_rdmid - parent_commit.rdmid].getLayout().get('top') - graph_offset + CIRCLE_INROW_OFFSET;
parent_x = XSTEP / 2 + XSTEP * parent_commit.space;
if (parent_commit.space == commit.space) {
// vertical path
......
......@@ -176,7 +176,6 @@ tr.changeset ul, ol { margin-top: 0px; margin-bottom: 0px; }
tr.changeset td.revision_graph { width: 15%; background-color: #fffffb; }
tr.changeset td.author { text-align: center; width: 15%; white-space:nowrap;}
tr.changeset td.committed_on { text-align: center; width: 15%; white-space:nowrap;}
tr.changeset td.comments_nowrap { width: 45%; white-space:nowrap;}
table.files tr.file td { text-align: center; }
table.files tr.file td.filename { text-align: left; padding-left: 24px; }
......
......@@ -4,6 +4,8 @@ table.revision-info td {
padding: 0px;
}
div.revision-graph { position: absolute; overflow:hidden; }
div.changeset-changes ul { margin: 0; padding: 0; }
div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment