Commit 8efc8841 authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'gitaly-tree-entries' into 'master'

Incorporate CommitService.GetTreeEntries Gitaly call

Closes gitaly#372

See merge request !12941
parents 60b28e7c 9eb5cdd7
...@@ -17,30 +17,13 @@ module Gitlab ...@@ -17,30 +17,13 @@ module Gitlab
def where(repository, sha, path = nil) def where(repository, sha, path = nil)
path = nil if path == '' || path == '/' path = nil if path == '' || path == '/'
commit = repository.lookup(sha) Gitlab::GitalyClient.migrate(:tree_entries) do |is_enabled|
root_tree = commit.tree if is_enabled
client = Gitlab::GitalyClient::CommitService.new(repository)
tree = if path client.tree_entries(repository, sha, path)
id = find_id_by_path(repository, root_tree.oid, path) else
if id tree_entries_from_rugged(repository, sha, path)
repository.lookup(id) end
else
[]
end
else
root_tree
end
tree.map do |entry|
new(
id: entry[:oid],
root_id: root_tree.oid,
name: entry[:name],
type: entry[:type],
mode: entry[:filemode].to_s(8),
path: path ? File.join(path, entry[:name]) : entry[:name],
commit_id: sha
)
end end
end end
...@@ -74,6 +57,34 @@ module Gitlab ...@@ -74,6 +57,34 @@ module Gitlab
entry[:oid] entry[:oid]
end end
end end
def tree_entries_from_rugged(repository, sha, path)
commit = repository.lookup(sha)
root_tree = commit.tree
tree = if path
id = find_id_by_path(repository, root_tree.oid, path)
if id
repository.lookup(id)
else
[]
end
else
root_tree
end
tree.map do |entry|
new(
id: entry[:oid],
root_id: root_tree.oid,
name: entry[:name],
type: entry[:type],
mode: entry[:filemode].to_s(8),
path: path ? File.join(path, entry[:name]) : entry[:name],
commit_id: sha
)
end
end
end end
def initialize(options) def initialize(options)
......
...@@ -60,6 +60,31 @@ module Gitlab ...@@ -60,6 +60,31 @@ module Gitlab
entry entry
end end
def tree_entries(repository, revision, path)
request = Gitaly::GetTreeEntriesRequest.new(
repository: @gitaly_repo,
revision: revision,
path: path.presence || '.'
)
response = GitalyClient.call(@repository.storage, :commit_service, :get_tree_entries, request)
response.flat_map do |message|
message.entries.map do |gitaly_tree_entry|
entry_path = gitaly_tree_entry.path.dup
Gitlab::Git::Tree.new(
id: gitaly_tree_entry.oid,
root_id: gitaly_tree_entry.root_oid,
type: gitaly_tree_entry.type.downcase,
mode: gitaly_tree_entry.mode.to_s(8),
name: File.basename(entry_path),
path: entry_path,
commit_id: gitaly_tree_entry.commit_oid
)
end
end
end
def commit_count(ref) def commit_count(ref)
request = Gitaly::CountCommitsRequest.new( request = Gitaly::CountCommitsRequest.new(
repository: @gitaly_repo, repository: @gitaly_repo,
......
require "spec_helper" require "spec_helper"
describe Gitlab::Git::Tree, seed_helper: true do describe Gitlab::Git::Tree, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
context :repo do context :repo do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
let(:tree) { Gitlab::Git::Tree.where(repository, SeedRepo::Commit::ID) } let(:tree) { Gitlab::Git::Tree.where(repository, SeedRepo::Commit::ID) }
it { expect(tree).to be_kind_of Array } it { expect(tree).to be_kind_of Array }
...@@ -74,4 +75,24 @@ describe Gitlab::Git::Tree, seed_helper: true do ...@@ -74,4 +75,24 @@ describe Gitlab::Git::Tree, seed_helper: true do
it { expect(submodule.name).to eq('gitlab-shell') } it { expect(submodule.name).to eq('gitlab-shell') }
end end
end end
describe '#where' do
context 'with gitaly disabled' do
before do
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).and_return(false)
end
it 'calls #tree_entries_from_rugged' do
expect(described_class).to receive(:tree_entries_from_rugged)
described_class.where(repository, SeedRepo::Commit::ID, '/')
end
end
it 'gets the tree entries from GitalyClient' do
expect_any_instance_of(Gitlab::GitalyClient::CommitService).to receive(:tree_entries)
described_class.where(repository, SeedRepo::Commit::ID, '/')
end
end
end end
...@@ -2,9 +2,13 @@ require 'spec_helper' ...@@ -2,9 +2,13 @@ require 'spec_helper'
describe Gitlab::GitalyClient::CommitService do describe Gitlab::GitalyClient::CommitService do
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
let(:storage_name) { project.repository_storage }
let(:relative_path) { project.path_with_namespace + '.git' }
let(:repository) { project.repository } let(:repository) { project.repository }
let(:repository_message) { repository.gitaly_repository } let(:repository_message) { repository.gitaly_repository }
let(:commit) { project.commit('913c66a37b4a45b9769037c55c2d238bd0942d2e') } let(:revision) { '913c66a37b4a45b9769037c55c2d238bd0942d2e' }
let(:commit) { project.commit(revision) }
let(:client) { described_class.new(repository) }
describe '#diff_from_parent' do describe '#diff_from_parent' do
context 'when a commit has a parent' do context 'when a commit has a parent' do
...@@ -20,7 +24,7 @@ describe Gitlab::GitalyClient::CommitService do ...@@ -20,7 +24,7 @@ describe Gitlab::GitalyClient::CommitService do
expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_diff).with(request, kind_of(Hash)) expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_diff).with(request, kind_of(Hash))
described_class.new(repository).diff_from_parent(commit) client.diff_from_parent(commit)
end end
end end
...@@ -38,12 +42,12 @@ describe Gitlab::GitalyClient::CommitService do ...@@ -38,12 +42,12 @@ describe Gitlab::GitalyClient::CommitService do
expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_diff).with(request, kind_of(Hash)) expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_diff).with(request, kind_of(Hash))
described_class.new(repository).diff_from_parent(initial_commit) client.diff_from_parent(initial_commit)
end end
end end
it 'returns a Gitlab::Git::DiffCollection' do it 'returns a Gitlab::Git::DiffCollection' do
ret = described_class.new(repository).diff_from_parent(commit) ret = client.diff_from_parent(commit)
expect(ret).to be_kind_of(Gitlab::Git::DiffCollection) expect(ret).to be_kind_of(Gitlab::Git::DiffCollection)
end end
...@@ -53,7 +57,7 @@ describe Gitlab::GitalyClient::CommitService do ...@@ -53,7 +57,7 @@ describe Gitlab::GitalyClient::CommitService do
expect(Gitlab::Git::DiffCollection).to receive(:new).with(kind_of(Enumerable), options) expect(Gitlab::Git::DiffCollection).to receive(:new).with(kind_of(Enumerable), options)
described_class.new(repository).diff_from_parent(commit, options) client.diff_from_parent(commit, options)
end end
end end
...@@ -68,7 +72,7 @@ describe Gitlab::GitalyClient::CommitService do ...@@ -68,7 +72,7 @@ describe Gitlab::GitalyClient::CommitService do
expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_delta).with(request, kind_of(Hash)).and_return([]) expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_delta).with(request, kind_of(Hash)).and_return([])
described_class.new(repository).commit_deltas(commit) client.commit_deltas(commit)
end end
end end
...@@ -83,7 +87,7 @@ describe Gitlab::GitalyClient::CommitService do ...@@ -83,7 +87,7 @@ describe Gitlab::GitalyClient::CommitService do
expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_delta).with(request, kind_of(Hash)).and_return([]) expect_any_instance_of(Gitaly::DiffService::Stub).to receive(:commit_delta).with(request, kind_of(Hash)).and_return([])
described_class.new(repository).commit_deltas(initial_commit) client.commit_deltas(initial_commit)
end end
end end
end end
...@@ -91,6 +95,7 @@ describe Gitlab::GitalyClient::CommitService do ...@@ -91,6 +95,7 @@ describe Gitlab::GitalyClient::CommitService do
describe '#between' do describe '#between' do
let(:from) { 'master' } let(:from) { 'master' }
let(:to) { '4b825dc642cb6eb9a060e54bf8d69288fbee4904' } let(:to) { '4b825dc642cb6eb9a060e54bf8d69288fbee4904' }
it 'sends an RPC request' do it 'sends an RPC request' do
request = Gitaly::CommitsBetweenRequest.new( request = Gitaly::CommitsBetweenRequest.new(
repository: repository_message, from: from, to: to repository: repository_message, from: from, to: to
...@@ -102,4 +107,17 @@ describe Gitlab::GitalyClient::CommitService do ...@@ -102,4 +107,17 @@ describe Gitlab::GitalyClient::CommitService do
described_class.new(repository).between(from, to) described_class.new(repository).between(from, to)
end end
end end
describe '#tree_entries' do
let(:path) { '/' }
it 'sends a get_tree_entries message' do
expect_any_instance_of(Gitaly::CommitService::Stub)
.to receive(:get_tree_entries)
.with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
.and_return([])
client.tree_entries(repository, revision, path)
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