Counting commits is done by Gitaly
Closes https://gitlab.com/gitlab-org/gitaly/issues/382
This commit is contained in:
parent
0716e19271
commit
c24e39ab88
3 changed files with 18 additions and 80 deletions
|
@ -31,8 +31,11 @@ class Projects::BranchesController < Projects::ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
# https://gitlab.com/gitlab-org/gitlab-ce/issues/48097
|
||||
Gitlab::GitalyClient.allow_n_plus_1_calls do
|
||||
render
|
||||
end
|
||||
end
|
||||
format.json do
|
||||
branches = BranchesFinder.new(@repository, params).execute
|
||||
branches = Kaminari.paginate_array(branches).page(params[:page])
|
||||
|
|
|
@ -472,13 +472,21 @@ module Gitlab
|
|||
end
|
||||
|
||||
def count_commits(options)
|
||||
count_commits_options = process_count_commits_options(options)
|
||||
options = process_count_commits_options(options.dup)
|
||||
|
||||
gitaly_migrate(:count_commits, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
|
||||
if is_enabled
|
||||
count_commits_by_gitaly(count_commits_options)
|
||||
wrapped_gitaly_errors do
|
||||
if options[:left_right]
|
||||
from = options[:from]
|
||||
to = options[:to]
|
||||
|
||||
right_count = gitaly_commit_client
|
||||
.commit_count("#{from}..#{to}", options)
|
||||
left_count = gitaly_commit_client
|
||||
.commit_count("#{to}..#{from}", options)
|
||||
|
||||
[left_count, right_count]
|
||||
else
|
||||
count_commits_by_shelling_out(count_commits_options)
|
||||
gitaly_commit_client.commit_count(options[:ref], options)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1902,71 +1910,6 @@ module Gitlab
|
|||
gitaly_repository_client.repository_size
|
||||
end
|
||||
|
||||
def count_commits_by_gitaly(options)
|
||||
if options[:left_right]
|
||||
from = options[:from]
|
||||
to = options[:to]
|
||||
|
||||
right_count = gitaly_commit_client
|
||||
.commit_count("#{from}..#{to}", options)
|
||||
left_count = gitaly_commit_client
|
||||
.commit_count("#{to}..#{from}", options)
|
||||
|
||||
[left_count, right_count]
|
||||
else
|
||||
gitaly_commit_client.commit_count(options[:ref], options)
|
||||
end
|
||||
end
|
||||
|
||||
def count_commits_by_shelling_out(options)
|
||||
cmd = count_commits_shelling_command(options)
|
||||
|
||||
raw_output, _status = run_git(cmd)
|
||||
|
||||
process_count_commits_raw_output(raw_output, options)
|
||||
end
|
||||
|
||||
def count_commits_shelling_command(options)
|
||||
cmd = %w[rev-list]
|
||||
cmd << "--after=#{options[:after].iso8601}" if options[:after]
|
||||
cmd << "--before=#{options[:before].iso8601}" if options[:before]
|
||||
cmd << "--max-count=#{options[:max_count]}" if options[:max_count]
|
||||
cmd << "--left-right" if options[:left_right]
|
||||
cmd << '--count'
|
||||
|
||||
cmd << if options[:all]
|
||||
'--all'
|
||||
elsif options[:ref]
|
||||
options[:ref]
|
||||
else
|
||||
raise ArgumentError, "Please specify a valid ref or set the 'all' attribute to true"
|
||||
end
|
||||
|
||||
cmd += %W[-- #{options[:path]}] if options[:path].present?
|
||||
cmd
|
||||
end
|
||||
|
||||
def process_count_commits_raw_output(raw_output, options)
|
||||
if options[:left_right]
|
||||
result = raw_output.scan(/\d+/).map(&:to_i)
|
||||
|
||||
if result.sum != options[:max_count]
|
||||
result
|
||||
else # Reaching max count, right is not accurate
|
||||
right_option =
|
||||
process_count_commits_options(options
|
||||
.except(:left_right, :from, :to)
|
||||
.merge(ref: options[:to]))
|
||||
|
||||
right = count_commits_by_shelling_out(right_option)
|
||||
|
||||
[result.first, right] # left should be accurate in the first call
|
||||
end
|
||||
else
|
||||
raw_output.to_i
|
||||
end
|
||||
end
|
||||
|
||||
def gitaly_ls_files(ref)
|
||||
gitaly_commit_client.ls_files(ref)
|
||||
end
|
||||
|
|
|
@ -1114,7 +1114,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
|
|||
end
|
||||
|
||||
describe '#count_commits' do
|
||||
shared_examples 'extended commit counting' do
|
||||
describe 'extended commit counting' do
|
||||
context 'with after timestamp' do
|
||||
it 'returns the number of commits after timestamp' do
|
||||
options = { ref: 'master', after: Time.iso8601('2013-03-03T20:15:01+00:00') }
|
||||
|
@ -1199,14 +1199,6 @@ describe Gitlab::Git::Repository, seed_helper: true do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when Gitaly count_commits feature is enabled' do
|
||||
it_behaves_like 'extended commit counting'
|
||||
end
|
||||
|
||||
context 'when Gitaly count_commits feature is disabled', :disable_gitaly do
|
||||
it_behaves_like 'extended commit counting'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#autocrlf' do
|
||||
|
|
Loading…
Reference in a new issue