Merge branch '36010-api-v4-allows-setting-a-branch-that-doesn-t-exist-as-the-default-one' into 'master'
Resolve "API v4 allows setting a branch that doesn't exist as the default one" Closes #36010 See merge request !13359
This commit is contained in:
commit
143b5293b0
|
@ -1046,13 +1046,18 @@ class Project < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_head(branch)
|
def change_head(branch)
|
||||||
repository.before_change_head
|
if repository.branch_exists?(branch)
|
||||||
repository.rugged.references.create('HEAD',
|
repository.before_change_head
|
||||||
"refs/heads/#{branch}",
|
repository.rugged.references.create('HEAD',
|
||||||
force: true)
|
"refs/heads/#{branch}",
|
||||||
repository.copy_gitattributes(branch)
|
force: true)
|
||||||
repository.after_change_head
|
repository.copy_gitattributes(branch)
|
||||||
reload_default_branch
|
repository.after_change_head
|
||||||
|
reload_default_branch
|
||||||
|
else
|
||||||
|
errors.add(:base, "Could not change HEAD: branch '#{branch}' does not exist")
|
||||||
|
false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def forked_from?(project)
|
def forked_from?(project)
|
||||||
|
|
|
@ -10,7 +10,7 @@ module Projects
|
||||||
end
|
end
|
||||||
|
|
||||||
if changing_default_branch?
|
if changing_default_branch?
|
||||||
project.change_head(params[:default_branch])
|
return error("Could not set the default branch") unless project.change_head(params[:default_branch])
|
||||||
end
|
end
|
||||||
|
|
||||||
if project.update_attributes(params.except(:default_branch))
|
if project.update_attributes(params.except(:default_branch))
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Add checks for branch existence before changing HEAD
|
||||||
|
merge_request: 13359
|
||||||
|
author: Vitaliy @blackst0ne Klachkov
|
|
@ -1832,6 +1832,11 @@ describe Project do
|
||||||
describe '#change_head' do
|
describe '#change_head' do
|
||||||
let(:project) { create(:project, :repository) }
|
let(:project) { create(:project, :repository) }
|
||||||
|
|
||||||
|
it 'returns error if branch does not exist' do
|
||||||
|
expect(project.change_head('unexisted-branch')).to be false
|
||||||
|
expect(project.errors.size).to eq(1)
|
||||||
|
end
|
||||||
|
|
||||||
it 'calls the before_change_head and after_change_head methods' do
|
it 'calls the before_change_head and after_change_head methods' do
|
||||||
expect(project.repository).to receive(:before_change_head)
|
expect(project.repository).to receive(:before_change_head)
|
||||||
expect(project.repository).to receive(:after_change_head)
|
expect(project.repository).to receive(:after_change_head)
|
||||||
|
|
|
@ -101,6 +101,13 @@ describe Projects::UpdateService, '#execute' do
|
||||||
|
|
||||||
expect(Project.find(project.id).default_branch).to eq 'feature'
|
expect(Project.find(project.id).default_branch).to eq 'feature'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'does not change a default branch' do
|
||||||
|
# The branch 'unexisted-branch' does not exist.
|
||||||
|
update_project(project, admin, default_branch: 'unexisted-branch')
|
||||||
|
|
||||||
|
expect(Project.find(project.id).default_branch).to eq 'master'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when updating a project that contains container images' do
|
context 'when updating a project that contains container images' do
|
||||||
|
|
Loading…
Reference in New Issue