Commit 9b0ef155 authored by Robert Speicher's avatar Robert Speicher

Merge branch 'better-parallel-diff' into 'master'

Actually render old and new sections of parallel diff next to each other

See merge request !5173
parents b8f67b4d 545a85dc
...@@ -48,6 +48,7 @@ v 8.10.0 (unreleased) ...@@ -48,6 +48,7 @@ v 8.10.0 (unreleased)
- Fix user creation with stronger minimum password requirements !4054 (nathan-pmt) - Fix user creation with stronger minimum password requirements !4054 (nathan-pmt)
- Only show New Snippet button to users that can create snippets. - Only show New Snippet button to users that can create snippets.
- PipelinesFinder uses git cache data - PipelinesFinder uses git cache data
- Actually render old and new sections of parallel diff next to each other
- Throttle the update of `project.pushes_since_gc` to 1 minute. - Throttle the update of `project.pushes_since_gc` to 1 minute.
- Allow expanding and collapsing files in diff view (!4990) - Allow expanding and collapsing files in diff view (!4990)
- Collapse large diffs by default (!4990) - Collapse large diffs by default (!4990)
......
...@@ -8,95 +8,78 @@ module Gitlab ...@@ -8,95 +8,78 @@ module Gitlab
end end
def parallelize def parallelize
lines = []
skip_next = false
i = 0
free_right_index = nil
lines = []
highlighted_diff_lines = diff_file.highlighted_diff_lines highlighted_diff_lines = diff_file.highlighted_diff_lines
highlighted_diff_lines.each do |line| highlighted_diff_lines.each do |line|
full_line = line.text
type = line.type
line_code = diff_file.line_code(line) line_code = diff_file.line_code(line)
line_new = line.new_pos
line_old = line.old_pos
position = diff_file.position(line) position = diff_file.position(line)
next_line = diff_file.next_line(line.index) case line.type
if next_line
next_line = highlighted_diff_lines[next_line.index]
full_next_line = next_line.text
next_line_code = diff_file.line_code(next_line)
next_type = next_line.type
next_position = diff_file.position(next_line)
end
case type
when 'match', nil when 'match', nil
# line in the right panel is the same as in the left one # line in the right panel is the same as in the left one
lines << { lines << {
left: { left: {
type: type, type: line.type,
number: line_old, number: line.old_pos,
text: full_line, text: line.text,
line_code: line_code, line_code: line_code,
position: position position: position
}, },
right: { right: {
type: type, type: line.type,
number: line_new, number: line.new_pos,
text: full_line, text: line.text,
line_code: line_code, line_code: line_code,
position: position position: position
} }
} }
free_right_index = nil
i += 1
when 'old' when 'old'
case next_type lines << {
when 'new' left: {
# Left side has text removed, right side has text added type: line.type,
lines << { number: line.old_pos,
left: { text: line.text,
type: type, line_code: line_code,
number: line_old, position: position
text: full_line, },
line_code: line_code, right: {
position: position type: nil,
}, number: nil,
right: { text: "",
type: next_type, line_code: line_code,
number: line_new, position: position
text: full_next_line,
line_code: next_line_code,
position: next_position,
}
}
skip_next = true
when 'old', 'nonewline', nil
# Left side has text removed, right side doesn't have any change
# No next line code, no new line number, no new line text
lines << {
left: {
type: type,
number: line_old,
text: full_line,
line_code: line_code,
position: position
},
right: {
type: next_type,
number: nil,
text: "",
line_code: nil,
position: nil
}
} }
end }
# Once we come upon a new line it can be put on the right of this old line
free_right_index ||= i
i += 1
when 'new' when 'new'
if skip_next data = {
# Change has been already included in previous line so no need to do it again type: line.type,
skip_next = false number: line.new_pos,
next text: line.text,
line_code: line_code,
position: position
}
if free_right_index
# If an old line came before this without a line on the right, this
# line can be put to the right of it.
lines[free_right_index][:right] = data
# If there are any other old lines on the left that don't yet have
# a new counterpart on the right, update the free_right_index
next_free_right_index = free_right_index + 1
free_right_index = next_free_right_index < i ? next_free_right_index : nil
else else
# Change is only on the right side, left side has no change
lines << { lines << {
left: { left: {
type: nil, type: nil,
...@@ -105,17 +88,15 @@ module Gitlab ...@@ -105,17 +88,15 @@ module Gitlab
line_code: line_code, line_code: line_code,
position: position position: position
}, },
right: { right: data
type: type,
number: line_new,
text: full_line,
line_code: line_code,
position: position
}
} }
free_right_index = nil
i += 1
end end
end end
end end
lines lines
end end
end end
......
...@@ -252,27 +252,6 @@ ...@@ -252,27 +252,6 @@
:base_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 :base_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9
:start_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 :start_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9
:head_sha: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d :head_sha: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
:right:
:type: old
:number:
:text: ''
:line_code:
:position:
- :left:
:type: old
:number: 14
:text: |
-<span id="LC14" class="line"> <span class="n">options</span> <span class="o">=</span> <span class="p">{</span> <span class="ss">chdir: </span><span class="n">path</span> <span class="p">}</span></span>
:line_code: 2f6fcd96b88b36ce98c38da085c795a27d92a3dd_14_13
:position: !ruby/object:Gitlab::Diff::Position
attributes:
:old_path: files/ruby/popen.rb
:new_path: files/ruby/popen.rb
:old_line: 14
:new_line:
:base_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9
:start_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9
:head_sha: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
:right: :right:
:type: new :type: new
:number: 13 :number: 13
...@@ -289,16 +268,17 @@ ...@@ -289,16 +268,17 @@
:start_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 :start_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9
:head_sha: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d :head_sha: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
- :left: - :left:
:type: :type: old
:number: :number: 14
:text: '' :text: |
:line_code: 2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14 -<span id="LC14" class="line"> <span class="n">options</span> <span class="o">=</span> <span class="p">{</span> <span class="ss">chdir: </span><span class="n">path</span> <span class="p">}</span></span>
:line_code: 2f6fcd96b88b36ce98c38da085c795a27d92a3dd_14_13
:position: !ruby/object:Gitlab::Diff::Position :position: !ruby/object:Gitlab::Diff::Position
attributes: attributes:
:old_path: files/ruby/popen.rb :old_path: files/ruby/popen.rb
:new_path: files/ruby/popen.rb :new_path: files/ruby/popen.rb
:old_line: :old_line: 14
:new_line: 14 :new_line:
:base_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 :base_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9
:start_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 :start_sha: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9
:head_sha: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d :head_sha: 570e7b2abdd848b95f2f578043fc23bd6f6fd24d
......
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