base_service.rb 2.3 KB
Newer Older
1
module Files
2
  class BaseService < ::BaseService
D
Dmitriy Zaporozhets 已提交
3
    class ValidationError < StandardError; end
4

D
Dmitriy Zaporozhets 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    def execute
      @current_branch = params[:current_branch]
      @target_branch  = params[:target_branch]
      @commit_message = params[:commit_message]
      @file_path      = params[:file_path]
      @file_content   = if params[:file_content_encoding] == 'base64'
                          Base64.decode64(params[:file_content])
                        else
                          params[:file_content]
                        end

      # Validate parameters
      validate

      # Create new branch if it different from current_branch
      if @target_branch != @current_branch
        create_target_branch
      end

      if sha = commit
        after_commit(sha, @target_branch)
        success
      else
        error("Something went wrong. Your changes were not committed")
      end
    rescue ValidationError => ex
      error(ex.message)
32 33 34 35
    end

    private

D
Dmitriy Zaporozhets 已提交
36
    def after_commit(sha, branch)
37
      PostCommitService.new(project, current_user).execute(sha, branch)
38
    end
D
Dmitriy Zaporozhets 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

    def current_branch
      @current_branch ||= params[:current_branch]
    end

    def target_branch
      @target_branch ||= params[:target_branch]
    end

    def raise_error(message)
      raise ValidationError.new(message)
    end

    def validate
      allowed = ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(@target_branch)

      unless allowed
        raise_error("You are not allowed to push into this branch")
      end

      unless project.empty_repo?
        unless repository.branch_names.include?(@current_branch)
          raise_error("You can only create files if you are on top of a branch")
        end

        if @current_branch != @target_branch
          if repository.branch_names.include?(@target_branch)
            raise_error("Branch with such name already exists. You need to switch to this branch in order to make changes")
          end
        end
      end
    end

    def create_target_branch
      result = CreateBranchService.new(project, current_user).execute(@target_branch, @current_branch)

      unless result[:status] == :success
        raise_error("Something went wrong when we tried to create #{@target_branch} for you")
      end
    end
79 80
  end
end