Commit c23945a3 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'zj-remote-repo-exists' into 'master'

Test if remote repository exists before cloning

Closes #43929 and gitaly#1084

See merge request gitlab-org/gitlab-ce!18017
parents b3fb82a9 11a48364
......@@ -421,7 +421,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
......
......@@ -290,7 +290,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)
......@@ -1062,7 +1062,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)
......
---
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
......
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