diff --git a/Gemfile b/Gemfile index 64e5ea8bcce53cacc8212767a773b286f392e6c0..5e7b37381858af9dda9f86712b849bb8b9762c6e 100644 --- a/Gemfile +++ b/Gemfile @@ -479,7 +479,7 @@ gem 'ssh_data', '~> 1.2' gem 'spamcheck', '~> 0.1.0' # Gitaly GRPC protocol definitions -gem 'gitaly', '~> 14.9.0.pre.rc2' +gem 'gitaly', '~> 14.9.0.pre.rc3' # KAS GRPC protocol definitions gem 'kas-grpc', '~> 0.0.2' diff --git a/Gemfile.lock b/Gemfile.lock index 6fe4cdc97260378b234bc423773195b77e7e1afd..d2e2d1e6438f475816340cab2ce82431ac04a33e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -455,7 +455,7 @@ GEM rails (>= 3.2.0) git (1.7.0) rchardet (~> 1.8) - gitaly (14.9.0.pre.rc2) + gitaly (14.9.0.pre.rc3) grpc (~> 1.0) github-markup (1.7.0) gitlab (4.16.1) @@ -1486,7 +1486,7 @@ DEPENDENCIES gettext (~> 3.3) gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails_js (~> 1.3) - gitaly (~> 14.9.0.pre.rc2) + gitaly (~> 14.9.0.pre.rc3) github-markup (~> 1.7.0) gitlab-chronic (~> 0.10.5) gitlab-dangerfiles (~> 2.10.2) diff --git a/app/models/repository.rb b/app/models/repository.rb index e0b1901d188f3cd1092c17c3fc8042504e6ef51d..346478b6689bacfdfce27f5c3970078179382511 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -1085,10 +1085,10 @@ def blob_data_at(sha, path) blob.data end - def create_if_not_exists + def create_if_not_exists(default_branch = nil) return if exists? - raw.create_repository + raw.create_repository(default_branch) after_create true diff --git a/app/models/snippet.rb b/app/models/snippet.rb index b04fca64c871254696554a5bfa8f8d4c3ef47798..ac87da4f3c8d34a78e1572fad3d900c624daf86b 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -367,7 +367,7 @@ def change_head_to_default_branch def create_repository return if repository_exists? && snippet_repository - repository.create_if_not_exists + repository.create_if_not_exists(default_branch) track_snippet_repository(repository.storage) end diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index c3ee5b97379e73e0c07ee185b10081a14d78ac6a..1492ea1ce763738997f5cd9e15bc8903fc22ffd4 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -99,9 +99,9 @@ def exists? gitaly_repository_client.exists? end - def create_repository + def create_repository(default_branch = nil) wrapped_gitaly_errors do - gitaly_repository_client.create_repository + gitaly_repository_client.create_repository(default_branch) rescue GRPC::AlreadyExists => e raise RepositoryExists, e.message end diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb index 51d0730bb1dba8196f58b9f2695b18fa53e63c43..5c447dfd41729e2e4f2cfe4a5a1b9acd5db45d72 100644 --- a/lib/gitlab/gitaly_client/repository_service.rb +++ b/lib/gitlab/gitaly_client/repository_service.rb @@ -107,8 +107,8 @@ def fetch_remote(url, refmap:, ssh_auth:, forced:, no_tags:, timeout:, prune: tr end # rubocop: enable Metrics/ParameterLists - def create_repository - request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo) + def create_repository(default_branch = nil) + request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo, default_branch: default_branch) GitalyClient.call(@storage, :repository_service, :create_repository, request, timeout: GitalyClient.fast_timeout) end diff --git a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb index d22aa86dbe066b86904647f751bf6de6641bfdd5..cfa03db52feff589e61a8bf229ad78aa8911dff5 100644 --- a/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb +++ b/spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb @@ -78,6 +78,10 @@ end shared_examples 'migration_bot user commits files' do + before do + allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main') + end + it do subject @@ -89,6 +93,10 @@ end shared_examples 'commits the file to the repository' do + before do + allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main') + end + context 'when author can update snippet and use git' do it 'creates the repository and commit the file' do subject @@ -269,6 +277,10 @@ let!(:snippet) { snippets.create!(id: 5, type: 'PersonalSnippet', author_id: other_user.id, file_name: file_name, content: content) } let(:ids) { [4, 5] } + before do + allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main') + end + after do raw_repository(snippet).remove raw_repository(invalid_snippet).remove diff --git a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb index 229ab70a65d2547b3e4d50674c10d870d38e203b..39de9a653901d89043d55f815b1952f12930d0b0 100644 --- a/spec/lib/gitlab/gitaly_client/repository_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/repository_service_spec.rb @@ -218,6 +218,26 @@ end end + describe '#create_repository' do + it 'sends a create_repository message without arguments' do + expect_any_instance_of(Gitaly::RepositoryService::Stub) + .to receive(:create_repository) + .with(gitaly_request_with_path(storage_name, relative_path).and(gitaly_request_with_params(default_branch: '')), kind_of(Hash)) + .and_return(double) + + client.create_repository + end + + it 'sends a create_repository message with default branch' do + expect_any_instance_of(Gitaly::RepositoryService::Stub) + .to receive(:create_repository) + .with(gitaly_request_with_path(storage_name, relative_path).and(gitaly_request_with_params(default_branch: 'default-branch-name')), kind_of(Hash)) + .and_return(double) + + client.create_repository('default-branch-name') + end + end + describe '#create_from_snapshot' do it 'sends a create_repository_from_snapshot message' do expect_any_instance_of(Gitaly::RepositoryService::Stub) diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index e592a4964f532044cf3f5e40ea4be531f59eadc2..215f83adf5d806970eac8818c020dcb112c6157a 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -3062,6 +3062,14 @@ def expect_contributors(*contributors) repository.create_if_not_exists end + it 'creates a repository with a default branch name' do + default_branch_name = 'branch-a' + repository.create_if_not_exists(default_branch_name) + repository.create_file(user, 'file', 'content', message: 'initial commit', branch_name: default_branch_name) + + expect(repository.root_ref).to eq(default_branch_name) + end + context 'it does nothing if the repository already existed' do let(:project) { create(:project, :repository) } diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb index 92e4bc7d1a94f0455763c7e487a6986b6b8c3f85..e80814cef5c068824db6612ca6a14719925bbb29 100644 --- a/spec/models/snippet_spec.rb +++ b/spec/models/snippet_spec.rb @@ -667,6 +667,16 @@ def to_json(params = {}) expect(snippet.repository.exists?).to be_truthy end + it 'sets the default branch' do + expect(snippet).to receive(:default_branch).and_return('default-branch-1') + expect(subject).to be_truthy + + snippet.repository.create_file(snippet.author, 'file', 'content', message: 'initial commit', branch_name: 'default-branch-1') + + expect(snippet.repository.exists?).to be_truthy + expect(snippet.repository.root_ref).to eq('default-branch-1') + end + it 'tracks snippet repository' do expect do subject @@ -677,6 +687,7 @@ def to_json(params = {}) expect(snippet).to receive(:repository_storage).and_return('picked') expect(snippet).to receive(:repository_exists?).and_return(false) expect(snippet.repository).to receive(:create_if_not_exists) + allow(snippet).to receive(:default_branch).and_return('picked') subject @@ -899,22 +910,6 @@ def to_json(params = {}) end end - context 'when repository is empty' do - let(:snippet) { create(:snippet, :empty_repo) } - - before do - allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return(default_branch) - end - - context 'when default branch in settings is different from "master"' do - let(:default_branch) { 'custom-branch' } - - it 'changes the HEAD reference to the default branch' do - expect { subject }.to change { File.read(head_path).squish }.to("ref: refs/heads/#{default_branch}") - end - end - end - context 'when repository is not empty' do let(:snippet) { create(:snippet, :empty_repo) }