class Dependabot::PullRequestCreator::Gitlab

Attributes

approvers[R]
assignees[R]
author_details[R]
base_commit[R]
branch_name[R]
commit_message[R]
credentials[R]
files[R]
labeler[R]
milestone[R]
pr_description[R]
pr_name[R]
source[R]

Public Class Methods

new(source:, branch_name:, base_commit:, credentials:, files:, commit_message:, pr_description:, pr_name:, author_details:, labeler:, approvers:, assignees:, milestone:) click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 15
def initialize(source:, branch_name:, base_commit:, credentials:,
               files:, commit_message:, pr_description:, pr_name:,
               author_details:, labeler:, approvers:, assignees:,
               milestone:)
  @source         = source
  @branch_name    = branch_name
  @base_commit    = base_commit
  @credentials    = credentials
  @files          = files
  @commit_message = commit_message
  @pr_description = pr_description
  @pr_name        = pr_name
  @author_details = author_details
  @labeler        = labeler
  @approvers      = approvers
  @assignees      = assignees
  @milestone      = milestone
end

Public Instance Methods

create() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 34
def create
  return if branch_exists? && merge_request_exists?

  if branch_exists?
    create_commit unless commit_exists?
  else
    create_branch
    create_commit
  end

  labeler.create_default_labels_if_required
  merge_request = create_merge_request
  return unless merge_request

  annotate_merge_request(merge_request)

  merge_request
end

Private Instance Methods

add_approvers_to_merge_request(merge_request) click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 154
def add_approvers_to_merge_request(merge_request)
  approvers_hash =
    approvers.keys.map { |k| [k.to_sym, approvers[k]] }.to_h

  gitlab_client_for_source.edit_merge_request_approvers(
    source.repo,
    merge_request.iid,
    approver_ids: approvers_hash[:approvers],
    approver_group_ids: approvers_hash[:group_approvers]
  )
end
annotate_merge_request(merge_request) click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 150
def annotate_merge_request(merge_request)
  add_approvers_to_merge_request(merge_request) if approvers&.any?
end
branch_exists?() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 63
def branch_exists?
  @branch_ref ||=
    gitlab_client_for_source.branch(source.repo, branch_name)
  true
rescue ::Gitlab::Error::NotFound
  false
end
commit_exists?() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 71
def commit_exists?
  @commits ||=
    gitlab_client_for_source.commits(source.repo, ref_name: branch_name)
  @commits.first.message == commit_message
end
create_branch() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 86
def create_branch
  gitlab_client_for_source.create_branch(
    source.repo,
    branch_name,
    base_commit
  )
end
create_commit() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 105
def create_commit
  return create_submodule_update_commit if files.count == 1 && files.first.type == "submodule"

  actions = files.map do |file|
    {
      action: file_action(file),
      file_path: file.type == "symlink" ? file.symlink_target : file.path,
      content: file.content
    }
  end

  gitlab_client_for_source.create_commit(
    source.repo,
    branch_name,
    commit_message,
    actions
  )
end
create_merge_request() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 136
def create_merge_request
  gitlab_client_for_source.create_merge_request(
    source.repo,
    pr_name,
    source_branch: branch_name,
    target_branch: source.branch || default_branch,
    description: pr_description,
    remove_source_branch: true,
    assignee_ids: assignees,
    labels: labeler.labels_for_pr.join(","),
    milestone_id: milestone
  )
end
create_submodule_update_commit() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 124
def create_submodule_update_commit
  file = files.first

  gitlab_client_for_source.edit_submodule(
    source.repo,
    file.path.gsub(%r{^/}, ""),
    branch: branch_name,
    commit_sha: file.content,
    commit_message: commit_message
  )
end
default_branch() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 166
def default_branch
  @default_branch ||=
    gitlab_client_for_source.project(source.repo).default_branch
end
file_action(file) click to toggle source

@param [DependencyFile] file

# File lib/dependabot/pull_request_creator/gitlab.rb, line 95
def file_action(file)
  if file.operation == Dependabot::DependencyFile::Operation::DELETE
    "delete"
  elsif file.operation == Dependabot::DependencyFile::Operation::CREATE
    "create"
  else
    "update"
  end
end
gitlab_client_for_source() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 55
def gitlab_client_for_source
  @gitlab_client_for_source ||=
    Dependabot::Clients::GitlabWithRetries.for_source(
      source: source,
      credentials: credentials
    )
end
merge_request_exists?() click to toggle source
# File lib/dependabot/pull_request_creator/gitlab.rb, line 77
def merge_request_exists?
  gitlab_client_for_source.merge_requests(
    source.repo,
    source_branch: branch_name,
    target_branch: source.branch || default_branch,
    state: "all"
  ).any?
end