debian-mirror-gitlab/app/services/commits/create_service.rb

114 lines
3 KiB
Ruby
Raw Normal View History

2018-11-18 11:00:15 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
module Commits
class CreateService < ::BaseService
ValidationError = Class.new(StandardError)
2019-12-26 22:10:19 +05:30
class ChangeError < StandardError
attr_reader :error_code
def initialize(message, error_code = nil)
super(message)
@error_code = error_code
end
end
2017-08-17 22:00:37 +05:30
def initialize(*args)
super
@start_project = params[:start_project] || @project
@start_branch = params[:start_branch]
2019-10-12 21:52:04 +05:30
@start_sha = params[:start_sha]
2017-08-17 22:00:37 +05:30
@branch_name = params[:branch_name]
2019-07-07 11:18:12 +05:30
@force = params[:force] || false
2017-08-17 22:00:37 +05:30
end
def execute
validate!
new_commit = create_commit!
success(result: new_commit)
2019-12-26 22:10:19 +05:30
rescue ChangeError => ex
error(ex.message, pass_back: { error_code: ex.error_code })
2018-12-13 13:39:08 +05:30
rescue ValidationError,
Gitlab::Git::Index::IndexError,
Gitlab::Git::CommitError,
Gitlab::Git::PreReceiveError,
Gitlab::Git::CommandError => ex
2017-08-17 22:00:37 +05:30
error(ex.message)
end
private
def create_commit!
raise NotImplementedError
end
def raise_error(message)
raise ValidationError, message
end
def different_branch?
2019-10-12 21:52:04 +05:30
@start_project != @project || @start_branch != @branch_name || @start_sha.present?
2017-08-17 22:00:37 +05:30
end
2019-07-07 11:18:12 +05:30
def force?
!!@force
end
2017-08-17 22:00:37 +05:30
def validate!
validate_permissions!
2019-10-12 21:52:04 +05:30
validate_start_sha!
2017-08-17 22:00:37 +05:30
validate_on_branch!
2019-07-07 11:18:12 +05:30
validate_branch_existence!
2017-08-17 22:00:37 +05:30
validate_new_branch_name! if different_branch?
end
def validate_permissions!
allowed = ::Gitlab::UserAccess.new(current_user, project: project).can_push_to_branch?(@branch_name)
unless allowed
raise_error("You are not allowed to push into this branch")
end
end
2019-10-12 21:52:04 +05:30
def validate_start_sha!
return unless @start_sha
if @start_branch
raise_error("You can't pass both start_branch and start_sha")
elsif !Gitlab::Git.commit_id?(@start_sha)
raise_error("Invalid start_sha '#{@start_sha}'")
elsif !@start_project.repository.commit(@start_sha)
raise_error("Cannot find start_sha '#{@start_sha}'")
end
end
2017-08-17 22:00:37 +05:30
def validate_on_branch!
2019-10-12 21:52:04 +05:30
return unless @start_branch
2017-08-17 22:00:37 +05:30
if !@start_project.empty_repo? && !@start_project.repository.branch_exists?(@start_branch)
raise_error('You can only create or edit files when you are on a branch')
end
end
2019-07-07 11:18:12 +05:30
def validate_branch_existence!
if !project.empty_repo? && different_branch? && repository.branch_exists?(@branch_name) && !force?
2017-08-17 22:00:37 +05:30
raise_error("A branch called '#{@branch_name}' already exists. Switch to that branch in order to make changes")
end
end
def validate_new_branch_name!
2020-01-01 13:55:28 +05:30
result = ::Branches::ValidateNewService.new(project).execute(@branch_name, force: force?)
2017-08-17 22:00:37 +05:30
if result[:status] == :error
raise_error("Something went wrong when we tried to create '#{@branch_name}' for you: #{result[:message]}")
end
end
end
end
2019-12-04 20:38:33 +05:30
Commits::CreateService.prepend_if_ee('EE::Commits::CreateService')