Test if remote repository exists before cloning
When a repository does not exist on a remote, Gitaly won't be able to clone it. This is correct behaviour, but from the clients perspective a change in behaviour. This change implements the client side changes that allows Gitaly to execute a `git ls-remote <remote-url> HEAD`. This way the client has no need to shell out to Git. In the situation where multiple Gitalies are available, one is chosen at random. This commit closes https://gitlab.com/gitlab-org/gitlab-ce/issues/43929, while its also a part of https://gitlab.com/gitlab-org/gitaly/issues/1084
This commit is contained in:
parent
ffa73498b1
commit
11a483649e
|
|
@ -1 +1 @@
|
|||
0.91.0
|
||||
0.92.0
|
||||
|
|
|
|||
2
Gemfile
2
Gemfile
|
|
@ -420,7 +420,7 @@ group :ed25519 do
|
|||
end
|
||||
|
||||
# Gitaly GRPC client
|
||||
gem 'gitaly-proto', '~> 0.88.0', require: 'gitaly'
|
||||
gem 'gitaly-proto', '~> 0.91.0', require: 'gitaly'
|
||||
gem 'grpc', '~> 1.10.0'
|
||||
|
||||
# Locked until https://github.com/google/protobuf/issues/4210 is closed
|
||||
|
|
|
|||
|
|
@ -289,7 +289,7 @@ GEM
|
|||
po_to_json (>= 1.0.0)
|
||||
rails (>= 3.2.0)
|
||||
gherkin-ruby (0.3.2)
|
||||
gitaly-proto (0.88.0)
|
||||
gitaly-proto (0.91.0)
|
||||
google-protobuf (~> 3.1)
|
||||
grpc (~> 1.0)
|
||||
github-linguist (5.3.3)
|
||||
|
|
@ -1058,7 +1058,7 @@ DEPENDENCIES
|
|||
gettext (~> 3.2.2)
|
||||
gettext_i18n_rails (~> 1.8.0)
|
||||
gettext_i18n_rails_js (~> 1.3)
|
||||
gitaly-proto (~> 0.88.0)
|
||||
gitaly-proto (~> 0.91.0)
|
||||
github-linguist (~> 5.3.3)
|
||||
gitlab-flowdock-git-hook (~> 1.0.1)
|
||||
gitlab-markup (~> 1.6.2)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Test if remote repository exists when importing wikis
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
||||
|
|
@ -83,6 +83,10 @@ module Gitlab
|
|||
end
|
||||
end
|
||||
|
||||
def self.random_storage
|
||||
Gitlab.config.repositories.storages.keys.sample
|
||||
end
|
||||
|
||||
def self.address(storage)
|
||||
params = Gitlab.config.repositories.storages[storage]
|
||||
raise "storage not found: #{storage.inspect}" if params.nil?
|
||||
|
|
|
|||
|
|
@ -3,6 +3,17 @@ module Gitlab
|
|||
class RemoteService
|
||||
MAX_MSG_SIZE = 128.kilobytes.freeze
|
||||
|
||||
def self.exists?(remote_url)
|
||||
request = Gitaly::FindRemoteRepositoryRequest.new(remote: remote_url)
|
||||
|
||||
response = GitalyClient.call(GitalyClient.random_storage,
|
||||
:remote_service,
|
||||
:find_remote_repository, request,
|
||||
timeout: GitalyClient.medium_timeout)
|
||||
|
||||
response.exists
|
||||
end
|
||||
|
||||
def initialize(repository)
|
||||
@repository = repository
|
||||
@gitaly_repo = repository.gitaly_repository
|
||||
|
|
|
|||
|
|
@ -16,7 +16,8 @@ module Gitlab
|
|||
# Returns true if we should import the wiki for the project.
|
||||
def import_wiki?
|
||||
client.repository(project.import_source)&.has_wiki &&
|
||||
!project.wiki_repository_exists?
|
||||
!project.wiki_repository_exists? &&
|
||||
Gitlab::GitalyClient::RemoteService.exists?(wiki_url)
|
||||
end
|
||||
|
||||
# Imports the repository data.
|
||||
|
|
@ -55,7 +56,6 @@ module Gitlab
|
|||
|
||||
def import_wiki_repository
|
||||
wiki_path = "#{project.disk_path}.wiki"
|
||||
wiki_url = project.import_url.sub(/\.git\z/, '.wiki.git')
|
||||
storage_path = project.repository_storage_path
|
||||
|
||||
gitlab_shell.import_repository(storage_path, wiki_path, wiki_url)
|
||||
|
|
@ -70,6 +70,10 @@ module Gitlab
|
|||
end
|
||||
end
|
||||
|
||||
def wiki_url
|
||||
project.import_url.sub(/\.git\z/, '.wiki.git')
|
||||
end
|
||||
|
||||
def update_clone_time
|
||||
project.update_column(:last_repository_updated_at, Time.zone.now)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -58,4 +58,14 @@ describe Gitlab::GitalyClient::RemoteService do
|
|||
client.update_remote_mirror(ref_name, only_branches_matching)
|
||||
end
|
||||
end
|
||||
|
||||
describe '.exists?' do
|
||||
context "when the remote doesn't exist" do
|
||||
let(:url) { 'https://gitlab.com/gitlab-org/ik-besta-niet-of-ik-word-geplaagd.git' }
|
||||
|
||||
it 'returns false' do
|
||||
expect(described_class.exists?(url)).to be(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -38,8 +38,12 @@ describe Gitlab::GithubImport::Importer::RepositoryImporter do
|
|||
expect(project)
|
||||
.to receive(:wiki_repository_exists?)
|
||||
.and_return(false)
|
||||
expect(Gitlab::GitalyClient::RemoteService)
|
||||
.to receive(:exists?)
|
||||
.with("foo.wiki.git")
|
||||
.and_return(true)
|
||||
|
||||
expect(importer.import_wiki?).to eq(true)
|
||||
expect(importer.import_wiki?).to be(true)
|
||||
end
|
||||
|
||||
it 'returns false if the GitHub wiki is disabled' do
|
||||
|
|
|
|||
Loading…
Reference in New Issue