summaryrefslogtreecommitdiff
path: root/app/helpers/diff_helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/helpers/diff_helper.rb')
-rw-r--r--app/helpers/diff_helper.rb88
1 files changed, 83 insertions, 5 deletions
diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb
index ee4d4fbdff5..afe7447d4e2 100644
--- a/app/helpers/diff_helper.rb
+++ b/app/helpers/diff_helper.rb
@@ -1,14 +1,20 @@
module DiffHelper
- def safe_diff_files(diffs)
+ def allowed_diff_size
if diff_hard_limit_enabled?
- diffs.first(Commit::DIFF_HARD_LIMIT_FILES)
+ Commit::DIFF_HARD_LIMIT_FILES
else
- diffs.first(Commit::DIFF_SAFE_FILES)
+ Commit::DIFF_SAFE_FILES
+ end
+ end
+
+ def safe_diff_files(diffs)
+ diffs.first(allowed_diff_size).map do |diff|
+ Gitlab::Diff::File.new(diff)
end
end
- def show_diff_size_warninig?(diffs)
- safe_diff_files(diffs).size < diffs.size
+ def show_diff_size_warning?(diffs)
+ diffs.size > allowed_diff_size
end
def diff_hard_limit_enabled?
@@ -19,4 +25,76 @@ module DiffHelper
false
end
end
+
+ def generate_line_code(file_path, line)
+ Gitlab::Diff::LineCode.generate(file_path, line.new_pos, line.old_pos)
+ end
+
+ def parallel_diff(diff_file, index)
+ lines = []
+ skip_next = false
+
+ # Building array of lines
+ #
+ # [left_type, left_line_number, left_line_content, line_code, right_line_type, right_line_number, right_line_content]
+ #
+ diff_file.diff_lines.each do |line|
+
+ full_line = line.text
+ type = line.type
+ line_code = generate_line_code(diff_file.file_path, line)
+ line_new = line.new_pos
+ line_old = line.old_pos
+
+ next_line = diff_file.next_line(line.index)
+
+ if next_line
+ next_type = next_line.type
+ next_line = next_line.text
+ end
+
+ line = [type, line_old, full_line, line_code, next_type, line_new]
+ if type == 'match' || type.nil?
+ # line in the right panel is the same as in the left one
+ line = [type, line_old, full_line, line_code, type, line_new, full_line]
+ lines.push(line)
+ elsif type == 'old'
+ if next_type == 'new'
+ # Left side has text removed, right side has text added
+ line.push(next_line)
+ lines.push(line)
+ skip_next = true
+ elsif next_type == 'old' || next_type.nil?
+ # Left side has text removed, right side doesn't have any change
+ line.pop # remove the newline
+ line.push(nil) # no line number on the right panel
+ line.push("&nbsp;") # empty line on the right panel
+ lines.push(line)
+ end
+ elsif type == 'new'
+ if skip_next
+ # Change has been already included in previous line so no need to do it again
+ skip_next = false
+ next
+ else
+ # Change is only on the right side, left side has no change
+ line = [nil, nil, "&nbsp;", line_code, type, line_new, full_line]
+ lines.push(line)
+ end
+ end
+ end
+ lines
+ end
+
+ def unfold_bottom_class(bottom)
+ (bottom) ? 'js-unfold-bottom' : ''
+ end
+
+ def diff_line_content(line)
+ if line.blank?
+ " &nbsp;"
+ else
+ line
+ end
+ end
end