From 604093ca23b04a32c1098c902b21f0de9624c9ec Mon Sep 17 00:00:00 2001 From: Vasilii Iakliushin Date: Mon, 22 Mar 2021 11:47:20 +0100 Subject: [PATCH] Inherit default branch name for subgroups Contributes to https://gitlab.com/gitlab-org/gitlab/-/issues/293953 **Problem** We fetch default branch name from the direct project's group. But we ignore default branch settings from the root group when the project's group is a subgroup. **Solution** Use root group default branch name settings if the direct project's group doesn't redefine them. --- app/models/concerns/has_repository.rb | 9 ++- ...erit_default_branch_name_for_subgroups.yml | 5 ++ spec/models/project_spec.rb | 60 +++++-------------- 3 files changed, 27 insertions(+), 47 deletions(-) create mode 100644 changelogs/unreleased/293953_inherit_default_branch_name_for_subgroups.yml diff --git a/app/models/concerns/has_repository.rb b/app/models/concerns/has_repository.rb index b9ad78c14fd27e..774cda2c3e85f0 100644 --- a/app/models/concerns/has_repository.rb +++ b/app/models/concerns/has_repository.rb @@ -77,9 +77,14 @@ def default_branch def default_branch_from_preferences return unless empty_repo? - group_branch_default_name = group&.default_branch_name if respond_to?(:group) + (default_branch_from_group_preferences || Gitlab::CurrentSettings.default_branch_name).presence + end + + def default_branch_from_group_preferences + return unless respond_to?(:group) + return unless group - (group_branch_default_name || Gitlab::CurrentSettings.default_branch_name).presence + group.default_branch_name || group.root_ancestor.default_branch_name end def reload_default_branch diff --git a/changelogs/unreleased/293953_inherit_default_branch_name_for_subgroups.yml b/changelogs/unreleased/293953_inherit_default_branch_name_for_subgroups.yml new file mode 100644 index 00000000000000..cbb9c3a2744e04 --- /dev/null +++ b/changelogs/unreleased/293953_inherit_default_branch_name_for_subgroups.yml @@ -0,0 +1,5 @@ +--- +title: Inherit default branch name for subgroups +merge_request: 57101 +author: +type: fixed diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e4295d2ab408df..add57dda565090 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -5041,57 +5041,27 @@ def enable_lfs end describe '#default_branch' do - context 'with an empty repository' do - let_it_be(:project) { create(:project_empty_repo) } + context 'with default_branch_name' do + let_it_be_with_refind(:root_group) { create(:group) } + let_it_be_with_refind(:project_group) { create(:group, parent: root_group) } + let_it_be_with_refind(:project) { create(:project, path: 'avatar', namespace: project_group) } - context 'group.default_branch_name is available' do - let(:project_group) { create(:group) } - let(:project) { create(:project, path: 'avatar', namespace: project_group) } - - before do - expect(Gitlab::CurrentSettings) - .not_to receive(:default_branch_name) - - expect(project.group) - .to receive(:default_branch_name) - .and_return('example_branch') - end - - it 'returns the group default value' do - expect(project.default_branch).to eq('example_branch') - end + where(:instance_branch, :root_group_branch, :project_group_branch, :project_branch) do + '' | nil | nil | nil + nil | nil | nil | nil + 'main' | nil | nil | 'main' + 'main' | 'root_branch' | nil | 'root_branch' + 'main' | 'root_branch' | 'group_branch' | 'group_branch' end - context 'Gitlab::CurrentSettings.default_branch_name is available' do + with_them do before do - expect(Gitlab::CurrentSettings) - .to receive(:default_branch_name) - .and_return(example_branch_name) - end - - context 'is missing or nil' do - let(:example_branch_name) { nil } - - it "returns nil" do - expect(project.default_branch).to be_nil - end + allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return(instance_branch) + root_group.namespace_settings.update!(default_branch_name: root_group_branch) + project_group.namespace_settings.update!(default_branch_name: project_group_branch) end - context 'is blank' do - let(:example_branch_name) { '' } - - it 'returns nil' do - expect(project.default_branch).to be_nil - end - end - - context 'is present' do - let(:example_branch_name) { 'example_branch_name' } - - it 'returns the expected branch name' do - expect(project.default_branch).to eq(example_branch_name) - end - end + it { expect(project.default_branch).to eq(project_branch) } end end end -- GitLab