Commit a3bc77aebc3befa7a7756c52ddce7191baf36768

updated diff-display lib (technoweenie); fixes diff line numbering

Commit diff

lib/gitorious/diff/inline_table_callback.rb

 
33 class InlineTableCallback < BaseCallback
44 def addline(line)
55 %Q{<tr class="changes">} +
6 %Q{<td class="line-numbers">&nbsp;</td>} +
7 %Q{<td class="line-numbers">#{line.number}</td>} +
6 %Q{<td class="line-numbers">#{line.old_number}</td>} +
7 %Q{<td class="line-numbers">#{line.new_number}</td>} +
88 %Q{<td class="code ins"><ins>#{escape(line)}</ins></td></tr>}
99 end
1010
1111 def remline(line)
1212 %Q{<tr class="changes">} +
13 %Q{<td class="line-numbers">#{line.number}</td>} +
14 %Q{<td class="line-numbers">&nbsp;</td>} +
13 %Q{<td class="line-numbers">#{line.old_number}</td>} +
14 %Q{<td class="line-numbers">#{line.new_number}</td>} +
1515 %Q{<td class="code del"><del>#{escape(line)}</del></td></tr>}
1616 end
1717
1818 def modline(line)
1919 %Q{<tr class="changes">} +
20 %Q{<td class="line-numbers">&nbsp;</td>} +
21 %Q{<td class="line-numbers">#{line.number}</td>} +
20 %Q{<td class="line-numbers">#{line.old_number}</td>} +
21 %Q{<td class="line-numbers">#{line.new_number}</td>} +
2222 %Q{<td class="code unchanged mod">#{escape(line)}</td></tr>}
2323 end
2424
2525 def unmodline(line)
2626 %Q{<tr class="changes">} +
27 %Q{<td class="line-numbers">&nbsp;</td>} +
28 %Q{<td class="line-numbers">#{line.number}</td>} +
27 %Q{<td class="line-numbers">#{line.old_number}</td>} +
28 %Q{<td class="line-numbers">#{line.new_number}</td>} +
2929 %Q{<td class="code unchanged unmod">#{escape(line)}</td></tr>}
3030 end
3131
toggle raw diff

lib/gitorious/diff/sidebyside_table_callback.rb

 
4747 # Before lines
4848 def addline(line)
4949 # adds go on the right
50 %Q{<th class="line-numbers">#{line.number}</th>} +
50 %Q{<th class="line-numbers">#{line.old_number}</th>} +
5151 %Q{<td class="code ins"></td>} +
52 %Q{<th class="line-numbers">#{line.number}</th>} +
52 %Q{<th class="line-numbers">#{line.new_number}</th>} +
5353 %Q{<td class="code ins"><ins>#{escape(line)}</ins></td></tr>}
5454 end
5555
5656 def remline(line)
5757 # rems go on the left (hide the right side)
58 %Q{<th class="line-numbers">#{line.number}</th>} +
58 %Q{<th class="line-numbers">#{line.old_number}</th>} +
5959 %Q{<td class="code del"><del>#{CGI.escapeHTML(line)}</del></td>} +
60 %Q{<th class="line-numbers">#{line.number}</th>} +
60 %Q{<th class="line-numbers">#{line.new_number}</th>} +
6161 %Q{<td class="code del hidden"><del>#{escape(line)}</del></td></tr>}
6262 end
6363
6464 def modline(line)
6565 # TODO: figure how we best display these
66 # %Q{<th class="line-numbers">#{line.number}</th>} +
66 # %Q{<th class="line-numbers">#{line.old_number}</th>} +
6767 # %Q{<td class="code changed mod">#{CGI.escapeHTML(line)}</td>} +
68 # %Q{<th class="line-numbers">#{line.number}</th>} +
68 # %Q{<th class="line-numbers">#{line.new_number}</th>} +
6969 # %Q{<td class="code changed mod">#{escape(line)}</td></tr>}
7070 end
7171
7272 def unmodline(line)
7373 # unmods goes on both sides
74 %Q{<th class="line-numbers">#{line.number}</th>} +
74 %Q{<th class="line-numbers">#{line.old_number}</th>} +
7575 %Q{<td class="code unchanged unmod">#{escape(line)}</td>} +
76 %Q{<th class="line-numbers">#{line.number}</th>} +
76 %Q{<th class="line-numbers">#{line.new_number}</th>} +
7777 %Q{<td class="code unchanged unmod">#{escape(line)}</td></tr>}
7878 end
7979
toggle raw diff

vendor/diff-display/lib/diff/display/data_structure.rb

 
4242 RemLine.new(line, line_number)
4343 end
4444
45 def unmod(line, line_number)
46 UnModLine.new(line, line_number)
45 def unmod(line, old_number, new_number)
46 UnModLine.new(line, old_number, new_number)
4747 end
4848
4949 def header(line)
5151 end
5252 end
5353
54 def initialize(line, line_number)
54 def initialize(line, old_number = nil, new_number = nil)
5555 super(line)
56 @number = line_number
56 @old_number, @new_number = old_number, new_number
5757 end
58 attr_reader :number
58 attr_reader :old_number, :new_number
5959
6060 def inspect
61 %Q{#<#{self.class.name} [#{number.inspect}] "#{self}">}
61 %Q{#<#{self.class.name} [#{old_number.inspect}-#{new_number.inspect}] "#{self}">}
6262 end
6363 end
6464
6565 class AddLine < Line
6666 def initialize(line, line_number)
67 super(line, line_number)
67 super(line, nil, line_number)
6868 end
6969 end
7070
7171 class RemLine < Line
7272 def initialize(line, line_number)
73 super(line, line_number)
73 super(line, line_number, nil)
7474 end
7575 end
7676
7777 class UnModLine < Line
78 def initialize(line, line_number)
79 super(line, line_number)
78 def initialize(line, old_number, new_number)
79 super(line, old_number, new_number)
8080 end
8181 end
8282
8383 class SepLine < Line
8484 def initialize(line = '...')
85 super(line, nil)
85 super(line)
8686 end
8787 end
8888
8989 class HeaderLine < Line
9090 def initialize(line)
91 super(line, nil)
91 super(line)
9292 end
9393 end
9494
toggle raw diff

vendor/diff-display/lib/diff/display/unified/generator.rb

 
2727 @prev_buffer = []
2828 @line_type = nil
2929 @prev_line_type = nil
30 @offset_base = 0
31 @offset_changed = 0
30 @offset = [0, 0]
3231 @data = Data.new
3332 self
3433 end
5757 identify_block
5858 push Block.header
5959 current_block << Line.header(line)
60 add_separator unless @offset_changed.zero?
61 @line_type = nil
62 @offset_base = $1.to_i - 1
63 @offset_changed = $3.to_i - 1
60 add_separator unless @offset[0].zero?
61 @line_type = nil
62 @offset = Array.new(2) { $3.to_i - 1 }
6463 return
6564 end
6665
9494 end
9595
9696 def identify_block
97 if @prev_line_type.eql?(LINE_TYPES['-']) and @line_type.eql?(LINE_TYPES['+'])
98 process_block(:mod, true, true)
99 else
100 if LINE_TYPES.values.include?(@line_type)
101 process_block(@line_type, true)
102 end
97 if LINE_TYPES.values.include?(@line_type)
98 process_block(@line_type)
10399 end
104100
105101 @prev_line_type = nil
106102 end
107103
108 def process_block(diff_line_type, new = false, old = false)
104 def process_block(diff_line_type)
109105 push Block.send(diff_line_type)
110 # Mod block
111 if diff_line_type.eql?(:mod) && @prev_buffer.size && @buffer.size == 1
112 process_line(@prev_buffer.first, @buffer.first)
113 return
114 end
115 unroll_prev_buffer if old
116 unroll_buffer if new
117 end
118
119 # TODO Needs a better name...it does process a line (two in fact) but
120 # its primary function is to add a Rem and an Add pair which
121 # potentially have inline changes
122 def process_line(oldline, newline)
123 # -
124 current_block << Line.rem(oldline, @offset_base += 1)
125
126 # +
127 current_block << Line.add(newline, @offset_changed += 1)
106 unroll_buffer
128107 end
129108
130109 def add_separator
137137 @prev_buffer
138138 end
139139
140 def unroll_prev_buffer
141 return if @prev_buffer.empty?
142 @prev_buffer.each do |line|
143 @offset_base += 1
144 current_block << Line.send(@prev_line_type, line, @offset_base)
145 end
146 end
147
148140 def unroll_buffer
149141 return if @buffer.empty?
150142 @buffer.each do |line|
151 @offset_changed += 1
152 current_block << Line.send(@line_type, line, @offset_changed)
143 case @line_type
144 when :add
145 @offset[1] += 1
146 current_block << Line.send(@line_type, line, @offset[1])
147 when :rem
148 @offset[0] += 1
149 current_block << Line.send(@line_type, line, @offset[0])
150 when :unmod
151 @offset[0] += 1
152 @offset[1] += 1
153 current_block << Line.send(@line_type, line, *@offset)
154 end
153155 end
154156 end
155157
toggle raw diff

vendor/diff-display/spec/data_structure_spec.rb

 
1212 end
1313
1414 describe "Line" do
15 it "initializes with a line number" do
15 it "initializes with an old line number" do
1616 line = Diff::Display::Line.new("foo", 12)
17 line.number.should == 12
17 line.old_number.should == 12
18 end
19
20 it "initializes with numbers" do
21 line = Diff::Display::Line.new("foo", 12, 13)
22 line.old_number.should == 12
23 line.new_number.should == 13
1824 end
1925
2026 it "has a class method for creating an AddLine" do
3434 end
3535
3636 it "has a class method for creating a UnModLine" do
37 line = Diff::Display::Line.unmod("foo", 7)
37 line = Diff::Display::Line.unmod("foo", 7, 8)
3838 line.should be_instance_of(Diff::Display::UnModLine)
3939 end
4040
toggle raw diff

vendor/diff-display/spec/generator_spec.rb

 
3939 data.to_diff.should == diff_data.chomp
4040 end
4141
42 it "doesn't parse linenumbers that isn't part if the diff" do
43 diff_data = load_diff("pseudo_recursive")
44 data = Diff::Display::Unified::Generator.run(diff_data)
45 linenos = []
46 data.each{|blk| blk.each{|line| linenos << line.number } }
47 linenos.compact.should == (1..14).to_a
42 #it "doesn't parse linenumbers that isn't part if the diff" do
43 # line_numbers_for(:pseudo_recursive).compact.should == (1..14).to_a
44 #end
45 end
46
47 describe "line numbering" do
48 it "numbers correctly for multiple_adds_after_rem" do
49 line_numbers_for(:multiple_adds_after_rem).should == [
50 [193, 193],
51 [194, nil],
52 [nil, 194],
53 [nil, 195],
54 [nil, 196],
55 [nil, 197],
56 [nil, 198],
57 [195, 199]
58 ]
59 end
60
61 it "numbers correctly for simple" do
62 line_numbers_for(:simple).should == [
63 [1, 1],
64 [2, 2],
65 [3, nil],
66 [4, nil],
67 [nil, 3],
68 [nil, 4],
69 [nil, 5],
70 ]
4871 end
49
5072 end
51
73
74 def line_numbers_for(diff)
75 diff_data = load_diff(diff)
76 data = Diff::Display::Unified::Generator.run(diff_data)
77 linenos = []
78 data.each do |blk|
79 blk.each do |line|
80 next if line.class == Diff::Display::HeaderLine
81 linenos << [line.old_number, line.new_number]
82 end
83 end
84 linenos
85 end
5286end
toggle raw diff