class Dependabot::Clients::GithubWithRetries

Constants

DEFAULT_CLIENT_ARGS
RETRYABLE_ERRORS

Public Class Methods

for_github_dot_com(credentials:) click to toggle source
# File lib/dependabot/clients/github_with_retries.rb, line 42
def self.for_github_dot_com(credentials:)
  access_tokens =
    credentials.
    select { |cred| cred["type"] == "git_source" }.
    select { |cred| cred["host"] == "github.com" }.
    select { |cred| cred["password"] }.
    map { |cred| cred.fetch("password") }

  new(access_tokens: access_tokens)
end
for_source(source:, credentials:) click to toggle source

Constructor methods #

# File lib/dependabot/clients/github_with_retries.rb, line 28
def self.for_source(source:, credentials:)
  access_tokens =
    credentials.
    select { |cred| cred["type"] == "git_source" }.
    select { |cred| cred["host"] == source.hostname }.
    select { |cred| cred["password"] }.
    map { |cred| cred.fetch("password") }

  new(
    access_tokens: access_tokens,
    api_endpoint: source.api_endpoint
  )
end
new(max_retries: 3, **args) click to toggle source

Proxying #

# File lib/dependabot/clients/github_with_retries.rb, line 73
def initialize(max_retries: 3, **args)
  args = DEFAULT_CLIENT_ARGS.merge(args)

  access_tokens = args.delete(:access_tokens) || []
  access_tokens << args[:access_token] if args[:access_token]
  access_tokens << nil if access_tokens.empty?
  access_tokens.uniq!

  @max_retries = max_retries || 3
  @clients = access_tokens.map do |token|
    Octokit::Client.new(args.merge(access_token: token))
  end
end

Public Instance Methods

fetch_commit(repo, branch) click to toggle source

VCS Interface #

# File lib/dependabot/clients/github_with_retries.rb, line 57
def fetch_commit(repo, branch)
  response = ref(repo, "heads/#{branch}")

  raise Octokit::NotFound if response.is_a?(Array)

  response.object.sha
end
fetch_default_branch(repo) click to toggle source
# File lib/dependabot/clients/github_with_retries.rb, line 65
def fetch_default_branch(repo)
  repository(repo).default_branch
end
method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/dependabot/clients/github_with_retries.rb, line 87
def method_missing(method_name, *args, &block)
  untried_clients = @clients.dup
  client = untried_clients.pop

  begin
    retry_connection_failures do
      if client.respond_to?(method_name)
        mutatable_args = args.map(&:dup)
        client.public_send(method_name, *mutatable_args, &block)
      else
        super
      end
    end
  rescue Octokit::NotFound, Octokit::Unauthorized, Octokit::Forbidden
    raise unless (client = untried_clients.pop)

    retry
  end
end
respond_to_missing?(method_name, include_private = false) click to toggle source
Calls superclass method
# File lib/dependabot/clients/github_with_retries.rb, line 107
def respond_to_missing?(method_name, include_private = false)
  @clients.first.respond_to?(method_name) || super
end
retry_connection_failures() { || ... } click to toggle source
# File lib/dependabot/clients/github_with_retries.rb, line 111
def retry_connection_failures
  retry_attempt = 0

  begin
    yield
  rescue *RETRYABLE_ERRORS
    retry_attempt += 1
    retry_attempt <= @max_retries ? retry : raise
  end
end