2014-09-21 04:29:52 -04:00
require_relative 'base_service'
class CreateBranchService < BaseService
def execute ( branch_name , ref )
2014-07-27 10:40:00 -04:00
valid_branch = Gitlab :: GitRefValidator . validate ( branch_name )
if valid_branch == false
2015-12-16 13:29:31 -05:00
return error ( " Branch name can't contains space, '~', '^', ':', '?', '*', '[', ' \' , '..', '@{', and consecutive slashes, start with '/' or '.' or end in '/' or '.' or '.lock' " )
2014-07-27 10:40:00 -04:00
end
2014-04-01 03:33:23 -04:00
repository = project . repository
2014-07-27 10:40:00 -04:00
existing_branch = repository . find_branch ( branch_name )
if existing_branch
return error ( 'Branch already exists' )
end
2015-11-25 19:20:40 -05:00
new_branch = repository . add_branch ( current_user , branch_name , ref )
2014-04-01 03:33:23 -04:00
if new_branch
2015-03-13 09:55:17 -04:00
push_data = build_push_data ( project , current_user , new_branch )
EventCreateService . new . push ( project , current_user , push_data )
2015-03-13 09:56:08 -04:00
project . execute_hooks ( push_data . dup , :push_hooks )
project . execute_services ( push_data . dup , :push_hooks )
2015-03-13 09:55:17 -04:00
success ( new_branch )
2014-07-27 10:40:00 -04:00
else
2015-03-13 09:55:17 -04:00
error ( 'Invalid reference name' )
2014-04-01 03:33:23 -04:00
end
2015-11-25 19:20:40 -05:00
rescue GitHooksService :: PreReceiveError
error ( 'Branch creation was rejected by Git hook' )
2014-07-27 10:40:00 -04:00
end
def success ( branch )
2014-09-21 04:29:52 -04:00
out = super ( )
out [ :branch ] = branch
out
2014-04-01 03:33:23 -04:00
end
2015-03-13 09:55:17 -04:00
def build_push_data ( project , user , branch )
Gitlab :: PushDataBuilder .
build ( project , user , Gitlab :: Git :: BLANK_SHA , branch . target , " #{ Gitlab :: Git :: BRANCH_REF_PREFIX } #{ branch . name } " , [ ] )
end
2014-04-01 03:33:23 -04:00
end