diff options
author | Sean McGivern <sean@gitlab.com> | 2017-08-22 16:27:09 +0100 |
---|---|---|
committer | Sean McGivern <sean@gitlab.com> | 2017-08-23 12:45:52 +0100 |
commit | 3d7bce9162e9ae58f7e5df0c87196a729db4e853 (patch) | |
tree | 39baf5ee0821fa4b39eb1139ffe41d248c2e124c | |
parent | b0f09406f50882c7e085c2a9b853be5dcf3d79dd (diff) | |
download | gitlab-ce-fix-old-mr-diffs.tar.gz |
Show un-highlighted diffs when blobs are the samefix-old-mr-diffs
For some old merge requests, we don't have enough information to figure out the
old blob and the new blob for the file. This means that we can't highlight the
diff correctly, but we can still display it without highlighting.
-rw-r--r-- | changelogs/unreleased/fix-old-mr-diffs.yml | 6 | ||||
-rw-r--r-- | lib/gitlab/diff/file.rb | 9 | ||||
-rw-r--r-- | spec/lib/gitlab/diff/file_spec.rb | 44 |
3 files changed, 54 insertions, 5 deletions
diff --git a/changelogs/unreleased/fix-old-mr-diffs.yml b/changelogs/unreleased/fix-old-mr-diffs.yml new file mode 100644 index 00000000000..b0a011cf354 --- /dev/null +++ b/changelogs/unreleased/fix-old-mr-diffs.yml @@ -0,0 +1,6 @@ +--- +title: Show un-highlighted text diffs when we do not have references to the correct + blobs +merge_request: +author: +type: fixed diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb index 17a9ec01637..29a4f0eff4e 100644 --- a/lib/gitlab/diff/file.rb +++ b/lib/gitlab/diff/file.rb @@ -186,7 +186,10 @@ module Gitlab end def content_changed? - old_blob && new_blob && old_blob.id != new_blob.id + return true if blobs_changed? + return false if new_file? || deleted_file? || renamed_file? + + text? && diff_lines.any? end def different_type? @@ -225,6 +228,10 @@ module Gitlab private + def blobs_changed? + old_blob && new_blob && old_blob.id != new_blob.id + end + def simple_viewer_class return DiffViewer::NotDiffable unless diffable? diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb index ab60d62d88e..21073533620 100644 --- a/spec/lib/gitlab/diff/file_spec.rb +++ b/spec/lib/gitlab/diff/file_spec.rb @@ -15,6 +15,17 @@ describe Gitlab::Diff::File do it { expect(diff_lines.first).to be_kind_of(Gitlab::Diff::Line) } end + describe '#highlighted_diff_lines' do + it 'highlights the diff and memoises the result' do + expect(Gitlab::Diff::Highlight).to receive(:new) + .with(diff_file, repository: project.repository) + .once + .and_call_original + + diff_file.highlighted_diff_lines + end + end + describe '#mode_changed?' do it { expect(diff_file.mode_changed?).to be_falsey } end @@ -122,8 +133,20 @@ describe Gitlab::Diff::File do let(:commit) { project.commit('2f63565e7aac07bcdadb654e253078b727143ec4') } let(:diff_file) { commit.diffs.diff_file_with_new_path('files/images/6049019_460s.jpg') } - it 'returns true' do - expect(diff_file.content_changed?).to be_truthy + context 'when the blobs are different' do + it 'returns true' do + expect(diff_file.content_changed?).to be_truthy + end + end + + context 'when the blobs are the same' do + before do + allow(diff_file).to receive(:old_blob).and_return(diff_file.new_blob) + end + + it 'returns false' do + expect(diff_file.content_changed?).to be_falsey + end end end @@ -131,8 +154,20 @@ describe Gitlab::Diff::File do let(:commit) { project.commit('570e7b2abdd848b95f2f578043fc23bd6f6fd24d') } let(:diff_file) { commit.diffs.diff_file_with_new_path('files/ruby/popen.rb') } - it 'returns true' do - expect(diff_file.content_changed?).to be_truthy + context 'when the blobs are different' do + it 'returns true' do + expect(diff_file.content_changed?).to be_truthy + end + end + + context 'when the blobs are the same' do + before do + allow(diff_file).to receive(:old_blob).and_return(diff_file.new_blob) + end + + it 'returns true' do + expect(diff_file.content_changed?).to be_truthy + end end end end @@ -278,6 +313,7 @@ describe Gitlab::Diff::File do allow(diff_file).to receive(:deleted_file?).and_return(false) allow(diff_file).to receive(:renamed_file?).and_return(false) allow(diff_file).to receive(:mode_changed?).and_return(false) + allow(diff_file).to receive(:raw_text?).and_return(false) end it 'returns a No Preview viewer' do |