Add client support for count diverging commits
Adds the client call for the gitaly rpc CountDivergingCommits fixing signature simplifying commit logic adding test for max-count refactoring tests
This commit is contained in:
parent
3daa53e821
commit
1f2f38f59a
|
@ -288,13 +288,16 @@ class Repository
|
||||||
# Rugged seems to throw a `ReferenceError` when given branch_names rather
|
# Rugged seems to throw a `ReferenceError` when given branch_names rather
|
||||||
# than SHA-1 hashes
|
# than SHA-1 hashes
|
||||||
number_commits_behind, number_commits_ahead =
|
number_commits_behind, number_commits_ahead =
|
||||||
raw_repository.count_commits_between(
|
raw_repository.diverging_commit_count(
|
||||||
@root_ref_hash,
|
@root_ref_hash,
|
||||||
branch.dereferenced_target.sha,
|
branch.dereferenced_target.sha,
|
||||||
left_right: true,
|
|
||||||
max_count: MAX_DIVERGING_COUNT)
|
max_count: MAX_DIVERGING_COUNT)
|
||||||
|
|
||||||
{ behind: number_commits_behind, ahead: number_commits_ahead }
|
if number_commits_behind + number_commits_ahead >= MAX_DIVERGING_COUNT
|
||||||
|
{ distance: MAX_DIVERGING_COUNT }
|
||||||
|
else
|
||||||
|
{ behind: number_commits_behind, ahead: number_commits_ahead }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Improve performance for diverging commit counts
|
||||||
|
merge_request: 24287
|
||||||
|
author:
|
||||||
|
type: performance
|
|
@ -491,6 +491,13 @@ module Gitlab
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Return total diverging commits count
|
||||||
|
def diverging_commit_count(from, to, max_count:)
|
||||||
|
wrapped_gitaly_errors do
|
||||||
|
gitaly_commit_client.diverging_commit_count(from, to, max_count: max_count)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Mimic the `git clean` command and recursively delete untracked files.
|
# Mimic the `git clean` command and recursively delete untracked files.
|
||||||
# Valid keys that can be passed in the +options+ hash are:
|
# Valid keys that can be passed in the +options+ hash are:
|
||||||
#
|
#
|
||||||
|
|
|
@ -150,6 +150,17 @@ module Gitlab
|
||||||
GitalyClient.call(@repository.storage, :commit_service, :count_commits, request, timeout: GitalyClient.medium_timeout).count
|
GitalyClient.call(@repository.storage, :commit_service, :count_commits, request, timeout: GitalyClient.medium_timeout).count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def diverging_commit_count(from, to, max_count:)
|
||||||
|
request = Gitaly::CountDivergingCommitsRequest.new(
|
||||||
|
repository: @gitaly_repo,
|
||||||
|
from: encode_binary(from),
|
||||||
|
to: encode_binary(to),
|
||||||
|
max_count: max_count
|
||||||
|
)
|
||||||
|
response = GitalyClient.call(@repository.storage, :commit_service, :count_diverging_commits, request, timeout: GitalyClient.medium_timeout)
|
||||||
|
[response.left_count, response.right_count]
|
||||||
|
end
|
||||||
|
|
||||||
def list_last_commits_for_tree(revision, path, offset: 0, limit: 25)
|
def list_last_commits_for_tree(revision, path, offset: 0, limit: 25)
|
||||||
request = Gitaly::ListLastCommitsForTreeRequest.new(
|
request = Gitaly::ListLastCommitsForTreeRequest.new(
|
||||||
repository: @gitaly_repo,
|
repository: @gitaly_repo,
|
||||||
|
|
|
@ -283,6 +283,92 @@ describe Gitlab::Git::Repository, :seed_helper do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#diverging_commit_count' do
|
||||||
|
it 'counts 0 for the same branch' do
|
||||||
|
expect(repository.diverging_commit_count('master', 'master', max_count: 1000)).to eq([0, 0])
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'max count does not truncate results' do
|
||||||
|
where(:left, :right, :expected) do
|
||||||
|
1 | 1 | [1, 1]
|
||||||
|
4 | 4 | [4, 4]
|
||||||
|
2 | 2 | [2, 2]
|
||||||
|
2 | 4 | [2, 4]
|
||||||
|
4 | 2 | [4, 2]
|
||||||
|
10 | 10 | [10, 10]
|
||||||
|
end
|
||||||
|
|
||||||
|
with_them do
|
||||||
|
before do
|
||||||
|
repository.create_branch('left-branch', 'master')
|
||||||
|
repository.create_branch('right-branch', 'master')
|
||||||
|
left.times do
|
||||||
|
new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'left-branch', 'some more content for a', 'some stuff')
|
||||||
|
end
|
||||||
|
|
||||||
|
right.times do
|
||||||
|
new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'right-branch', 'some more content for b', 'some stuff')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
after do
|
||||||
|
repository.delete_branch('left-branch')
|
||||||
|
repository.delete_branch('right-branch')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns the correct count bounding at max_count' do
|
||||||
|
branch_a_sha = repository_rugged.branches['left-branch'].target.oid
|
||||||
|
branch_b_sha = repository_rugged.branches['right-branch'].target.oid
|
||||||
|
expect(
|
||||||
|
repository.diverging_commit_count(
|
||||||
|
branch_a_sha, branch_b_sha, max_count: 1000)
|
||||||
|
).to eq(expected)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'max count truncates results' do
|
||||||
|
where(:left, :right, :max_count) do
|
||||||
|
1 | 1 | 1
|
||||||
|
4 | 4 | 4
|
||||||
|
2 | 2 | 3
|
||||||
|
2 | 4 | 3
|
||||||
|
4 | 2 | 5
|
||||||
|
10 | 10 | 10
|
||||||
|
end
|
||||||
|
|
||||||
|
with_them do
|
||||||
|
before do
|
||||||
|
repository.create_branch('left-branch', 'master')
|
||||||
|
repository.create_branch('right-branch', 'master')
|
||||||
|
left.times do
|
||||||
|
new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'left-branch', 'some more content for a', 'some stuff')
|
||||||
|
end
|
||||||
|
|
||||||
|
right.times do
|
||||||
|
new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'right-branch', 'some more content for b', 'some stuff')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
after do
|
||||||
|
repository.delete_branch('left-branch')
|
||||||
|
repository.delete_branch('right-branch')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns the correct count bounding at max_count' do
|
||||||
|
branch_a_sha = repository_rugged.branches['left-branch'].target.oid
|
||||||
|
branch_b_sha = repository_rugged.branches['right-branch'].target.oid
|
||||||
|
results = repository.diverging_commit_count(branch_a_sha, branch_b_sha, max_count: max_count)
|
||||||
|
expect(results[0] + results[1]).to eq(max_count)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::CommitService, :diverging_commit_count do
|
||||||
|
subject { repository.diverging_commit_count('master', 'master', max_count: 1000) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#has_local_branches?' do
|
describe '#has_local_branches?' do
|
||||||
context 'check for local branches' do
|
context 'check for local branches' do
|
||||||
it { expect(repository.has_local_branches?).to eq(true) }
|
it { expect(repository.has_local_branches?).to eq(true) }
|
||||||
|
|
Loading…
Reference in New Issue