class Dependabot::PullRequestUpdater::Azure

Constants

OBJECT_ID_FOR_BRANCH_DELETE

Attributes

base_commit[R]
credentials[R]
files[R]
old_commit[R]
pull_request_number[R]
source[R]

Public Class Methods

new(source:, files:, base_commit:, old_commit:, credentials:, pull_request_number:) click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 16
def initialize(source:, files:, base_commit:, old_commit:,
               credentials:, pull_request_number:)
  @source = source
  @files = files
  @base_commit = base_commit
  @old_commit = old_commit
  @credentials = credentials
  @pull_request_number = pull_request_number
end

Public Instance Methods

update() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 26
def update
  return unless pull_request_exists? && source_branch_exists?

  update_source_branch
end

Private Instance Methods

azure_client_for_source() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 34
def azure_client_for_source
  @azure_client_for_source ||=
    Dependabot::Clients::Azure.for_source(
      source: source,
      credentials: credentials
    )
end
commit_being_updated() click to toggle source

For updating source branch, we require the latest commit for the source branch.

# File lib/dependabot/pull_request_updater/azure.rb, line 102
def commit_being_updated
  @commit_being_updated ||=
    azure_client_for_source.commits(source_branch_name).first
end
commit_message() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 111
def commit_message
  commit_being_updated.fetch("comment")
end
create_temp_branch() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 76
def create_temp_branch
  response = azure_client_for_source.create_commit(
    temp_branch_name,
    base_commit,
    commit_message,
    files,
    nil
  )

  JSON.parse(response.body).fetch("refUpdates").first.fetch("newObjectId")
end
old_source_branch_commit() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 107
def old_source_branch_commit
  commit_being_updated.fetch("commitId")
end
pull_request() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 67
def pull_request
  @pull_request ||=
    azure_client_for_source.pull_request(pull_request_number.to_s)
end
pull_request_exists?() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 42
def pull_request_exists?
  pull_request
rescue Dependabot::Clients::Azure::NotFound
  false
end
source_branch_exists?() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 48
def source_branch_exists?
  azure_client_for_source.branch(source_branch_name)
rescue Dependabot::Clients::Azure::NotFound
  false
end
source_branch_name() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 72
def source_branch_name
  @source_branch_name ||= pull_request&.fetch("sourceRefName")&.gsub("refs/heads/", "")
end
temp_branch_name() click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 88
def temp_branch_name
  @temp_branch_name ||=
    "#{source_branch_name}-temp-#{SecureRandom.uuid[0..6]}"
end
update_branch(branch_name, old_commit, new_commit) click to toggle source
# File lib/dependabot/pull_request_updater/azure.rb, line 93
def update_branch(branch_name, old_commit, new_commit)
  azure_client_for_source.update_ref(
    branch_name,
    old_commit,
    new_commit
  )
end
update_source_branch() click to toggle source

Currently the PR diff in ADO shows difference in commits instead of actual diff in files. This workaround is done to get the target branch commit history on the source branch alongwith file changes

# File lib/dependabot/pull_request_updater/azure.rb, line 56
def update_source_branch
  # 1) Push the file changes to a newly created temporary branch (from base commit)
  new_commit = create_temp_branch
  # 2) Update PR source branch to point to the temp branch head commit.
  response = update_branch(source_branch_name, old_source_branch_commit, new_commit)
  # 3) Delete temp branch
  update_branch(temp_branch_name, new_commit, OBJECT_ID_FOR_BRANCH_DELETE)

  raise PullRequestUpdateFailed, response.fetch("customMessage", nil) unless response.fetch("success", false)
end