From 03138a3c72d9ccdfda6398564c6183de70c68df5 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 5 May 2015 23:49:30 -0700 Subject: [PATCH] Make the first branch pushed to an empty repository the default HEAD. In an empty repository, pushing a new branch not called "master" would leave HEAD in an unknown state, causing ambiguity if another branch were pushed. This could in turn cause a new protected branch to be created and cause the default branch to change. * Closes #1561 * Closes #1576 * Closes https://github.com/gitlabhq/gitlabhq/issues/8883 --- CHANGELOG | 1 + app/services/git_push_service.rb | 4 ++++ spec/services/git_push_service_spec.rb | 15 ++++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 88678b087c5..3774d64f4eb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 7.11.0 (unreleased) + - Make the first branch pushed to an empty repository the default HEAD (Stan Hu) - Make Reply-To config apply to change e-mail confirmation and other Devise notifications (Stan Hu) - Add application setting to restrict user signups to e-mail domains (Stan Hu) - Don't allow a merge request to be merged when its title starts with "WIP". diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 1b889e0da8b..bdf36af02fd 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -31,6 +31,10 @@ class GitPushService # Initial push to the default branch. Take the full history of that branch as "newly pushed". @push_commits = project.repository.commits(newrev) + # Ensure HEAD points to the default branch in case it is not master + branch_name = Gitlab::Git.ref_name(ref) + project.change_head(branch_name) + # Set protection on the default branch if configured if (current_application_settings.default_branch_protection != PROTECTION_NONE) developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb index af37e8319a4..e7558f28768 100644 --- a/spec/services/git_push_service_spec.rb +++ b/spec/services/git_push_service_spec.rb @@ -234,5 +234,18 @@ describe GitPushService do expect(Issue.find(issue.id)).to be_opened end end -end + describe "empty project" do + let(:project) { create(:project_empty_repo) } + let(:new_ref) { 'refs/heads/feature'} + + before do + allow(project).to receive(:default_branch).and_return('feature') + expect(project).to receive(:change_head) { 'feature'} + end + + it 'push to first branch updates HEAD' do + service.execute(project, user, @blankrev, @newrev, new_ref) + end + end +end