diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-09-08 21:54:52 +0300 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-09-08 21:54:52 +0300 |
commit | 218219abbdfdc3bc0bc1a9c95cfc0e0ddb5861dd (patch) | |
tree | 42cbccd75357e44ad9895b59de76e9a56c03be4a /app/helpers/diff_helper.rb | |
parent | bde3f25d262b13d0139276786fe9d9cba29269b8 (diff) | |
download | gitlab-ce-218219abbdfdc3bc0bc1a9c95cfc0e0ddb5861dd.tar.gz |
Refactoring inside refactoring. We need to go deeper
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'app/helpers/diff_helper.rb')
-rw-r--r-- | app/helpers/diff_helper.rb | 69 |
1 files changed, 65 insertions, 4 deletions
diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index 7feb07eeb3b..c2a19e4ac10 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -1,16 +1,16 @@ module DiffHelper - def safe_diff_files(project, diffs) + def safe_diff_files(diffs) if diff_hard_limit_enabled? diffs.first(Commit::DIFF_HARD_LIMIT_FILES) else diffs.first(Commit::DIFF_SAFE_FILES) end.map do |diff| - Gitlab::Diff::File.new(project, @commit, diff) + Gitlab::Diff::File.new(diff) end end - def show_diff_size_warninig?(project, diffs) - safe_diff_files(project, diffs).size < diffs.size + def show_diff_size_warninig?(diffs) + safe_diff_files(diffs).size < diffs.size end def diff_hard_limit_enabled? @@ -21,4 +21,65 @@ 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, 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, 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, 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(" ") # 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, " ", type, line_new, full_line] + lines.push(line) + end + end + end + lines + end + end |