| |   |
| 37 | 37 | end |
| 38 | 38 | |
| 39 | 39 | # Takes a unified diff as input and renders it as html |
| 40 | | def render_diff(udiff, src_sha, dst_sha) |
| 40 | def render_diff(udiff, src_sha, dst_sha, display_mode = "inline") |
| 41 | 41 | return if udiff.blank? |
| 42 | | |
| 42 | |
| 43 | case display_mode |
| 44 | when "sidebyside" |
| 45 | render_sidebyside_diff(udiff, src_sha, dst_sha) |
| 46 | else |
| 47 | render_inline_diff(udiff, src_sha, dst_sha) |
| 48 | end |
| 49 | end |
| 50 | |
| 51 | def render_inline_diff(udiff, src_sha, dst_sha) |
| 43 | 52 | callback = Gitorious::Diff::InlineTableCallback.new |
| 44 | | |
| 45 | | out = %Q{<table class="codediff">\n} |
| 53 | out = %Q{<table class="codediff inline">\n} |
| 46 | 54 | out << "<thead>\n" |
| 47 | 55 | out << "<tr>" |
| 48 | 56 | out << %Q{<td class="line-numbers">#{src_sha}</td>} |
| … | … | |
| 62 | 62 | out |
| 63 | 63 | end |
| 64 | 64 | |
| 65 | def render_sidebyside_diff(udiff, src_sha, dst_sha) |
| 66 | callback = Gitorious::Diff::SidebysideTableCallback.new |
| 67 | out = %Q{<table class="codediff sidebyside">\n} |
| 68 | out << %Q{<colgroup class="left"><col class="lines"/><col class="code"/></colgroup>} |
| 69 | out << %Q{<colgroup class="right"><col class="lines"/><col class="code"/></colgroup>} |
| 70 | out << %Q{<thead><th colspan="2">#{src_sha}</th>} |
| 71 | out << %Q{<th colspan="2">#{dst_sha}</th></thead>} |
| 72 | out << Diff::Display::Unified::Renderer.run(udiff, callback) |
| 73 | out << "</table>" |
| 74 | out |
| 75 | end |
| 76 | |
| 65 | 77 | end |
| toggle raw diff |
--- a/app/helpers/browse_helper.rb
+++ b/app/helpers/browse_helper.rb
@@ -37,12 +37,20 @@ module BrowseHelper
end
# Takes a unified diff as input and renders it as html
- def render_diff(udiff, src_sha, dst_sha)
+ def render_diff(udiff, src_sha, dst_sha, display_mode = "inline")
return if udiff.blank?
-
+
+ case display_mode
+ when "sidebyside"
+ render_sidebyside_diff(udiff, src_sha, dst_sha)
+ else
+ render_inline_diff(udiff, src_sha, dst_sha)
+ end
+ end
+
+ def render_inline_diff(udiff, src_sha, dst_sha)
callback = Gitorious::Diff::InlineTableCallback.new
-
- out = %Q{<table class="codediff">\n}
+ out = %Q{<table class="codediff inline">\n}
out << "<thead>\n"
out << "<tr>"
out << %Q{<td class="line-numbers">#{src_sha}</td>}
@@ -54,4 +62,16 @@ module BrowseHelper
out
end
+ def render_sidebyside_diff(udiff, src_sha, dst_sha)
+ callback = Gitorious::Diff::SidebysideTableCallback.new
+ out = %Q{<table class="codediff sidebyside">\n}
+ out << %Q{<colgroup class="left"><col class="lines"/><col class="code"/></colgroup>}
+ out << %Q{<colgroup class="right"><col class="lines"/><col class="code"/></colgroup>}
+ out << %Q{<thead><th colspan="2">#{src_sha}</th>}
+ out << %Q{<th colspan="2">#{dst_sha}</th></thead>}
+ out << Diff::Display::Unified::Renderer.run(udiff, callback)
+ out << "</table>"
+ out
+ end
+
end |
| |   |
| 13 | 13 | <% #TODO: commit diff stats (as sparklines?) -%> |
| 14 | 14 | |
| 15 | 15 | <h2>Commit diff</h2> |
| 16 | <% #TODO diffmode selector -%> |
| 16 | 17 | |
| 17 | 18 | <% @diff.each do |file| -%> |
| 18 | 19 | <h4><%= h(file.path) -%><%#=link_to h(file.path), blob_path(file.sha, file.path) -%></h4> |
| 19 | | <%= render_diff(file.patch, file.src, file.dst) -%> |
| 20 | <%= render_diff(file.patch, file.src, file.dst, @diffmode) -%> |
| 20 | 21 | <small><%= link_to_function "toggle raw diff", "$('#{file.id}').toggle()" -%></small> |
| 21 | 22 | <div class="toggle_diff" style="display:none" id="<%= file.id -%>"> |
| 22 | 23 | <p><pre><%= h(file.patch) -%></pre></p> |
| toggle raw diff |
--- a/app/views/browse/commit.html.erb
+++ b/app/views/browse/commit.html.erb
@@ -13,10 +13,11 @@
<% #TODO: commit diff stats (as sparklines?) -%>
<h2>Commit diff</h2>
+<% #TODO diffmode selector -%>
<% @diff.each do |file| -%>
<h4><%= h(file.path) -%><%#=link_to h(file.path), blob_path(file.sha, file.path) -%></h4>
- <%= render_diff(file.patch, file.src, file.dst) -%>
+ <%= render_diff(file.patch, file.src, file.dst, @diffmode) -%>
<small><%= link_to_function "toggle raw diff", "$('#{file.id}').toggle()" -%></small>
<div class="toggle_diff" style="display:none" id="<%= file.id -%>">
<p><pre><%= h(file.patch) -%></pre></p> |
| |   |
| 48 | 48 | t.string "bugtracker_url" |
| 49 | 49 | end |
| 50 | 50 | |
| 51 | add_index "projects", ["slug"], :name => "index_projects_on_slug", :unique => true |
| 51 | 52 | add_index "projects", ["title"], :name => "index_projects_on_name" |
| 52 | 53 | add_index "projects", ["user_id"], :name => "index_projects_on_user_id" |
| 53 | | add_index "projects", ["slug"], :name => "index_projects_on_slug" |
| 54 | 54 | |
| 55 | 55 | create_table "repositories", :force => true do |t| |
| 56 | 56 | t.string "name" |
| … | … | |
| 93 | 93 | t.string "name" |
| 94 | 94 | end |
| 95 | 95 | |
| 96 | add_index "tags", ["name"], :name => "index_tags_on_name", :unique => true |
| 97 | |
| 96 | 98 | create_table "tasks", :force => true do |t| |
| 97 | 99 | t.string "target_class" |
| 98 | 100 | t.string "command" |
| toggle raw diff |
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -48,9 +48,9 @@ ActiveRecord::Schema.define(:version => 19) do
t.string "bugtracker_url"
end
+ add_index "projects", ["slug"], :name => "index_projects_on_slug", :unique => true
add_index "projects", ["title"], :name => "index_projects_on_name"
add_index "projects", ["user_id"], :name => "index_projects_on_user_id"
- add_index "projects", ["slug"], :name => "index_projects_on_slug"
create_table "repositories", :force => true do |t|
t.string "name"
@@ -93,6 +93,8 @@ ActiveRecord::Schema.define(:version => 19) do
t.string "name"
end
+ add_index "tags", ["name"], :name => "index_tags_on_name", :unique => true
+
create_table "tasks", :force => true do |t|
t.string "target_class"
t.string "command" |
| |   |
| 1 | module Gitorious |
| 2 | module Diff |
| 3 | class SidebysideTableCallback |
| 4 | |
| 5 | # Before blocks |
| 6 | def before_addblock(block) |
| 7 | "<tbody><tr>" |
| 8 | end |
| 9 | |
| 10 | def before_remblock(block) |
| 11 | "<tbody><tr>" |
| 12 | end |
| 13 | |
| 14 | def before_modblock(block) |
| 15 | "<tbody><tr>" |
| 16 | end |
| 17 | |
| 18 | def before_unmodblock(block) |
| 19 | "<tbody><tr>" |
| 20 | end |
| 21 | |
| 22 | def before_sepblock(block) |
| 23 | "<tbody><tr>" |
| 24 | end |
| 25 | |
| 26 | # After blocks |
| 27 | def after_addblock(block) |
| 28 | "</tbody>" |
| 29 | end |
| 30 | |
| 31 | def after_remblock(block) |
| 32 | "</tbody>" |
| 33 | end |
| 34 | |
| 35 | def after_modblock(block) |
| 36 | # "</tbody>" |
| 37 | end |
| 38 | |
| 39 | def after_unmodblock(block) |
| 40 | "</tbody>" |
| 41 | end |
| 42 | |
| 43 | def after_sepblock(block) |
| 44 | "</body>" |
| 45 | end |
| 46 | |
| 47 | # Before lines |
| 48 | def before_addline(line) |
| 49 | # adds go on the right |
| 50 | %Q{<th class="line-numbers">#{line.number}</th>} + |
| 51 | %Q{<td class="code ins"></td>} + |
| 52 | %Q{<th class="line-numbers">#{line.number}</th>} + |
| 53 | %Q{<td class="code ins"><ins>} |
| 54 | end |
| 55 | |
| 56 | def before_remline(line) |
| 57 | # rems go on the left (hide the right side) |
| 58 | %Q{<th class="line-numbers">#{line.number}</th>} + |
| 59 | %Q{<td class="code del"><del>#{line}</del></td>} + |
| 60 | %Q{<th class="line-numbers">#{line.number}</th>} + |
| 61 | %Q{<td class="code del hidden"><del>} |
| 62 | end |
| 63 | |
| 64 | def before_modline(line) |
| 65 | # TODO: figure how we best display these |
| 66 | # %Q{<th class="line-numbers">#{line.number}</th>} + |
| 67 | # %Q{<td class="code changed mod">#{line}</td>} + |
| 68 | # %Q{<th class="line-numbers">#{line.number}</th>} + |
| 69 | # %Q{<td class="code changed mod">} |
| 70 | end |
| 71 | |
| 72 | def before_unmodline(line) |
| 73 | # unmods goes on both sides |
| 74 | %Q{<th class="line-numbers">#{line.number}</th>} + |
| 75 | %Q{<td class="code unchanged unmod">#{line}</td>} + |
| 76 | %Q{<th class="line-numbers">#{line.number}</th>} + |
| 77 | %Q{<td class="code unchanged unmod">} |
| 78 | end |
| 79 | |
| 80 | def before_sepline(line) |
| 81 | %Q{<th class="line-numbers line-num-cut">...</th>} + |
| 82 | %Q{<td class="code cut-line">...</td>} + |
| 83 | %Q{<th class="line-numbers line-num-cut">...</th>} + |
| 84 | %Q{<td class="code cut-line">} |
| 85 | end |
| 86 | |
| 87 | # After lines |
| 88 | def after_addline(line) |
| 89 | "</ins></td></tr>" |
| 90 | end |
| 91 | |
| 92 | def after_remline(line) |
| 93 | "</del></td></tr>" |
| 94 | end |
| 95 | |
| 96 | def after_modline(line) |
| 97 | # "</td></tr>" |
| 98 | end |
| 99 | |
| 100 | def after_unmodline(line) |
| 101 | "</td></tr>" |
| 102 | end |
| 103 | |
| 104 | def after_sepline(line) |
| 105 | "</td></tr>" |
| 106 | end |
| 107 | |
| 108 | def new_line |
| 109 | end |
| 110 | end |
| 111 | end |
| 112 | end |
| toggle raw diff |
--- /dev/null
+++ b/lib/gitorious/diff/sidebyside_table_callback.rb
@@ -0,0 +1,112 @@
+module Gitorious
+ module Diff
+ class SidebysideTableCallback
+
+ # Before blocks
+ def before_addblock(block)
+ "<tbody><tr>"
+ end
+
+ def before_remblock(block)
+ "<tbody><tr>"
+ end
+
+ def before_modblock(block)
+ "<tbody><tr>"
+ end
+
+ def before_unmodblock(block)
+ "<tbody><tr>"
+ end
+
+ def before_sepblock(block)
+ "<tbody><tr>"
+ end
+
+ # After blocks
+ def after_addblock(block)
+ "</tbody>"
+ end
+
+ def after_remblock(block)
+ "</tbody>"
+ end
+
+ def after_modblock(block)
+ # "</tbody>"
+ end
+
+ def after_unmodblock(block)
+ "</tbody>"
+ end
+
+ def after_sepblock(block)
+ "</body>"
+ end
+
+ # Before lines
+ def before_addline(line)
+ # adds go on the right
+ %Q{<th class="line-numbers">#{line.number}</th>} +
+ %Q{<td class="code ins"></td>} +
+ %Q{<th class="line-numbers">#{line.number}</th>} +
+ %Q{<td class="code ins"><ins>}
+ end
+
+ def before_remline(line)
+ # rems go on the left (hide the right side)
+ %Q{<th class="line-numbers">#{line.number}</th>} +
+ %Q{<td class="code del"><del>#{line}</del></td>} +
+ %Q{<th class="line-numbers">#{line.number}</th>} +
+ %Q{<td class="code del hidden"><del>}
+ end
+
+ def before_modline(line)
+ # TODO: figure how we best display these
+ # %Q{<th class="line-numbers">#{line.number}</th>} +
+ # %Q{<td class="code changed mod">#{line}</td>} +
+ # %Q{<th class="line-numbers">#{line.number}</th>} +
+ # %Q{<td class="code changed mod">}
+ end
+
+ def before_unmodline(line)
+ # unmods goes on both sides
+ %Q{<th class="line-numbers">#{line.number}</th>} +
+ %Q{<td class="code unchanged unmod">#{line}</td>} +
+ %Q{<th class="line-numbers">#{line.number}</th>} +
+ %Q{<td class="code unchanged unmod">}
+ end
+
+ def before_sepline(line)
+ %Q{<th class="line-numbers line-num-cut">...</th>} +
+ %Q{<td class="code cut-line">...</td>} +
+ %Q{<th class="line-numbers line-num-cut">...</th>} +
+ %Q{<td class="code cut-line">}
+ end
+
+ # After lines
+ def after_addline(line)
+ "</ins></td></tr>"
+ end
+
+ def after_remline(line)
+ "</del></td></tr>"
+ end
+
+ def after_modline(line)
+ # "</td></tr>"
+ end
+
+ def after_unmodline(line)
+ "</td></tr>"
+ end
+
+ def after_sepline(line)
+ "</td></tr>"
+ end
+
+ def new_line
+ end
+ end
+ end
+end
\ No newline at end of file |
| |   |
| 553 | 553 | |
| 554 | 554 | } |
| 555 | 555 | |
| 556 | | table tr td.line-numbers { |
| 556 | table tr .line-numbers { |
| 557 | 557 | text-align: right; |
| 558 | 558 | vertical-align: top; |
| 559 | 559 | background: #eee; |
| … | … | |
| 572 | 572 | font: 100%/110% "Courier New", Courier, monaco, monospace; |
| 573 | 573 | } |
| 574 | 574 | |
| 575 | table.sidebyside { |
| 576 | empty-cells: show; |
| 577 | table-layout: fixed; |
| 578 | } |
| 579 | table.sidebyside tr td.code { |
| 580 | white-space: normal; |
| 581 | } |
| 575 | 582 | |
| 576 | 583 | table.codediff { |
| 577 | 584 | border: 1px solid #ccc; |
| … | … | |
| 587 | 587 | font-family: monospace; |
| 588 | 588 | line-height: 90%; |
| 589 | 589 | } |
| 590 | | table.codediff td.line-num-cut { |
| 590 | table.codediff .line-num-cut { |
| 591 | 591 | background: #ccc; |
| 592 | 592 | border-top: 1px dashed #ccc; |
| 593 | 593 | border-bottom: 1px dashed #ccc; |
| 594 | 594 | } |
| 595 | | table.codediff thead td.line-numbers, table.codediff thead { background: #ddd; } |
| 595 | |
| 596 | table.codediff thead .line-numbers, table.codediff thead { background: #ddd; } |
| 596 | 597 | table.codediff td.code { padding-left: 2px; } |
| 597 | | table.codediff td.cut-line { |
| 598 | table.codediff .cut-line { |
| 598 | 599 | background: #eee; |
| 599 | 600 | border-top: 1px dashed #aaa; |
| 600 | 601 | border-bottom: 1px dashed #aaa; |
| 601 | 602 | } |
| 603 | table.codediff td.hidden del { display:none; } |
| 602 | 604 | table.codediff td.del { background: #fdd; } |
| 603 | 605 | table.codediff td.ins { background: #dfd; } |
| 604 | 606 | table.codediff td.del del { /*background: #fbb;*/ text-decoration: none; } |
| 605 | 607 | table.codediff td.ins ins { /*background: #afa;*/ text-decoration: none; } |
| 608 | table.codediff col.lines { |
| 609 | width: 3em; |
| 610 | } |
| toggle raw diff |
--- a/public/stylesheets/base.css
+++ b/public/stylesheets/base.css
@@ -553,7 +553,7 @@ div.comment p.byline {
}
-table tr td.line-numbers {
+table tr .line-numbers {
text-align: right;
vertical-align: top;
background: #eee;
@@ -572,6 +572,13 @@ table tr td.code {
font: 100%/110% "Courier New", Courier, monaco, monospace;
}
+table.sidebyside {
+ empty-cells: show;
+ table-layout: fixed;
+}
+table.sidebyside tr td.code {
+ white-space: normal;
+}
table.codediff {
border: 1px solid #ccc;
@@ -580,19 +587,24 @@ table.codediff {
font-family: monospace;
line-height: 90%;
}
-table.codediff td.line-num-cut {
+table.codediff .line-num-cut {
background: #ccc;
border-top: 1px dashed #ccc;
border-bottom: 1px dashed #ccc;
}
-table.codediff thead td.line-numbers, table.codediff thead { background: #ddd; }
+
+table.codediff thead .line-numbers, table.codediff thead { background: #ddd; }
table.codediff td.code { padding-left: 2px; }
-table.codediff td.cut-line {
+table.codediff .cut-line {
background: #eee;
border-top: 1px dashed #aaa;
border-bottom: 1px dashed #aaa;
}
+table.codediff td.hidden del { display:none; }
table.codediff td.del { background: #fdd; }
table.codediff td.ins { background: #dfd; }
table.codediff td.del del { /*background: #fbb;*/ text-decoration: none; }
table.codediff td.ins ins { /*background: #afa;*/ text-decoration: none; }
+table.codediff col.lines {
+ width: 3em;
+}
\ No newline at end of file |