summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarin Jankovski <marin@gitlab.com>2014-09-04 10:46:35 +0200
committerMarin Jankovski <marin@gitlab.com>2014-09-08 09:05:16 +0200
commit1067b00724c045b4fa46a9f8ff5acd09d65553e0 (patch)
treebaeba9612464d48a5ba59775c89587caef980ec9
parentb54f2393c3e952f8ff9f297b3c848c3c1cede1c9 (diff)
downloadgitlab-ce-1067b00724c045b4fa46a9f8ff5acd09d65553e0.tar.gz
Duplicate the behaviour and refactor for use with parallel diff.
-rw-r--r--app/helpers/commits_helper.rb7
-rw-r--r--app/views/projects/commits/_parallel_view.html.haml13
-rw-r--r--lib/gitlab/diff_parser.rb45
3 files changed, 59 insertions, 6 deletions
diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb
index f61aa259154..2c1df6beeab 100644
--- a/app/helpers/commits_helper.rb
+++ b/app/helpers/commits_helper.rb
@@ -23,6 +23,13 @@ module CommitsHelper
end
end
+ def side_diff_line(diff, index)
+ Gitlab::DiffParser.new(diff.diff.lines.to_a, diff.new_path)
+ .each_for_parallel do |full_line, type, line_code, line_new, line_old, next_line|
+ yield(full_line, type, line_code, line_new, line_old, next_line)
+ end
+ end
+
def each_diff_line_near(diff, index, expected_line_code)
max_number_of_lines = 16
diff --git a/app/views/projects/commits/_parallel_view.html.haml b/app/views/projects/commits/_parallel_view.html.haml
index 3bbe8b4baaf..e566b1dfca4 100644
--- a/app/views/projects/commits/_parallel_view.html.haml
+++ b/app/views/projects/commits/_parallel_view.html.haml
@@ -1,18 +1,19 @@
/ Side-by-side diff view
%div.text-file
%table
- - each_diff_line(diff, index) do |line, type, line_code, line_new, line_old, raw_line, e|
+ - side_diff_line(diff, index) do |line, type, line_code, line_new, line_old, next_line|
+ - next if type == 'new'
%tr.line_holder.parallel{ id: line_code, class: "#{type}" }
- if type != 'match'
%td.old_line
- = link_to raw(type == "new" ? "&nbsp;" : line_old), "##{line_code}", id: line_code
+ = link_to raw(line_old), "##{line_code}", id: line_code
- if type == 'old'
- %td.line_content{class: "parallel noteable_line old #{line_code}", "line_code" => line_code}= line
+ %td.line_content{class: "parallel noteable_line old #{line_code}", "line_code" => line_code}= raw line
- else
%td.line_content.parallel= line
%td.new_line{data: {linenumber: line_new}}
- = link_to raw(type == "old" ? "&nbsp;" : line_new) , "##{line_code}", id: line_code
- - if type == 'new'
- %td.line_content.parallel{class: "noteable_line #{type} #{line_code}", "line_code" => line_code}= line
+ = link_to raw(line_new) , "##{line_code}", id: line_code
+ - if type == 'old'
+ %td.line_content.parallel{class: "noteable_line new #{line_code}", "line_code" => line_code}= raw next_line
- else
%td.line_content.parallel= line
diff --git a/lib/gitlab/diff_parser.rb b/lib/gitlab/diff_parser.rb
index b244295027e..baec2e63baa 100644
--- a/lib/gitlab/diff_parser.rb
+++ b/lib/gitlab/diff_parser.rb
@@ -50,6 +50,51 @@ module Gitlab
end
end
+ def each_for_parallel
+ line_old = 1
+ line_new = 1
+ type = nil
+
+ lines_arr = ::Gitlab::InlineDiff.processing lines
+
+ lines_arr.each_cons(2) do |line, next_line|
+ raw_line = line.dup
+
+ next if filename?(line)
+
+ full_line = html_escape(line.gsub(/\n/, ''))
+ full_line = ::Gitlab::InlineDiff.replace_markers full_line
+
+ next_line = html_escape(next_line.gsub(/\n/, ''))
+ next_line = ::Gitlab::InlineDiff.replace_markers next_line
+
+ if line.match(/^@@ -/)
+ type = "match"
+
+ line_old = line.match(/\-[0-9]*/)[0].to_i.abs rescue 0
+ line_new = line.match(/\+[0-9]*/)[0].to_i.abs rescue 0
+
+ next if line_old == 1 && line_new == 1 #top of file
+ yield(full_line, type, nil, line_new, line_old)
+ next
+ else
+ type = identification_type(line)
+ line_code = generate_line_code(new_path, line_new, line_old)
+ yield(full_line, type, line_code, line_new, line_old, next_line)
+ end
+
+
+ if line[0] == "+"
+ line_new += 1
+ elsif line[0] == "-"
+ line_old += 1
+ else
+ line_new += 1
+ line_old += 1
+ end
+ end
+ end
+
def empty?
@lines.empty?
end