Auto-highlight conflict when rich_text is called

This commit is contained in:
Sean McGivern 2016-07-29 13:29:14 +01:00 committed by Fatih Acet
parent d77216356a
commit 7af277f683
4 changed files with 28 additions and 18 deletions

View file

@ -21,7 +21,8 @@ module Gitlab
def lines
@lines ||= Gitlab::Conflict::Parser.new.parse(merge_file_result[:data],
our_path: our_path,
their_path: their_path)
their_path: their_path,
parent: self)
end
def resolve!(resolution, index:, rugged:)
@ -57,27 +58,23 @@ module Gitlab
end.compact
end
def highlighted_lines
return @highlighted_lines if @highlighted_lines
def highlight_lines!
their_highlight = Gitlab::Highlight.highlight_lines(repository, their_ref, their_path)
our_highlight = Gitlab::Highlight.highlight_lines(repository, our_ref, our_path)
@highlighted_lines = lines.map do |line|
line = line.dup
lines.each do |line|
if line.type == 'old'
line.rich_text = their_highlight[line.old_line - 1]
else
line.rich_text = our_highlight[line.new_line - 1]
end
line
end
end
def sections
return @sections if @sections
chunked_lines = highlighted_lines.chunk { |line| line.type.nil? }
chunked_lines = lines.chunk { |line| line.type.nil? }
match_line = nil
@sections = chunked_lines.flat_map.with_index do |(no_conflict, lines), i|

View file

@ -7,7 +7,7 @@ module Gitlab
class MissingEndDelimiter < StandardError
end
def parse(text, our_path:, their_path:)
def parse(text, our_path:, their_path:, parent: nil)
return [] if text.blank?
line_obj_index = 0
@ -36,9 +36,9 @@ module Gitlab
type = nil
elsif line[0] == '\\'
type = 'nonewline'
lines << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new)
lines << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new, parent: parent)
else
lines << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new)
lines << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new, parent: parent)
line_old += 1 if type != 'new'
line_new += 1 if type != 'old'

View file

@ -2,12 +2,13 @@ module Gitlab
module Diff
class Line
attr_reader :type, :index, :old_pos, :new_pos
attr_writer :rich_text
attr_accessor :text
attr_accessor :rich_text
def initialize(text, type, index, old_pos, new_pos)
def initialize(text, type, index, old_pos, new_pos, parent: nil)
@text, @type, @index = text, type, index
@old_pos, @new_pos = old_pos, new_pos
@parent = parent
end
def self.init_from_hash(hash)
@ -44,6 +45,12 @@ module Gitlab
type == 'old'
end
def rich_text
@parent.highlight_lines! if @parent && !@rich_text
@rich_text
end
def meta?
type == 'match' || type == 'nonewline'
end

View file

@ -63,17 +63,23 @@ describe Gitlab::Conflict::File, lib: true do
end
end
describe '#highlighted_lines' do
describe '#highlight_lines!' do
def html_to_text(html)
CGI.unescapeHTML(ActionView::Base.full_sanitizer.sanitize(html)).delete("\n")
end
it 'returns lines with rich_text' do
expect(conflict_file.highlighted_lines).to all(have_attributes(rich_text: a_kind_of(String)))
it 'modifies the existing lines' do
expect { conflict_file.highlight_lines! }.to change { conflict_file.lines.map(&:instance_variables) }
end
it 'returns lines with rich_text matching the text content of the line' do
conflict_file.highlighted_lines.each do |line|
it 'is called implicitly when rich_text is accessed on a line' do
expect(conflict_file).to receive(:highlight_lines!).once.and_call_original
conflict_file.lines.each(&:rich_text)
end
it 'sets the rich_text of the lines matching the text content' do
conflict_file.lines.each do |line|
expect(line.text).to eq(html_to_text(line.rich_text))
end
end