Commit 83101941 authored by Ahmad Sherif's avatar Ahmad Sherif

Migrate merged_branch_names to Gitaly

Closes gitaly#851
parent be623ef3
...@@ -571,7 +571,21 @@ module Gitlab ...@@ -571,7 +571,21 @@ module Gitlab
end end
def merged_branch_names(branch_names = []) def merged_branch_names(branch_names = [])
Set.new(git_merged_branch_names(branch_names)) return [] unless root_ref
root_sha = find_branch(root_ref)&.target
return [] unless root_sha
branches = gitaly_migrate(:merged_branch_names) do |is_enabled|
if is_enabled
gitaly_merged_branch_names(branch_names, root_sha)
else
git_merged_branch_names(branch_names, root_sha)
end
end
Set.new(branches)
end end
# Return an array of Diff objects that represent the diff # Return an array of Diff objects that represent the diff
...@@ -1475,14 +1489,7 @@ module Gitlab ...@@ -1475,14 +1489,7 @@ module Gitlab
sort_branches(branches, sort_by) sort_branches(branches, sort_by)
end end
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/695 def git_merged_branch_names(branch_names, root_sha)
def git_merged_branch_names(branch_names = [])
return [] unless root_ref
root_sha = find_branch(root_ref)&.target
return [] unless root_sha
git_arguments = git_arguments =
%W[branch --merged #{root_sha} %W[branch --merged #{root_sha}
--format=%(refname:short)\ %(objectname)] + branch_names --format=%(refname:short)\ %(objectname)] + branch_names
...@@ -1496,6 +1503,14 @@ module Gitlab ...@@ -1496,6 +1503,14 @@ module Gitlab
end end
end end
def gitaly_merged_branch_names(branch_names, root_sha)
qualified_branch_names = branch_names.map { |b| "refs/heads/#{b}" }
gitaly_ref_client.merged_branches(qualified_branch_names)
.reject { |b| b.target == root_sha }
.map(&:name)
end
def process_count_commits_options(options) def process_count_commits_options(options)
if options[:from] || options[:to] if options[:from] || options[:to]
ref = ref =
......
...@@ -14,12 +14,18 @@ module Gitlab ...@@ -14,12 +14,18 @@ module Gitlab
request = Gitaly::FindAllBranchesRequest.new(repository: @gitaly_repo) request = Gitaly::FindAllBranchesRequest.new(repository: @gitaly_repo)
response = GitalyClient.call(@storage, :ref_service, :find_all_branches, request) response = GitalyClient.call(@storage, :ref_service, :find_all_branches, request)
response.flat_map do |message| consume_find_all_branches_response(response)
message.branches.map do |branch| end
target_commit = Gitlab::Git::Commit.decorate(@repository, branch.target)
Gitlab::Git::Branch.new(@repository, branch.name, branch.target.id, target_commit) def merged_branches(branch_names = [])
end request = Gitaly::FindAllBranchesRequest.new(
end repository: @gitaly_repo,
merged_only: true,
merged_branches: branch_names.map { |s| encode_binary(s) }
)
response = GitalyClient.call(@storage, :ref_service, :find_all_branches, request)
consume_find_all_branches_response(response)
end end
def default_branch_name def default_branch_name
...@@ -62,7 +68,7 @@ module Gitlab ...@@ -62,7 +68,7 @@ module Gitlab
request = Gitaly::FindLocalBranchesRequest.new(repository: @gitaly_repo) request = Gitaly::FindLocalBranchesRequest.new(repository: @gitaly_repo)
request.sort_by = sort_by_param(sort_by) if sort_by request.sort_by = sort_by_param(sort_by) if sort_by
response = GitalyClient.call(@storage, :ref_service, :find_local_branches, request) response = GitalyClient.call(@storage, :ref_service, :find_local_branches, request)
consume_branches_response(response) consume_find_local_branches_response(response)
end end
def tags def tags
...@@ -151,7 +157,7 @@ module Gitlab ...@@ -151,7 +157,7 @@ module Gitlab
enum_value enum_value
end end
def consume_branches_response(response) def consume_find_local_branches_response(response)
response.flat_map do |message| response.flat_map do |message|
message.branches.map do |gitaly_branch| message.branches.map do |gitaly_branch|
Gitlab::Git::Branch.new( Gitlab::Git::Branch.new(
...@@ -164,6 +170,15 @@ module Gitlab ...@@ -164,6 +170,15 @@ module Gitlab
end end
end end
def consume_find_all_branches_response(response)
response.flat_map do |message|
message.branches.map do |branch|
target_commit = Gitlab::Git::Commit.decorate(@repository, branch.target)
Gitlab::Git::Branch.new(@repository, branch.name, branch.target.id, target_commit)
end
end
end
def consume_tags_response(response) def consume_tags_response(response)
response.flat_map do |message| response.flat_map do |message|
message.tags.map { |gitaly_tag| Util.gitlab_tag_from_gitaly_tag(@repository, gitaly_tag) } message.tags.map { |gitaly_tag| Util.gitlab_tag_from_gitaly_tag(@repository, gitaly_tag) }
......
...@@ -1283,48 +1283,58 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -1283,48 +1283,58 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
describe '#merged_branch_names' do describe '#merged_branch_names' do
context 'when branch names are passed' do shared_examples 'finding merged branch names' do
it 'only returns the names we are asking' do context 'when branch names are passed' do
names = repository.merged_branch_names(%w[merge-test]) it 'only returns the names we are asking' do
names = repository.merged_branch_names(%w[merge-test])
expect(names).to contain_exactly('merge-test') expect(names).to contain_exactly('merge-test')
end end
it 'does not return unmerged branch names' do it 'does not return unmerged branch names' do
names = repository.merged_branch_names(%w[feature]) names = repository.merged_branch_names(%w[feature])
expect(names).to be_empty expect(names).to be_empty
end
end end
end
context 'when no root ref is available' do context 'when no root ref is available' do
it 'returns empty list' do it 'returns empty list' do
project = create(:project, :empty_repo) project = create(:project, :empty_repo)
names = project.repository.merged_branch_names(%w[feature]) names = project.repository.merged_branch_names(%w[feature])
expect(names).to be_empty expect(names).to be_empty
end
end end
end
context 'when no branch names are specified' do context 'when no branch names are specified' do
before do before do
repository.create_branch('identical', 'master') repository.create_branch('identical', 'master')
end end
after do after do
ensure_seeds ensure_seeds
end end
it 'returns all merged branch names except for identical one' do it 'returns all merged branch names except for identical one' do
names = repository.merged_branch_names names = repository.merged_branch_names
expect(names).to include('merge-test') expect(names).to include('merge-test')
expect(names).to include('fix-mode') expect(names).to include('fix-mode')
expect(names).not_to include('feature') expect(names).not_to include('feature')
expect(names).not_to include('identical') expect(names).not_to include('identical')
end
end end
end end
context 'when Gitaly merged_branch_names feature is enabled' do
it_behaves_like 'finding merged branch names'
end
context 'when Gitaly merged_branch_names feature is disabled', :disable_gitaly do
it_behaves_like 'finding merged branch names'
end
end end
describe "#ls_files" do describe "#ls_files" do
......
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