Commit ffbbd411 authored by Douwe Maan's avatar Douwe Maan

Move diffable? method from Repository to Diff::File

parent ba564a09
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
- elsif blob.truncated? - elsif blob.truncated?
.nothing-here-block The file could not be displayed because it is too large. .nothing-here-block The file could not be displayed because it is too large.
- elsif blob.readable_text? - elsif blob.readable_text?
- if !diff_file.repository.diffable?(blob) - if !diff_file.diffable?
.nothing-here-block This diff was suppressed by a .gitattributes entry. .nothing-here-block This diff was suppressed by a .gitattributes entry.
- elsif diff_file.collapsed? - elsif diff_file.collapsed?
- url = url_for(params.merge(action: :diff_for_path, old_path: diff_file.old_path, new_path: diff_file.new_path, file_identifier: diff_file.file_identifier)) - url = url_for(params.merge(action: :diff_for_path, old_path: diff_file.old_path, new_path: diff_file.new_path, file_identifier: diff_file.file_identifier))
......
...@@ -58,19 +58,19 @@ module Gitlab ...@@ -58,19 +58,19 @@ module Gitlab
diff_refs&.head_sha diff_refs&.head_sha
end end
def content_sha def new_content_sha
return old_content_sha if deleted_file? return if deleted_file?
return @content_sha if defined?(@content_sha) return @new_content_sha if defined?(@new_content_sha)
refs = diff_refs || fallback_diff_refs refs = diff_refs || fallback_diff_refs
@content_sha = refs&.head_sha @new_content_sha = refs&.head_sha
end end
def content_commit def new_content_commit
return @content_commit if defined?(@content_commit) return @new_content_commit if defined?(@new_content_commit)
sha = content_sha sha = new_content_commit
@content_commit = repository.commit(sha) if sha @new_content_commit = repository.commit(sha) if sha
end end
def old_content_sha def old_content_sha
...@@ -88,13 +88,13 @@ module Gitlab ...@@ -88,13 +88,13 @@ module Gitlab
@old_content_commit = repository.commit(sha) if sha @old_content_commit = repository.commit(sha) if sha
end end
def blob def new_blob
return @blob if defined?(@blob) return @new_blob if defined?(@new_blob)
sha = content_sha sha = new_content_sha
return @blob = nil unless sha return @new_blob = nil unless sha
repository.blob_at(sha, file_path) @new_blob = repository.blob_at(sha, file_path)
end end
def old_blob def old_blob
...@@ -106,6 +106,18 @@ module Gitlab ...@@ -106,6 +106,18 @@ module Gitlab
@old_blob = repository.blob_at(sha, old_path) @old_blob = repository.blob_at(sha, old_path)
end end
def content_sha
new_content_sha || old_content_sha
end
def content_commit
new_content_commit || old_content_commit
end
def blob
new_blob || old_blob
end
attr_writer :highlighted_diff_lines attr_writer :highlighted_diff_lines
# Array of Gitlab::Diff::Line objects # Array of Gitlab::Diff::Line objects
...@@ -153,6 +165,18 @@ module Gitlab ...@@ -153,6 +165,18 @@ module Gitlab
def file_identifier def file_identifier
"#{file_path}-#{new_file?}-#{deleted_file?}-#{renamed_file?}" "#{file_path}-#{new_file?}-#{deleted_file?}-#{renamed_file?}"
end end
def diffable?
repository.attributes(file_path).fetch('diff') { true }
end
def binary?
old_blob&.binary? || new_blob&.binary?
end
def text?
!binary?
end
end end
end end
end end
...@@ -66,10 +66,7 @@ module Gitlab ...@@ -66,10 +66,7 @@ module Gitlab
end end
def cacheable?(diff_file) def cacheable?(diff_file)
@merge_request_diff.present? && @merge_request_diff.present? && diff_file.text? && diff_file.diffable?
diff_file.blob &&
diff_file.blob.text? &&
@project.repository.diffable?(diff_file.blob)
end end
def cache_key def cache_key
......
...@@ -962,11 +962,6 @@ module Gitlab ...@@ -962,11 +962,6 @@ module Gitlab
end end
end end
# Checks if the blob should be diffable according to its attributes
def diffable?(blob)
attributes(blob.path).fetch('diff') { blob.text? }
end
# Returns the Git attributes for the given file path. # Returns the Git attributes for the given file path.
# #
# See `Gitlab::Git::Attributes` for more information. # See `Gitlab::Git::Attributes` for more information.
......
...@@ -5,15 +5,7 @@ describe Gitlab::Diff::FileCollection::MergeRequestDiff do ...@@ -5,15 +5,7 @@ describe Gitlab::Diff::FileCollection::MergeRequestDiff do
let(:diff_files) { described_class.new(merge_request.merge_request_diff, diff_options: nil).diff_files } let(:diff_files) { described_class.new(merge_request.merge_request_diff, diff_options: nil).diff_files }
it 'does not highlight binary files' do it 'does not highlight binary files' do
allow_any_instance_of(Gitlab::Diff::File).to receive(:blob).and_return(double("text?" => false)) allow_any_instance_of(Gitlab::Diff::File).to receive(:text?).and_return(false)
expect_any_instance_of(Gitlab::Diff::File).not_to receive(:highlighted_diff_lines)
diff_files
end
it 'does not highlight file if blob is not accessable' do
allow_any_instance_of(Gitlab::Diff::File).to receive(:blob).and_return(nil)
expect_any_instance_of(Gitlab::Diff::File).not_to receive(:highlighted_diff_lines) expect_any_instance_of(Gitlab::Diff::File).not_to receive(:highlighted_diff_lines)
...@@ -21,7 +13,7 @@ describe Gitlab::Diff::FileCollection::MergeRequestDiff do ...@@ -21,7 +13,7 @@ describe Gitlab::Diff::FileCollection::MergeRequestDiff do
end end
it 'does not files marked as undiffable in .gitattributes' do it 'does not files marked as undiffable in .gitattributes' do
allow_any_instance_of(Repository).to receive(:diffable?).and_return(false) allow_any_instance_of(Gitlab::Diff::File).to receive(:diffable?).and_return(false)
expect_any_instance_of(Gitlab::Diff::File).not_to receive(:highlighted_diff_lines) expect_any_instance_of(Gitlab::Diff::File).not_to receive(:highlighted_diff_lines)
......
...@@ -6,7 +6,7 @@ describe Gitlab::Diff::File, lib: true do ...@@ -6,7 +6,7 @@ describe Gitlab::Diff::File, lib: true do
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
let(:commit) { project.commit(sample_commit.id) } let(:commit) { project.commit(sample_commit.id) }
let(:diff) { commit.raw_diffs.first } let(:diff) { commit.raw_diffs.first }
let(:diff_file) { Gitlab::Diff::File.new(diff, diff_refs: commit.diff_refs, repository: project.repository) } let(:diff_file) { described_class.new(diff, diff_refs: commit.diff_refs, repository: project.repository) }
describe '#diff_lines' do describe '#diff_lines' do
let(:diff_lines) { diff_file.diff_lines } let(:diff_lines) { diff_file.diff_lines }
...@@ -63,11 +63,33 @@ describe Gitlab::Diff::File, lib: true do ...@@ -63,11 +63,33 @@ describe Gitlab::Diff::File, lib: true do
end end
end end
describe '#blob' do describe '#new_blob' do
it 'returns blob of new commit' do it 'returns blob of new commit' do
data = diff_file.blob.data data = diff_file.new_blob.data
expect(data).to include('raise RuntimeError, "System commands must be given as an array of strings"') expect(data).to include('raise RuntimeError, "System commands must be given as an array of strings"')
end end
end end
describe '#diffable?' do
let(:commit) { project.commit('1a0b36b3cdad1d2ee32457c102a8c0b7056fa863') }
let(:diffs) { commit.diffs }
before do
info_dir_path = File.join(project.repository.path_to_repo, 'info')
FileUtils.mkdir(info_dir_path) unless File.exist?(info_dir_path)
File.write(File.join(info_dir_path, 'attributes'), "*.md -diff\n")
end
it "returns true for files that do not have attributes" do
diff_file = diffs.diff_file_with_new_path('LICENSE')
expect(diff_file.diffable?).to be_truthy
end
it "returns false for files that have been marked as not being diffable in attributes" do
diff_file = diffs.diff_file_with_new_path('README.md')
expect(diff_file.diffable?).to be_falsey
end
end
end end
...@@ -1235,47 +1235,6 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -1235,47 +1235,6 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
end end
describe '#diffable' do
info_dir_path = attributes_path = File.join(SEED_STORAGE_PATH, TEST_REPO_PATH, 'info')
attributes_path = File.join(info_dir_path, 'attributes')
before(:all) do
FileUtils.mkdir(info_dir_path) unless File.exist?(info_dir_path)
File.write(attributes_path, "*.md -diff\n")
end
it "should return true for files which are text and do not have attributes" do
blob = Gitlab::Git::Blob.find(
repository,
'33bcff41c232a11727ac6d660bd4b0c2ba86d63d',
'LICENSE'
)
expect(repository.diffable?(blob)).to be_truthy
end
it "should return false for binary files which do not have attributes" do
blob = Gitlab::Git::Blob.find(
repository,
'33bcff41c232a11727ac6d660bd4b0c2ba86d63d',
'files/images/logo-white.png'
)
expect(repository.diffable?(blob)).to be_falsey
end
it "should return false for text files which have been marked as not being diffable in attributes" do
blob = Gitlab::Git::Blob.find(
repository,
'33bcff41c232a11727ac6d660bd4b0c2ba86d63d',
'README.md'
)
expect(repository.diffable?(blob)).to be_falsey
end
after(:all) do
FileUtils.rm_rf(info_dir_path)
end
end
describe '#tag_exists?' do describe '#tag_exists?' do
it 'returns true for an existing tag' do it 'returns true for an existing tag' do
tag = repository.tag_names.first tag = repository.tag_names.first
......
...@@ -10,8 +10,8 @@ describe MergeRequests::MergeRequestDiffCacheService do ...@@ -10,8 +10,8 @@ describe MergeRequests::MergeRequestDiffCacheService do
expect(Rails.cache).to receive(:read).with(cache_key).and_return({}) expect(Rails.cache).to receive(:read).with(cache_key).and_return({})
expect(Rails.cache).to receive(:write).with(cache_key, anything) expect(Rails.cache).to receive(:write).with(cache_key, anything)
allow_any_instance_of(Gitlab::Diff::File).to receive(:blob).and_return(double("text?" => true)) allow_any_instance_of(Gitlab::Diff::File).to receive(:text?).and_return(true)
allow_any_instance_of(Repository).to receive(:diffable?).and_return(true) allow_any_instance_of(Gitlab::Diff::File).to receive(:diffable?).and_return(true)
subject.execute(merge_request) subject.execute(merge_request)
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