Commit 3c8a1ef8 authored by Patrick Steinhardt's avatar Patrick Steinhardt

Convert setting the full path via SetFullPath RPC

When writing a repo's path (e.g. "gitlab-org/gitlab") into the
gitconfig, we currently use the `SetConfig()` RPC. This RPC has been
deprecated by Gitaly in favor of a new `SetFullPath()`, which can only
be used to explicitly write the repo's path into the gitconfig.

Convert the code to use the new RPC.
parent b0e2977c
818f3d85a2c8e6596376f1d2276aa22660203a6c d513d220b183d83ae7219ec52f49aa3b4f7fc551
...@@ -472,7 +472,7 @@ end ...@@ -472,7 +472,7 @@ end
gem 'spamcheck', '~> 0.1.0' gem 'spamcheck', '~> 0.1.0'
# Gitaly GRPC protocol definitions # Gitaly GRPC protocol definitions
gem 'gitaly', '~> 14.1.0.pre.rc4' gem 'gitaly', '~> 14.2.0.pre.rc2'
# KAS GRPC protocol definitions # KAS GRPC protocol definitions
gem 'kas-grpc', '~> 0.0.2' gem 'kas-grpc', '~> 0.0.2'
......
...@@ -452,7 +452,7 @@ GEM ...@@ -452,7 +452,7 @@ GEM
rails (>= 3.2.0) rails (>= 3.2.0)
git (1.7.0) git (1.7.0)
rchardet (~> 1.8) rchardet (~> 1.8)
gitaly (14.1.0.pre.rc4) gitaly (14.2.0.pre.rc2)
grpc (~> 1.0) grpc (~> 1.0)
github-markup (1.7.0) github-markup (1.7.0)
gitlab (4.16.1) gitlab (4.16.1)
...@@ -1464,7 +1464,7 @@ DEPENDENCIES ...@@ -1464,7 +1464,7 @@ DEPENDENCIES
gettext (~> 3.3) gettext (~> 3.3)
gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3) gettext_i18n_rails_js (~> 1.3)
gitaly (~> 14.1.0.pre.rc4) gitaly (~> 14.2.0.pre.rc2)
github-markup (~> 1.7.0) github-markup (~> 1.7.0)
gitlab-chronic (~> 0.10.5) gitlab-chronic (~> 0.10.5)
gitlab-dangerfiles (~> 2.3.0) gitlab-dangerfiles (~> 2.3.0)
......
---
name: set_full_path
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/66929
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337002
milestone: '14.2'
type: development
group: group::gitaly
default_enabled: false
...@@ -911,7 +911,11 @@ module Gitlab ...@@ -911,7 +911,11 @@ module Gitlab
# This guard avoids Gitaly log/error spam # This guard avoids Gitaly log/error spam
raise NoRepository, 'repository does not exist' unless exists? raise NoRepository, 'repository does not exist' unless exists?
set_config('gitlab.fullpath' => full_path) if Feature.enabled?(:set_full_path)
gitaly_repository_client.set_full_path(full_path)
else
set_config('gitlab.fullpath' => full_path)
end
end end
def set_config(entries) def set_config(entries)
......
...@@ -263,6 +263,21 @@ module Gitlab ...@@ -263,6 +263,21 @@ module Gitlab
GitalyClient.call(@storage, :repository_service, :write_ref, request, timeout: GitalyClient.fast_timeout) GitalyClient.call(@storage, :repository_service, :write_ref, request, timeout: GitalyClient.fast_timeout)
end end
def set_full_path(path)
GitalyClient.call(
@storage,
:repository_service,
:set_full_path,
Gitaly::SetFullPathRequest.new(
repository: @gitaly_repo,
path: path
),
timeout: GitalyClient.fast_timeout
)
nil
end
def set_config(entries) def set_config(entries)
return if entries.empty? return if entries.empty?
......
...@@ -1730,42 +1730,60 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do ...@@ -1730,42 +1730,60 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do
end end
describe '#set_full_path' do describe '#set_full_path' do
before do shared_examples '#set_full_path' do
repository_rugged.config["gitlab.fullpath"] = repository_path before do
end repository_rugged.config["gitlab.fullpath"] = repository_path
end
context 'is given a path' do context 'is given a path' do
it 'writes it to disk' do it 'writes it to disk' do
repository.set_full_path(full_path: "not-the/real-path.git") repository.set_full_path(full_path: "not-the/real-path.git")
config = File.read(File.join(repository_path, "config")) config = File.read(File.join(repository_path, "config"))
expect(config).to include("[gitlab]") expect(config).to include("[gitlab]")
expect(config).to include("fullpath = not-the/real-path.git") expect(config).to include("fullpath = not-the/real-path.git")
end
end end
end
context 'it is given an empty path' do context 'it is given an empty path' do
it 'does not write it to disk' do it 'does not write it to disk' do
repository.set_full_path(full_path: "") repository.set_full_path(full_path: "")
config = File.read(File.join(repository_path, "config")) config = File.read(File.join(repository_path, "config"))
expect(config).to include("[gitlab]") expect(config).to include("[gitlab]")
expect(config).to include("fullpath = #{repository_path}") expect(config).to include("fullpath = #{repository_path}")
end
end
context 'repository does not exist' do
it 'raises NoRepository and does not call Gitaly WriteConfig' do
repository = Gitlab::Git::Repository.new('default', 'does/not/exist.git', '', 'group/project')
expect(repository.gitaly_repository_client).not_to receive(:set_full_path)
expect do
repository.set_full_path(full_path: 'foo/bar.git')
end.to raise_error(Gitlab::Git::Repository::NoRepository)
end
end end
end end
context 'repository does not exist' do context 'with :set_full_path enabled' do
it 'raises NoRepository and does not call Gitaly WriteConfig' do before do
repository = Gitlab::Git::Repository.new('default', 'does/not/exist.git', '', 'group/project') stub_feature_flags(set_full_path: true)
end
expect(repository.gitaly_repository_client).not_to receive(:set_full_path) it_behaves_like '#set_full_path'
end
expect do context 'with :set_full_path disabled' do
repository.set_full_path(full_path: 'foo/bar.git') before do
end.to raise_error(Gitlab::Git::Repository::NoRepository) stub_feature_flags(set_full_path: false)
end end
it_behaves_like '#set_full_path'
end end
end end
......
...@@ -333,4 +333,17 @@ RSpec.describe Gitlab::GitalyClient::RepositoryService do ...@@ -333,4 +333,17 @@ RSpec.describe Gitlab::GitalyClient::RepositoryService do
client.replicate(source_repository) client.replicate(source_repository)
end end
end end
describe '#set_full_path' do
let(:path) { 'repo/path' }
it 'sends a set_full_path message' do
expect_any_instance_of(Gitaly::RepositoryService::Stub)
.to receive(:set_full_path)
.with(gitaly_request_with_params(path: path), kind_of(Hash))
.and_return(double)
client.set_full_path(path)
end
end
end end
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