Commit f32f04a5 authored by Ahmad Sherif's avatar Ahmad Sherif

Migrate Commit#uri_type to Gitaly

Closes gitaly#915
parent 74f2f9b3
...@@ -372,19 +372,19 @@ class Commit ...@@ -372,19 +372,19 @@ class Commit
# uri_type('doc/README.md') # => :blob # uri_type('doc/README.md') # => :blob
# uri_type('doc/logo.png') # => :raw # uri_type('doc/logo.png') # => :raw
# uri_type('doc/api') # => :tree # uri_type('doc/api') # => :tree
# uri_type('not/found') # => :nil # uri_type('not/found') # => nil
# #
# Returns a symbol # Returns a symbol
def uri_type(path) def uri_type(path)
entry = @raw.rugged_tree_entry(path) entry = @raw.tree_entry(path)
return unless entry
if entry[:type] == :blob if entry[:type] == :blob
blob = ::Blob.decorate(Gitlab::Git::Blob.new(name: entry[:name]), @project) blob = ::Blob.decorate(Gitlab::Git::Blob.new(name: entry[:name]), @project)
blob.image? || blob.video? ? :raw : :blob blob.image? || blob.video? ? :raw : :blob
else else
entry[:type] entry[:type]
end end
rescue Rugged::TreeError
nil
end end
def raw_diffs(*args) def raw_diffs(*args)
......
...@@ -436,6 +436,16 @@ module Gitlab ...@@ -436,6 +436,16 @@ module Gitlab
parent_ids.size > 1 parent_ids.size > 1
end 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 def to_gitaly_commit
return raw_commit if raw_commit.is_a?(Gitaly::GitCommit) return raw_commit if raw_commit.is_a?(Gitaly::GitCommit)
...@@ -450,11 +460,6 @@ module Gitlab ...@@ -450,11 +460,6 @@ module Gitlab
) )
end end
# Is this the same as Blob.find_entry_by_path ?
def rugged_tree_entry(path)
rugged_commit.tree.path(path)
end
private private
def init_from_hash(hash) def init_from_hash(hash)
...@@ -501,6 +506,28 @@ module Gitlab ...@@ -501,6 +506,28 @@ module Gitlab
SERIALIZE_KEYS SERIALIZE_KEYS
end 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) def gitaly_commit_author_from_rugged(author_or_committer)
Gitaly::CommitAuthor.new( Gitaly::CommitAuthor.new(
name: author_or_committer[:name].b, name: author_or_committer[:name].b,
......
...@@ -177,7 +177,7 @@ module Gitlab ...@@ -177,7 +177,7 @@ module Gitlab
response = GitalyClient.call(@repository.storage, :commit_service, :list_commits_by_oid, request, timeout: GitalyClient.medium_timeout) response = GitalyClient.call(@repository.storage, :commit_service, :list_commits_by_oid, request, timeout: GitalyClient.medium_timeout)
consume_commits_response(response) 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 end
......
...@@ -439,15 +439,25 @@ eos ...@@ -439,15 +439,25 @@ eos
end end
describe '#uri_type' do describe '#uri_type' do
it 'returns the URI type at the given path' do shared_examples 'URI type' do
expect(commit.uri_type('files/html')).to be(:tree) it 'returns the URI type at the given path' do
expect(commit.uri_type('files/images/logo-black.png')).to be(:raw) expect(commit.uri_type('files/html')).to be(:tree)
expect(project.commit('video').uri_type('files/videos/intro.mp4')).to be(:raw) expect(commit.uri_type('files/images/logo-black.png')).to be(:raw)
expect(commit.uri_type('files/js/application.js')).to be(:blob) expect(project.commit('video').uri_type('files/videos/intro.mp4')).to be(:raw)
expect(commit.uri_type('files/js/application.js')).to be(:blob)
end
it "returns nil if the path doesn't exists" do
expect(commit.uri_type('this/path/doesnt/exist')).to be_nil
end
end
context 'when Gitaly commit_tree_entry feature is enabled' do
it_behaves_like 'URI type'
end end
it "returns nil if the path doesn't exists" do context 'when Gitaly commit_tree_entry feature is disabled', :disable_gitaly do
expect(commit.uri_type('this/path/doesnt/exist')).to be_nil it_behaves_like 'URI type'
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