Commit bb226a29 authored by Sean McGivern's avatar Sean McGivern

Ensure that we never assume old_blob or new_blob are nil

These can be a `BatchLoader` which is proxying a nil, while not being concrete
nils themselves.
parent 0b849e8d
---
title: Fix viewing diffs on old merge requests
merge_request: 17805
author:
type: fixed
......@@ -27,8 +27,8 @@ module Gitlab
@fallback_diff_refs = fallback_diff_refs
# Ensure items are collected in the the batch
new_blob
old_blob
new_blob_lazy
old_blob_lazy
end
def position(position_marker, position_type: :text)
......@@ -101,25 +101,19 @@ module Gitlab
end
def new_blob
return unless new_content_sha
Blob.lazy(repository.project, new_content_sha, file_path)
new_blob_lazy&.itself
end
def old_blob
return unless old_content_sha
Blob.lazy(repository.project, old_content_sha, old_path)
old_blob_lazy&.itself
end
def content_sha
new_content_sha || old_content_sha
end
# Use #itself to check the value wrapped by a BatchLoader instance, rather
# than if the BatchLoader instance itself is falsey.
def blob
new_blob&.itself || old_blob&.itself
new_blob || old_blob
end
attr_writer :highlighted_diff_lines
......@@ -237,17 +231,14 @@ module Gitlab
private
# The blob instances are instances of BatchLoader, which means calling
# &. directly on them won't work. Object#try also won't work, because Blob
# doesn't inherit from Object, but from BasicObject (via SimpleDelegator).
# We can't use Object#try because Blob doesn't inherit from Object, but
# from BasicObject (via SimpleDelegator).
def try_blobs(meth)
old_blob&.itself&.public_send(meth) || new_blob&.itself&.public_send(meth)
old_blob&.public_send(meth) || new_blob&.public_send(meth)
end
# We can't use #compact for the same reason we can't use &., but calling
# #nil? explicitly does work because it is proxied to the blob itself.
def valid_blobs
[old_blob, new_blob].reject(&:nil?)
[old_blob, new_blob].compact
end
def text_position_properties(line)
......@@ -262,6 +253,18 @@ module Gitlab
old_blob && new_blob && old_blob.id != new_blob.id
end
def new_blob_lazy
return unless new_content_sha
Blob.lazy(repository.project, new_content_sha, file_path)
end
def old_blob_lazy
return unless old_content_sha
Blob.lazy(repository.project, old_content_sha, old_path)
end
def simple_viewer_class
return DiffViewer::NotDiffable unless diffable?
......
......@@ -455,5 +455,17 @@ describe Gitlab::Diff::File do
expect(diff_file.size).to be_zero
end
end
describe '#different_type?' do
it 'returns false' do
expect(diff_file).not_to be_different_type
end
end
describe '#content_changed?' do
it 'returns false' do
expect(diff_file).not_to be_content_changed
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment