summaryrefslogtreecommitdiff
path: root/lib/gitlab/diff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-03-05 00:09:24 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2021-03-05 00:09:24 +0000
commit7ff2de7c12d71873a3c0e85cc6fbcd5d5f05b5c1 (patch)
treef6b2dc4c2c294d21c99aba8011566d856648d84d /lib/gitlab/diff
parent6609e5ea75a9e119651e19574c30c11ce19c62d0 (diff)
downloadgitlab-ce-7ff2de7c12d71873a3c0e85cc6fbcd5d5f05b5c1.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/diff')
-rw-r--r--lib/gitlab/diff/inline_diff.rb48
-rw-r--r--lib/gitlab/diff/pair_selector.rb58
2 files changed, 60 insertions, 46 deletions
diff --git a/lib/gitlab/diff/inline_diff.rb b/lib/gitlab/diff/inline_diff.rb
index cf769262958..1d00f502d1c 100644
--- a/lib/gitlab/diff/inline_diff.rb
+++ b/lib/gitlab/diff/inline_diff.rb
@@ -3,22 +3,6 @@
module Gitlab
module Diff
class InlineDiff
- # Regex to find a run of deleted lines followed by the same number of added lines
- LINE_PAIRS_PATTERN = %r{
- # Runs start at the beginning of the string (the first line) or after a space (for an unchanged line)
- (?:\A|\s)
-
- # This matches a number of `-`s followed by the same number of `+`s through recursion
- (?<del_ins>
- -
- \g<del_ins>?
- \+
- )
-
- # Runs end at the end of the string (the last line) or before a space (for an unchanged line)
- (?=\s|\z)
- }x.freeze
-
attr_accessor :old_line, :new_line, :offset
def initialize(old_line, new_line, offset: 0)
@@ -40,11 +24,11 @@ module Gitlab
class << self
def for_lines(lines, project: nil)
- changed_line_pairs = find_changed_line_pairs(lines)
+ pair_selector = Gitlab::Diff::PairSelector.new(lines)
inline_diffs = []
- changed_line_pairs.each do |old_index, new_index|
+ pair_selector.each do |old_index, new_index|
old_line = lines[old_index]
new_line = lines[new_index]
@@ -56,34 +40,6 @@ module Gitlab
inline_diffs
end
-
- private
-
- # Finds pairs of old/new line pairs that represent the same line that changed
- # rubocop: disable CodeReuse/ActiveRecord
- def find_changed_line_pairs(lines)
- # Prefixes of all diff lines, indicating their types
- # For example: `" - + -+ ---+++ --+ -++"`
- line_prefixes = lines.each_with_object(+"") { |line, s| s << (line[0] || ' ') }.gsub(/[^ +-]/, ' ')
-
- changed_line_pairs = []
- line_prefixes.scan(LINE_PAIRS_PATTERN) do
- # For `"---+++"`, `begin_index == 0`, `end_index == 6`
- begin_index, end_index = Regexp.last_match.offset(:del_ins)
-
- # For `"---+++"`, `changed_line_count == 3`
- changed_line_count = (end_index - begin_index) / 2
-
- halfway_index = begin_index + changed_line_count
- (begin_index...halfway_index).each do |i|
- # For `"---+++"`, index 1 maps to 1 + 3 = 4
- changed_line_pairs << [i, i + changed_line_count]
- end
- end
-
- changed_line_pairs
- end
- # rubocop: enable CodeReuse/ActiveRecord
end
private
diff --git a/lib/gitlab/diff/pair_selector.rb b/lib/gitlab/diff/pair_selector.rb
new file mode 100644
index 00000000000..2e5ee3a7363
--- /dev/null
+++ b/lib/gitlab/diff/pair_selector.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Diff
+ class PairSelector
+ include Enumerable
+
+ # Regex to find a run of deleted lines followed by the same number of added lines
+ # rubocop: disable Lint/MixedRegexpCaptureTypes
+ LINE_PAIRS_PATTERN = %r{
+ # Runs start at the beginning of the string (the first line) or after a space (for an unchanged line)
+ (?:\A|\s)
+
+ # This matches a number of `-`s followed by the same number of `+`s through recursion
+ (?<del_ins>
+ -
+ \g<del_ins>?
+ \+
+ )
+
+ # Runs end at the end of the string (the last line) or before a space (for an unchanged line)
+ (?=\s|\z)
+ }x.freeze
+ # rubocop: enable Lint/MixedRegexpCaptureTypes
+
+ def initialize(lines)
+ @lines = lines
+ end
+
+ # Finds pairs of old/new line pairs that represent the same line that changed
+ # rubocop: disable CodeReuse/ActiveRecord
+ def each
+ # Prefixes of all diff lines, indicating their types
+ # For example: `" - + -+ ---+++ --+ -++"`
+ line_prefixes = lines.each_with_object(+"") { |line, s| s << (line[0] || ' ') }.gsub(/[^ +-]/, ' ')
+
+ line_prefixes.scan(LINE_PAIRS_PATTERN) do
+ # For `"---+++"`, `begin_index == 0`, `end_index == 6`
+ begin_index, end_index = Regexp.last_match.offset(:del_ins)
+
+ # For `"---+++"`, `changed_line_count == 3`
+ changed_line_count = (end_index - begin_index) / 2
+
+ halfway_index = begin_index + changed_line_count
+ (begin_index...halfway_index).each do |i|
+ # For `"---+++"`, index 1 maps to 1 + 3 = 4
+ yield [i, i + changed_line_count]
+ end
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ private
+
+ attr_reader :lines
+ end
+ end
+end