bump-formula-pr: use GitHub error message info
This saves an API call, and is more accurate, because the repo API doesn't actually say whether forking is enabled, but this error message does. To do this, the original GitHub error message had to be accessible on the GitHub exceptions.
This commit is contained in:
parent
23984273f3
commit
864475e14f
@ -366,15 +366,12 @@ module Homebrew
|
|||||||
remote_url = response.fetch("clone_url")
|
remote_url = response.fetch("clone_url")
|
||||||
end
|
end
|
||||||
username = response.fetch("owner").fetch("login")
|
username = response.fetch("owner").fetch("login")
|
||||||
rescue *GitHub.api_errors
|
rescue GitHub::AuthenticationFailedError => e
|
||||||
|
raise unless e.github_message =~ /forking is disabled/
|
||||||
# If the repository is private, forking might be disabled.
|
# If the repository is private, forking might be disabled.
|
||||||
# Create branches in the repository itself instead.
|
# Create branches in the repository itself instead.
|
||||||
remote_url = Utils.popen_read("git remote get-url --push origin").chomp
|
remote_url = Utils.popen_read("git remote get-url --push origin").chomp
|
||||||
username = formula.tap.user
|
username = formula.tap.user
|
||||||
repo_name = "homebrew-#{formula.tap.repo}"
|
|
||||||
unless GitHub.repository(username, repo_name).fetch("private")
|
|
||||||
raise
|
|
||||||
end
|
|
||||||
rescue *GitHub.api_errors => e
|
rescue *GitHub.api_errors => e
|
||||||
formula.path.atomic_write(backup_file) unless args.dry_run?
|
formula.path.atomic_write(backup_file) unless args.dry_run?
|
||||||
odie "Unable to fork: #{e.message}!"
|
odie "Unable to fork: #{e.message}!"
|
||||||
|
|||||||
@ -15,13 +15,22 @@ module GitHub
|
|||||||
PR_ENV_KEY = "HOMEBREW_NEW_FORMULA_PULL_REQUEST_URL".freeze
|
PR_ENV_KEY = "HOMEBREW_NEW_FORMULA_PULL_REQUEST_URL".freeze
|
||||||
PR_ENV = ENV[PR_ENV_KEY]
|
PR_ENV = ENV[PR_ENV_KEY]
|
||||||
|
|
||||||
Error = Class.new(RuntimeError)
|
class Error < RuntimeError
|
||||||
HTTPNotFoundError = Class.new(Error)
|
attr_reader :github_message
|
||||||
|
end
|
||||||
|
|
||||||
|
class HTTPNotFoundError < Error
|
||||||
|
def initialize(github_message)
|
||||||
|
@github_message = github_message
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class RateLimitExceededError < Error
|
class RateLimitExceededError < Error
|
||||||
def initialize(reset, error)
|
def initialize(reset, github_message)
|
||||||
|
@github_message = github_message
|
||||||
super <<~EOS
|
super <<~EOS
|
||||||
GitHub API Error: #{error}
|
GitHub API Error: #{github_message}
|
||||||
Try again in #{pretty_ratelimit_reset(reset)}, or create a personal access token:
|
Try again in #{pretty_ratelimit_reset(reset)}, or create a personal access token:
|
||||||
#{ALL_SCOPES_URL}
|
#{ALL_SCOPES_URL}
|
||||||
and then set the token as: export HOMEBREW_GITHUB_API_TOKEN="your_new_token"
|
and then set the token as: export HOMEBREW_GITHUB_API_TOKEN="your_new_token"
|
||||||
@ -34,8 +43,9 @@ module GitHub
|
|||||||
end
|
end
|
||||||
|
|
||||||
class AuthenticationFailedError < Error
|
class AuthenticationFailedError < Error
|
||||||
def initialize(error)
|
def initialize(github_message)
|
||||||
message = "GitHub #{error}\n"
|
@github_message = github_message
|
||||||
|
message = "GitHub #{github_message}\n"
|
||||||
if ENV["HOMEBREW_GITHUB_API_TOKEN"]
|
if ENV["HOMEBREW_GITHUB_API_TOKEN"]
|
||||||
message << <<~EOS
|
message << <<~EOS
|
||||||
HOMEBREW_GITHUB_API_TOKEN may be invalid or expired; check:
|
HOMEBREW_GITHUB_API_TOKEN may be invalid or expired; check:
|
||||||
@ -193,6 +203,13 @@ module GitHub
|
|||||||
end
|
end
|
||||||
|
|
||||||
def raise_api_error(output, errors, http_code, headers, scopes)
|
def raise_api_error(output, errors, http_code, headers, scopes)
|
||||||
|
json = begin
|
||||||
|
JSON.parse(output)
|
||||||
|
rescue
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
message = json&.[]("message") || "curl failed! #{errors}"
|
||||||
|
|
||||||
meta = {}
|
meta = {}
|
||||||
headers.lines.each do |l|
|
headers.lines.each do |l|
|
||||||
key, _, value = l.delete(":").partition(" ")
|
key, _, value = l.delete(":").partition(" ")
|
||||||
@ -204,25 +221,18 @@ module GitHub
|
|||||||
|
|
||||||
if meta.fetch("x-ratelimit-remaining", 1).to_i <= 0
|
if meta.fetch("x-ratelimit-remaining", 1).to_i <= 0
|
||||||
reset = meta.fetch("x-ratelimit-reset").to_i
|
reset = meta.fetch("x-ratelimit-reset").to_i
|
||||||
error = JSON.parse(output)["message"]
|
raise RateLimitExceededError.new(reset, message)
|
||||||
raise RateLimitExceededError.new(reset, error)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
GitHub.api_credentials_error_message(meta, scopes)
|
GitHub.api_credentials_error_message(meta, scopes)
|
||||||
|
|
||||||
case http_code
|
case http_code
|
||||||
when "401", "403"
|
when "401", "403"
|
||||||
raise AuthenticationFailedError, output
|
raise AuthenticationFailedError, message
|
||||||
when "404"
|
when "404"
|
||||||
raise HTTPNotFoundError, output
|
raise HTTPNotFoundError, message
|
||||||
else
|
else
|
||||||
error = begin
|
raise Error, message
|
||||||
JSON.parse(output)["message"]
|
|
||||||
rescue
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
error ||= "curl failed! #{errors}"
|
|
||||||
raise Error, error
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user