From 24e3c5bfd58d56882e885daf09b075020024f8fd Mon Sep 17 00:00:00 2001 From: Vasilii Iakliushin Date: Thu, 10 Jun 2021 15:15:16 +0200 Subject: [PATCH] Add default_branch support for Project API Contributes to https://gitlab.com/gitlab-org/gitlab/-/issues/26261 Set `default_branch` value as a default branch name for non-empty repositories. Changelog: fixed --- app/services/projects/create_service.rb | 3 +- doc/api/projects.md | 3 +- lib/api/projects.rb | 1 + spec/requests/api/projects_spec.rb | 45 +++++++++++++++++++ spec/services/projects/create_service_spec.rb | 2 +- 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 8beb34a4626969..41fe4849b52126 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -11,6 +11,7 @@ def initialize(user, params) @initialize_with_readme = Gitlab::Utils.to_boolean(@params.delete(:initialize_with_readme)) @import_data = @params.delete(:import_data) @relations_block = @params.delete(:relations_block) + @default_branch = @params.delete(:default_branch) build_topics end @@ -151,7 +152,7 @@ def setup_authorizations def create_readme commit_attrs = { - branch_name: @project.default_branch_or_main, + branch_name: @default_branch.presence || @project.default_branch_or_main, commit_message: 'Initial commit', file_path: 'README.md', file_content: "# #{@project.name}\n\n#{@project.description}" diff --git a/doc/api/projects.md b/doc/api/projects.md index 2d2e3285356268..a928b15c4ea409 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -1171,7 +1171,7 @@ POST /projects | `ci_config_path` | string | **{dotted-circle}** No | The path to CI configuration file. | | `container_expiration_policy_attributes` | hash | **{dotted-circle}** No | Update the image cleanup policy for this project. Accepts: `cadence` (string), `keep_n` (integer), `older_than` (string), `name_regex` (string), `name_regex_delete` (string), `name_regex_keep` (string), `enabled` (boolean). Valid values for `cadence` are: `1d` (every day), `7d` (every week), `14d` (every two weeks), `1month` (every month), or `3month` (every quarter). | | `container_registry_enabled` | boolean | **{dotted-circle}** No | Enable container registry for this project. | -| `default_branch` | string | **{dotted-circle}** No | The [default branch](../user/project/repository/branches/default.md) name. | +| `default_branch` | string | **{dotted-circle}** No | The [default branch](../user/project/repository/branches/default.md) name. Requires `initialize_with_readme` to be `true`. | | `description` | string | **{dotted-circle}** No | Short project description. | | `emails_disabled` | boolean | **{dotted-circle}** No | Disable email notifications. | | `external_authorization_classification_label` **(PREMIUM)** | string | **{dotted-circle}** No | The classification label for the project. | @@ -1246,6 +1246,7 @@ POST /projects/user/:user_id | `ci_config_path` | string | **{dotted-circle}** No | The path to CI configuration file. | | `container_registry_enabled` | boolean | **{dotted-circle}** No | Enable container registry for this project. | | `description` | string | **{dotted-circle}** No | Short project description. | +| `default_branch` | string | **{dotted-circle}** No | The [default branch](../user/project/repository/branches/default.md) name. Requires `initialize_with_readme` to be `true`. | | `emails_disabled` | boolean | **{dotted-circle}** No | Disable email notifications. | | `external_authorization_classification_label` **(PREMIUM)** | string | **{dotted-circle}** No | The classification label for the project. | | `forking_access_level` | string | **{dotted-circle}** No | One of `disabled`, `private`, or `enabled`. | diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 9675f22f07353b..83c335a3248bb9 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -234,6 +234,7 @@ def translate_params_for_compatibility(params) params do optional :name, type: String, desc: 'The name of the project' optional :path, type: String, desc: 'The path of the repository' + optional :default_branch, type: String, desc: 'The default branch of the project' at_least_one_of :name, :path use :optional_create_project_params use :create_params diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 96390aa576bb50..c5c13e9f85aaf2 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -109,6 +109,43 @@ end end + shared_examples_for 'create project with default branch parameter' do + let(:params) { { name: 'Foo Project', initialize_with_readme: true, default_branch: default_branch } } + let(:default_branch) { 'main' } + + it 'creates project with provided default branch name' 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.default_branch).to eq(default_branch) + end + + context 'when branch name is empty' do + let(:default_branch) { '' } + + it 'creates project with a default project branch name' 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.default_branch).to eq('master') + end + end + + context 'when initialize with readme is not set' do + let(:params) { super().merge(initialize_with_readme: nil) } + + it 'creates project with a default project branch name' 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.default_branch).to be_nil + end + end + end + describe 'GET /projects' do shared_examples_for 'projects response' do it 'returns an array of projects' do @@ -921,6 +958,10 @@ expect(project.path).to eq('path-project-Foo') end + it_behaves_like 'create project with default branch parameter' do + let(:request) { post api('/projects', user), params: params } + end + it 'creates last project before reaching project limit' do allow_any_instance_of(User).to receive(:projects_limit_left).and_return(1) post api('/projects', user2), params: { name: 'foo' } @@ -1401,6 +1442,10 @@ expect(project.path).to eq('path-project-Foo') end + it_behaves_like 'create project with default branch parameter' do + let(:request) { post api("/projects/user/#{user.id}", admin), params: params } + end + it 'responds with 400 on failure and not project' do expect { post api("/projects/user/#{user.id}", admin) } .not_to change { Project.count } diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 753c89eb98149c..32eaf20e3ccd9c 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -298,7 +298,7 @@ context 'error handling' do it 'handles invalid options' do - opts[:default_branch] = 'master' + opts[:invalid] = 'option' expect(create_project(user, opts)).to eq(nil) end end -- GitLab