Create master branch first if project is repository-less
This commit is contained in:
parent
319dfd68a8
commit
08e4d98cac
|
@ -1,8 +1,10 @@
|
||||||
class Projects::BranchesController < Projects::ApplicationController
|
class Projects::BranchesController < Projects::ApplicationController
|
||||||
include ActionView::Helpers::SanitizeHelper
|
include ActionView::Helpers::SanitizeHelper
|
||||||
include SortingHelper
|
include SortingHelper
|
||||||
|
include ProjectsHelper
|
||||||
|
|
||||||
# Authorize
|
# Authorize
|
||||||
before_action :require_non_empty_project
|
before_action :require_non_empty_project, except: :create
|
||||||
before_action :authorize_download_code!
|
before_action :authorize_download_code!
|
||||||
before_action :authorize_push_code!, only: [:new, :create, :destroy, :destroy_all_merged]
|
before_action :authorize_push_code!, only: [:new, :create, :destroy, :destroy_all_merged]
|
||||||
|
|
||||||
|
@ -32,6 +34,8 @@ class Projects::BranchesController < Projects::ApplicationController
|
||||||
branch_name = sanitize(strip_tags(params[:branch_name]))
|
branch_name = sanitize(strip_tags(params[:branch_name]))
|
||||||
branch_name = Addressable::URI.unescape(branch_name)
|
branch_name = Addressable::URI.unescape(branch_name)
|
||||||
|
|
||||||
|
is_redirect_to_autodeploy_needed = project.empty_repo? && project.deployment_services.present?
|
||||||
|
|
||||||
result = CreateBranchService.new(project, current_user).
|
result = CreateBranchService.new(project, current_user).
|
||||||
execute(branch_name, ref)
|
execute(branch_name, ref)
|
||||||
|
|
||||||
|
@ -42,8 +46,16 @@ class Projects::BranchesController < Projects::ApplicationController
|
||||||
|
|
||||||
if result[:status] == :success
|
if result[:status] == :success
|
||||||
@branch = result[:branch]
|
@branch = result[:branch]
|
||||||
redirect_to namespace_project_tree_path(@project.namespace, @project,
|
|
||||||
@branch.name)
|
if is_redirect_to_autodeploy_needed
|
||||||
|
redirect_to(
|
||||||
|
url_to_autodeploy_setup(project, branch_name),
|
||||||
|
notice: "Branch \"#{sanitize(branch_name)}\" was created. To set up auto deploy, \
|
||||||
|
choose a GitLab CI Yaml template and commit your changes. #{view_context.link_to_autodeploy_doc}".html_safe)
|
||||||
|
else
|
||||||
|
redirect_to namespace_project_tree_path(@project.namespace, @project,
|
||||||
|
@branch.name)
|
||||||
|
end
|
||||||
else
|
else
|
||||||
@error = result[:message]
|
@error = result[:message]
|
||||||
render action: 'new'
|
render action: 'new'
|
||||||
|
@ -76,7 +88,7 @@ class Projects::BranchesController < Projects::ApplicationController
|
||||||
ref_escaped = sanitize(strip_tags(params[:ref]))
|
ref_escaped = sanitize(strip_tags(params[:ref]))
|
||||||
Addressable::URI.unescape(ref_escaped)
|
Addressable::URI.unescape(ref_escaped)
|
||||||
else
|
else
|
||||||
@project.default_branch
|
@project.default_branch || 'master'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -150,6 +150,10 @@ module ProjectsHelper
|
||||||
).html_safe
|
).html_safe
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def link_to_autodeploy_doc
|
||||||
|
link_to 'About auto deploy', help_page_path('ci/autodeploy/index'), target: '_blank'
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def repo_children_classes(field)
|
def repo_children_classes(field)
|
||||||
|
@ -268,6 +272,18 @@ module ProjectsHelper
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def url_to_autodeploy_setup(project, branch_name)
|
||||||
|
namespace_project_new_blob_path(
|
||||||
|
project.namespace,
|
||||||
|
project,
|
||||||
|
branch_name,
|
||||||
|
file_name: '.gitlab-ci.yml',
|
||||||
|
commit_message: 'Set up auto deploy',
|
||||||
|
target_branch: branch_name,
|
||||||
|
context: 'autodeploy'
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def add_koding_stack_path(project)
|
def add_koding_stack_path(project)
|
||||||
namespace_project_new_blob_path(
|
namespace_project_new_blob_path(
|
||||||
project.namespace,
|
project.namespace,
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
class CreateBranchService < BaseService
|
class CreateBranchService < BaseService
|
||||||
def execute(branch_name, ref)
|
def execute(branch_name, ref)
|
||||||
|
create_master_branch if project.empty_repo?
|
||||||
|
|
||||||
result = ValidateNewBranchService.new(project, current_user)
|
result = ValidateNewBranchService.new(project, current_user)
|
||||||
.execute(branch_name)
|
.execute(branch_name)
|
||||||
|
|
||||||
|
@ -19,4 +21,16 @@ class CreateBranchService < BaseService
|
||||||
def success(branch)
|
def success(branch)
|
||||||
super().merge(branch: branch)
|
super().merge(branch: branch)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_master_branch
|
||||||
|
project.repository.commit_file(
|
||||||
|
current_user,
|
||||||
|
'/README.md',
|
||||||
|
'',
|
||||||
|
message: 'Add README.md',
|
||||||
|
branch_name: 'master',
|
||||||
|
update: false)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -68,7 +68,7 @@ describe Projects::BranchesController do
|
||||||
|
|
||||||
describe "created from the new branch button on issues" do
|
describe "created from the new branch button on issues" do
|
||||||
let(:branch) { "1-feature-branch" }
|
let(:branch) { "1-feature-branch" }
|
||||||
let!(:issue) { create(:issue, project: project) }
|
let(:issue) { create(:issue, project: project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
|
@ -95,6 +95,49 @@ describe Projects::BranchesController do
|
||||||
issue_iid: issue.iid
|
issue_iid: issue.iid
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'repository-less project' do
|
||||||
|
let(:project) { create :empty_project }
|
||||||
|
|
||||||
|
it 'redirects to newly created branch' do
|
||||||
|
result = { status: :success, branch: double(name: branch) }
|
||||||
|
|
||||||
|
expect_any_instance_of(CreateBranchService).to receive(:execute).and_return(result)
|
||||||
|
expect(SystemNoteService).to receive(:new_issue_branch).and_return(true)
|
||||||
|
|
||||||
|
post :create,
|
||||||
|
namespace_id: project.namespace.to_param,
|
||||||
|
project_id: project.to_param,
|
||||||
|
branch_name: branch,
|
||||||
|
issue_iid: issue.iid
|
||||||
|
|
||||||
|
expect(response).to redirect_to namespace_project_tree_path(project.namespace, project, branch)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'redirects to autodeploy setup page' do
|
||||||
|
result = { status: :success, branch: double(name: branch) }
|
||||||
|
|
||||||
|
project.create_kubernetes_service(
|
||||||
|
active: true,
|
||||||
|
properties: {
|
||||||
|
namespace: project.path,
|
||||||
|
api_url: 'https://kubernetes.example.com',
|
||||||
|
token: 'a' * 40,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
expect_any_instance_of(CreateBranchService).to receive(:execute).and_return(result)
|
||||||
|
expect(SystemNoteService).to receive(:new_issue_branch).and_return(true)
|
||||||
|
|
||||||
|
post :create,
|
||||||
|
namespace_id: project.namespace.to_param,
|
||||||
|
project_id: project.to_param,
|
||||||
|
branch_name: branch,
|
||||||
|
issue_iid: issue.iid
|
||||||
|
|
||||||
|
expect(response.location).to include(namespace_project_new_blob_path(project.namespace, project, branch))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'without issue feature access' do
|
context 'without issue feature access' do
|
||||||
before do
|
before do
|
||||||
project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
|
project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
|
||||||
|
|
Loading…
Reference in New Issue