class Dependabot::PullRequestCreator

Constants

DEFAULT_GITHUB_REDIRECTION_SERVICE

Dependabot programmatically creates PRs which often include a large number of links to objects on `github.com`. GitHub hydrates these into rich links that leave a 'mention' on target Issues/Pull Requests.

Due to the volume and nature of Dependabot PRs, these mentions are not useful and can overwhelm maintainers, so we use a redirection service to avoid enrichment.

If you wish to disable this behaviour when using Dependabot Core directly, pass a nil value when initialising this class.

Attributes

assignees[R]
author_details[R]
base_commit[R]
branch_name_prefix[R]
branch_name_separator[R]
commit_message_options[R]
credentials[R]
custom_headers[R]
custom_labels[R]
dependencies[R]
files[R]
github_redirection_service[R]
milestone[R]
pr_message_header[R]
provider_metadata[R]
reviewers[R]
signature_key[R]
source[R]
vulnerabilities_fixed[R]

Public Class Methods

new(source:, base_commit:, dependencies:, files:, credentials:, pr_message_header: nil, pr_message_footer: nil, custom_labels: nil, author_details: nil, signature_key: nil, commit_message_options: {}, vulnerabilities_fixed: {}, reviewers: nil, assignees: nil, milestone: nil, branch_name_separator: "/", branch_name_prefix: "dependabot", label_language: false, automerge_candidate: false, github_redirection_service: DEFAULT_GITHUB_REDIRECTION_SERVICE, custom_headers: nil, require_up_to_date_base: false, provider_metadata: {}, message: nil) click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 54
def initialize(source:, base_commit:, dependencies:, files:, credentials:,
               pr_message_header: nil, pr_message_footer: nil,
               custom_labels: nil, author_details: nil, signature_key: nil,
               commit_message_options: {}, vulnerabilities_fixed: {},
               reviewers: nil, assignees: nil, milestone: nil,
               branch_name_separator: "/", branch_name_prefix: "dependabot",
               label_language: false, automerge_candidate: false,
               github_redirection_service: DEFAULT_GITHUB_REDIRECTION_SERVICE,
               custom_headers: nil, require_up_to_date_base: false,
               provider_metadata: {}, message: nil)
  @dependencies               = dependencies
  @source                     = source
  @base_commit                = base_commit
  @files                      = files
  @credentials                = credentials
  @pr_message_header          = pr_message_header
  @pr_message_footer          = pr_message_footer
  @author_details             = author_details
  @signature_key              = signature_key
  @commit_message_options     = commit_message_options
  @custom_labels              = custom_labels
  @reviewers                  = reviewers
  @assignees                  = assignees
  @milestone                  = milestone
  @vulnerabilities_fixed      = vulnerabilities_fixed
  @branch_name_separator      = branch_name_separator
  @branch_name_prefix         = branch_name_prefix
  @label_language             = label_language
  @automerge_candidate        = automerge_candidate
  @github_redirection_service = github_redirection_service
  @custom_headers             = custom_headers
  @require_up_to_date_base    = require_up_to_date_base
  @provider_metadata          = provider_metadata
  @message                    = message

  check_dependencies_have_previous_version
end

Public Instance Methods

check_dependencies_have_previous_version() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 92
def check_dependencies_have_previous_version
  return if dependencies.all? { |d| requirements_changed?(d) }
  return if dependencies.all?(&:previous_version)

  raise "Dependencies must have a previous version or changed " \
        "requirement to have a pull request created for them!"
end
create() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 100
def create
  case source.provider
  when "github" then github_creator.create
  when "gitlab" then gitlab_creator.create
  when "azure" then azure_creator.create
  when "bitbucket" then bitbucket_creator.create
  when "codecommit" then codecommit_creator.create
  else raise "Unsupported provider #{source.provider}"
  end
end

Private Instance Methods

automerge_candidate?() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 117
def automerge_candidate?
  @automerge_candidate
end
azure_creator() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 164
def azure_creator
  Azure.new(
    source: source,
    branch_name: branch_namer.new_branch_name,
    base_commit: base_commit,
    credentials: credentials,
    files: files,
    commit_message: message.commit_message,
    pr_description: message.pr_message,
    pr_name: message.pr_name,
    author_details: author_details,
    labeler: labeler,
    work_item: provider_metadata&.fetch(:work_item, nil)
  )
end
bitbucket_creator() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 180
def bitbucket_creator
  Bitbucket.new(
    source: source,
    branch_name: branch_namer.new_branch_name,
    base_commit: base_commit,
    credentials: credentials,
    files: files,
    commit_message: message.commit_message,
    pr_description: message.pr_message,
    pr_name: message.pr_name,
    author_details: author_details,
    labeler: labeler,
    work_item: provider_metadata&.fetch(:work_item, nil)
  )
end
branch_namer() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 227
def branch_namer
  @branch_namer ||=
    BranchNamer.new(
      dependencies: dependencies,
      files: files,
      target_branch: source.branch,
      separator: branch_name_separator,
      prefix: branch_name_prefix
    )
end
codecommit_creator() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 196
def codecommit_creator
  Codecommit.new(
    source: source,
    branch_name: branch_namer.new_branch_name,
    base_commit: base_commit,
    credentials: credentials,
    files: files,
    commit_message: message.commit_message,
    pr_description: message.pr_message,
    pr_name: message.pr_name,
    author_details: author_details,
    labeler: labeler,
    require_up_to_date_base: require_up_to_date_base?
  )
end
github_creator() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 125
def github_creator
  Github.new(
    source: source,
    branch_name: branch_namer.new_branch_name,
    base_commit: base_commit,
    credentials: credentials,
    files: files,
    commit_message: message.commit_message,
    pr_description: message.pr_message,
    pr_name: message.pr_name,
    author_details: author_details,
    signature_key: signature_key,
    labeler: labeler,
    reviewers: reviewers,
    assignees: assignees,
    milestone: milestone,
    custom_headers: custom_headers,
    require_up_to_date_base: require_up_to_date_base?
  )
end
gitlab_creator() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 146
def gitlab_creator
  Gitlab.new(
    source: source,
    branch_name: branch_namer.new_branch_name,
    base_commit: base_commit,
    credentials: credentials,
    files: files,
    commit_message: message.commit_message,
    pr_description: message.pr_message,
    pr_name: message.pr_name,
    author_details: author_details,
    labeler: labeler,
    approvers: reviewers,
    assignees: assignees,
    milestone: milestone
  )
end
includes_security_fixes?() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 251
def includes_security_fixes?
  vulnerabilities_fixed.values.flatten.any?
end
label_language?() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 113
def label_language?
  @label_language
end
labeler() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 238
def labeler
  @labeler ||=
    Labeler.new(
      source: source,
      custom_labels: custom_labels,
      credentials: credentials,
      includes_security_fixes: includes_security_fixes?,
      dependencies: dependencies,
      label_language: label_language?,
      automerge_candidate: automerge_candidate?
    )
end
message() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 212
def message
  @message ||=
    MessageBuilder.new(
      source: source,
      dependencies: dependencies,
      files: files,
      credentials: credentials,
      commit_message_options: commit_message_options,
      pr_message_header: pr_message_header,
      pr_message_footer: pr_message_footer,
      vulnerabilities_fixed: vulnerabilities_fixed,
      github_redirection_service: github_redirection_service
    )
end
require_up_to_date_base?() click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 121
def require_up_to_date_base?
  @require_up_to_date_base
end
requirements_changed?(dependency) click to toggle source
# File lib/dependabot/pull_request_creator.rb, line 255
def requirements_changed?(dependency)
  (dependency.requirements - dependency.previous_requirements).any?
end