def diff_as_string(input_data_new, input_data_old)
encoding = pick_encoding input_data_new, input_data_old
output = matching_encoding("", encoding)
data_old = input_data_old.split(matching_encoding("\n", encoding)).map! { |e| e.chomp }
data_new = input_data_new.split(matching_encoding("\n", encoding)).map! { |e| e.chomp }
diffs = Diff::LCS.diff(data_old, data_new)
return output if diffs.empty?
oldhunk = hunk = nil
file_length_difference = 0
diffs.each do |piece|
begin
hunk = Diff::LCS::Hunk.new(
data_old, data_new, piece, context_lines, file_length_difference
)
file_length_difference = hunk.file_length_difference
next unless oldhunk
if (context_lines > 0) and hunk.overlaps?(oldhunk)
if hunk.respond_to?(:merge)
hunk.merge(oldhunk)
else
hunk.unshift(oldhunk)
end
else
output << matching_encoding(oldhunk.diff(format).to_s, encoding)
end
ensure
oldhunk = hunk
output << matching_encoding("\n", encoding)
end
end
output << matching_encoding(oldhunk.diff(format).to_s, encoding)
output << matching_encoding("\n", encoding)
color_diff output
rescue Encoding::CompatibilityError
if input_data_new.encoding != input_data_old.encoding
"Could not produce a diff because the encoding of the actual string (#{input_data_old.encoding}) "+
"differs from the encoding of the expected string (#{input_data_new.encoding})"
else
"Could not produce a diff because of the encoding of the string (#{input_data_old.encoding})"
end
end