61 lines
1.8 KiB
Ruby
61 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Commits
|
|
class CommitPatchService < CreateService
|
|
# Requires:
|
|
# - project: `Project` to be committed into
|
|
# - user: `User` that will be the committer
|
|
# - params:
|
|
# - branch_name: `String` the branch that will be committed into
|
|
# - start_branch: `String` the branch that will be started from
|
|
# - patches: `Gitlab::Git::Patches::Collection` that contains the patches
|
|
def initialize(*args)
|
|
super
|
|
|
|
@patches = Gitlab::Git::Patches::Collection.new(Array(params[:patches]))
|
|
end
|
|
|
|
private
|
|
|
|
def new_branch?
|
|
!repository.branch_exists?(@branch_name)
|
|
end
|
|
|
|
def create_commit!
|
|
if @start_branch && new_branch?
|
|
prepare_branch!
|
|
end
|
|
|
|
Gitlab::Git::Patches::CommitPatches
|
|
.new(current_user, project.repository, @branch_name, @patches)
|
|
.commit
|
|
end
|
|
|
|
def prepare_branch!
|
|
branch_result = ::Branches::CreateService.new(project, current_user)
|
|
.execute(@branch_name, @start_branch)
|
|
|
|
if branch_result[:status] != :success
|
|
raise ChangeError, branch_result[:message]
|
|
end
|
|
end
|
|
|
|
# Overridden from the Commits::CreateService, to skip some validations we
|
|
# don't need:
|
|
# - validate_on_branch!
|
|
# Not needed, the patches are applied on top of HEAD if the branch did not
|
|
# exist
|
|
# - validate_branch_existence!
|
|
# Not needed because we continue applying patches on the branch if it
|
|
# already existed, and create it if it did not exist.
|
|
def validate!
|
|
validate_patches!
|
|
validate_new_branch_name! if new_branch?
|
|
validate_permissions!
|
|
end
|
|
|
|
def validate_patches!
|
|
raise_error("Patches are too big") unless @patches.valid_size?
|
|
end
|
|
end
|
|
end
|