Incorporate RemoteService.FetchInternalRemote Gitaly RPC
This commit is contained in:
parent
fb583c4b18
commit
9ff44c2986
5 changed files with 69 additions and 33 deletions
|
@ -1 +1 @@
|
|||
0.65.0
|
||||
0.66.0
|
||||
|
|
|
@ -1154,23 +1154,13 @@ module Gitlab
|
|||
end
|
||||
|
||||
def fetch_repository_as_mirror(repository)
|
||||
remote_name = "tmp-#{SecureRandom.hex}"
|
||||
|
||||
# Notice that this feature flag is not for `fetch_repository_as_mirror`
|
||||
# as a whole but for the fetching mechanism (file path or gitaly-ssh).
|
||||
url, env = gitaly_migrate(:fetch_internal) do |is_enabled|
|
||||
gitaly_migrate(:remote_fetch_internal_remote) do |is_enabled|
|
||||
if is_enabled
|
||||
repository = RemoteRepository.new(repository) unless repository.is_a?(RemoteRepository)
|
||||
[GITALY_INTERNAL_URL, repository.fetch_env]
|
||||
gitaly_remote_client.fetch_internal_remote(repository)
|
||||
else
|
||||
[repository.path, nil]
|
||||
rugged_fetch_repository_as_mirror(repository)
|
||||
end
|
||||
end
|
||||
|
||||
add_remote(remote_name, url, mirror_refmap: :all_refs)
|
||||
fetch_remote(remote_name, env: env)
|
||||
ensure
|
||||
remove_remote(remote_name)
|
||||
end
|
||||
|
||||
def blob_at(sha, path)
|
||||
|
@ -1940,6 +1930,16 @@ module Gitlab
|
|||
false
|
||||
end
|
||||
|
||||
def rugged_fetch_repository_as_mirror(repository)
|
||||
remote_name = "tmp-#{SecureRandom.hex}"
|
||||
repository = RemoteRepository.new(repository) unless repository.is_a?(RemoteRepository)
|
||||
|
||||
add_remote(remote_name, GITALY_INTERNAL_URL, mirror_refmap: :all_refs)
|
||||
fetch_remote(remote_name, env: repository.fetch_env)
|
||||
ensure
|
||||
remove_remote(remote_name)
|
||||
end
|
||||
|
||||
def fetch_remote(remote_name = 'origin', env: nil)
|
||||
run_git(['fetch', remote_name], env: env).last.zero?
|
||||
end
|
||||
|
|
|
@ -23,6 +23,19 @@ module Gitlab
|
|||
|
||||
response.result
|
||||
end
|
||||
|
||||
def fetch_internal_remote(repository)
|
||||
request = Gitaly::FetchInternalRemoteRequest.new(
|
||||
repository: @gitaly_repo,
|
||||
remote_repository: repository.gitaly_repository
|
||||
)
|
||||
|
||||
response = GitalyClient.call(@storage, :remote_service,
|
||||
:fetch_internal_remote, request,
|
||||
remote_storage: repository.storage)
|
||||
|
||||
response.result
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -648,28 +648,38 @@ describe Gitlab::Git::Repository, seed_helper: true do
|
|||
Gitlab::Shell.new.remove_repository(TestEnv.repos_path, 'my_project')
|
||||
end
|
||||
|
||||
it 'fetches a repository as a mirror remote' do
|
||||
subject
|
||||
|
||||
expect(refs(new_repository.path)).to eq(refs(repository.path))
|
||||
end
|
||||
|
||||
context 'with keep-around refs' do
|
||||
let(:sha) { SeedRepo::Commit::ID }
|
||||
let(:keep_around_ref) { "refs/keep-around/#{sha}" }
|
||||
let(:tmp_ref) { "refs/tmp/#{SecureRandom.hex}" }
|
||||
|
||||
before do
|
||||
repository.rugged.references.create(keep_around_ref, sha, force: true)
|
||||
repository.rugged.references.create(tmp_ref, sha, force: true)
|
||||
end
|
||||
|
||||
it 'includes the temporary and keep-around refs' do
|
||||
shared_examples 'repository mirror fecthing' do
|
||||
it 'fetches a repository as a mirror remote' do
|
||||
subject
|
||||
|
||||
expect(refs(new_repository.path)).to include(keep_around_ref)
|
||||
expect(refs(new_repository.path)).to include(tmp_ref)
|
||||
expect(refs(new_repository.path)).to eq(refs(repository.path))
|
||||
end
|
||||
|
||||
context 'with keep-around refs' do
|
||||
let(:sha) { SeedRepo::Commit::ID }
|
||||
let(:keep_around_ref) { "refs/keep-around/#{sha}" }
|
||||
let(:tmp_ref) { "refs/tmp/#{SecureRandom.hex}" }
|
||||
|
||||
before do
|
||||
repository.rugged.references.create(keep_around_ref, sha, force: true)
|
||||
repository.rugged.references.create(tmp_ref, sha, force: true)
|
||||
end
|
||||
|
||||
it 'includes the temporary and keep-around refs' do
|
||||
subject
|
||||
|
||||
expect(refs(new_repository.path)).to include(keep_around_ref)
|
||||
expect(refs(new_repository.path)).to include(tmp_ref)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with gitaly enabled' do
|
||||
it_behaves_like 'repository mirror fecthing'
|
||||
end
|
||||
|
||||
context 'with gitaly enabled', :skip_gitaly_mock do
|
||||
it_behaves_like 'repository mirror fecthing'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -31,4 +31,17 @@ describe Gitlab::GitalyClient::RemoteService do
|
|||
expect(client.remove_remote(remote_name)).to be(true)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#fetch_internal_remote' do
|
||||
let(:remote_repository) { Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH, '') }
|
||||
|
||||
it 'sends an fetch_internal_remote message and returns the result value' do
|
||||
expect_any_instance_of(Gitaly::RemoteService::Stub)
|
||||
.to receive(:fetch_internal_remote)
|
||||
.with(gitaly_request_with_path(storage_name, relative_path), kind_of(Hash))
|
||||
.and_return(double(result: true))
|
||||
|
||||
expect(client.fetch_internal_remote(remote_repository)).to be(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue