From 61ce86c7f1b4d64ed0cc2ee970337f61622deab6 Mon Sep 17 00:00:00 2001 From: Vasilii Iakliushin Date: Mon, 15 Sep 2025 11:24:58 +0200 Subject: [PATCH] Support full refs in `default_branch` for Projects API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contributes to https://gitlab.com/gitlab-org/gitlab/-/issues/516857 **Problem** The Projects API doesn’t support full references for the `default_branch` setting when creating a project via the Projects API. This leads to a non-initialized state. **Solution** Allow the `default_branch` parameter to accept fully qualified references (e.g., refs/heads/main) and automatically convert them to branch names (e.g., main). Changelog: fixed --- app/services/projects/create_service.rb | 4 +++- spec/requests/api/projects_spec.rb | 13 ++++++++++++ spec/services/projects/create_service_spec.rb | 21 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index aaa69597d09b4f..64761d659607ee 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -319,7 +319,9 @@ def extra_attributes_for_measurement private def default_branch - @default_branch.presence || @project.default_branch_or_main + return @project.default_branch_or_main if @default_branch.blank? + + Gitlab::Git.ref_name(@default_branch) end def validate_import_source_enabled! diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index fc996a063dfad7..07d03234bf7ce0 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -134,6 +134,19 @@ end end + context 'when branch name is fully qualified' do + let(:default_branch) { 'refs/heads/full_name' } + + it 'creates project with provided default branch name without refs/heads prefix' do + expect { request }.to change { Project.count }.by(1) + expect(response).to have_gitlab_http_status(:created) + + project = Project.find(json_response['id']) + expect(project.repository_exists?).to be_truthy + expect(project.default_branch).to eq('full_name') + end + end + context 'when initialize with readme is not set' do let(:params) { super().merge(initialize_with_readme: nil) } diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index c853bc654f200f..6e551bd7c827af 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -875,6 +875,27 @@ def wiki_repo(project) end end end + + context 'when default branch is a fully qualified ref' do + before do + opts[:default_branch] = 'refs/heads/example_branch' + end + + it 'creates the correct branch' do + expect(project.repository.branch_names).to contain_exactly('example_branch') + end + + it_behaves_like 'a repo with a README.md' do + let(:expected_content) do + <<~MARKDOWN + cd existing_repo + git remote add origin #{project.http_url_to_repo} + git branch -M example_branch + git push -uf origin example_branch + MARKDOWN + end + end + end end context 'when SAST initialization is requested' do -- GitLab