Migrate Commit#uri_type to Gitaly
Closes gitaly#915
This commit is contained in:
parent
74f2f9b30f
commit
f32f04a50f
5 changed files with 55 additions and 18 deletions
|
@ -1 +1 @@
|
|||
0.67.0
|
||||
0.69.0
|
||||
|
|
|
@ -372,19 +372,19 @@ class Commit
|
|||
# uri_type('doc/README.md') # => :blob
|
||||
# uri_type('doc/logo.png') # => :raw
|
||||
# uri_type('doc/api') # => :tree
|
||||
# uri_type('not/found') # => :nil
|
||||
# uri_type('not/found') # => nil
|
||||
#
|
||||
# Returns a symbol
|
||||
def uri_type(path)
|
||||
entry = @raw.rugged_tree_entry(path)
|
||||
entry = @raw.tree_entry(path)
|
||||
return unless entry
|
||||
|
||||
if entry[:type] == :blob
|
||||
blob = ::Blob.decorate(Gitlab::Git::Blob.new(name: entry[:name]), @project)
|
||||
blob.image? || blob.video? ? :raw : :blob
|
||||
else
|
||||
entry[:type]
|
||||
end
|
||||
rescue Rugged::TreeError
|
||||
nil
|
||||
end
|
||||
|
||||
def raw_diffs(*args)
|
||||
|
|
|
@ -436,6 +436,16 @@ module Gitlab
|
|||
parent_ids.size > 1
|
||||
end
|
||||
|
||||
def tree_entry(path)
|
||||
@repository.gitaly_migrate(:commit_tree_entry) do |is_migrated|
|
||||
if is_migrated
|
||||
gitaly_tree_entry(path)
|
||||
else
|
||||
rugged_tree_entry(path)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def to_gitaly_commit
|
||||
return raw_commit if raw_commit.is_a?(Gitaly::GitCommit)
|
||||
|
||||
|
@ -450,11 +460,6 @@ module Gitlab
|
|||
)
|
||||
end
|
||||
|
||||
# Is this the same as Blob.find_entry_by_path ?
|
||||
def rugged_tree_entry(path)
|
||||
rugged_commit.tree.path(path)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def init_from_hash(hash)
|
||||
|
@ -501,6 +506,28 @@ module Gitlab
|
|||
SERIALIZE_KEYS
|
||||
end
|
||||
|
||||
def gitaly_tree_entry(path)
|
||||
# We're only interested in metadata, so limit actual data to 1 byte
|
||||
# since Gitaly doesn't support "send no data" option.
|
||||
entry = @repository.gitaly_commit_client.tree_entry(id, path, 1)
|
||||
return unless entry
|
||||
|
||||
# To be compatible with the rugged format
|
||||
entry = entry.to_h
|
||||
entry.delete(:data)
|
||||
entry[:name] = File.basename(path)
|
||||
entry[:type] = entry[:type].downcase
|
||||
|
||||
entry
|
||||
end
|
||||
|
||||
# Is this the same as Blob.find_entry_by_path ?
|
||||
def rugged_tree_entry(path)
|
||||
rugged_commit.tree.path(path)
|
||||
rescue Rugged::TreeError
|
||||
nil
|
||||
end
|
||||
|
||||
def gitaly_commit_author_from_rugged(author_or_committer)
|
||||
Gitaly::CommitAuthor.new(
|
||||
name: author_or_committer[:name].b,
|
||||
|
|
|
@ -177,7 +177,7 @@ module Gitlab
|
|||
|
||||
response = GitalyClient.call(@repository.storage, :commit_service, :list_commits_by_oid, request, timeout: GitalyClient.medium_timeout)
|
||||
consume_commits_response(response)
|
||||
rescue GRPC::Unknown # If no repository is found, happens mainly during testing
|
||||
rescue GRPC::NotFound # If no repository is found, happens mainly during testing
|
||||
[]
|
||||
end
|
||||
|
||||
|
|
|
@ -439,6 +439,7 @@ eos
|
|||
end
|
||||
|
||||
describe '#uri_type' do
|
||||
shared_examples 'URI type' do
|
||||
it 'returns the URI type at the given path' do
|
||||
expect(commit.uri_type('files/html')).to be(:tree)
|
||||
expect(commit.uri_type('files/images/logo-black.png')).to be(:raw)
|
||||
|
@ -451,6 +452,15 @@ eos
|
|||
end
|
||||
end
|
||||
|
||||
context 'when Gitaly commit_tree_entry feature is enabled' do
|
||||
it_behaves_like 'URI type'
|
||||
end
|
||||
|
||||
context 'when Gitaly commit_tree_entry feature is disabled', :disable_gitaly do
|
||||
it_behaves_like 'URI type'
|
||||
end
|
||||
end
|
||||
|
||||
describe '.from_hash' do
|
||||
let(:new_commit) { described_class.from_hash(commit.to_hash, project) }
|
||||
|
||||
|
|
Loading…
Reference in a new issue