mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
Use Homebrew curl for audit and fetch when specified in the formula
Introduce new :using for urls
This commit is contained in:
parent
8b69798ba4
commit
07df4a7e70
@ -63,6 +63,10 @@ class DependencyCollector
|
||||
Dependency.new("git", tags)
|
||||
end
|
||||
|
||||
def brewed_curl_dep_if_needed(tags)
|
||||
Dependency.new("curl", tags)
|
||||
end
|
||||
|
||||
def subversion_dep_if_needed(tags)
|
||||
return if Utils::Svn.available?
|
||||
|
||||
@ -139,7 +143,10 @@ class DependencyCollector
|
||||
tags << :build << :test
|
||||
strategy = spec.download_strategy
|
||||
|
||||
if strategy <= CurlDownloadStrategy
|
||||
if strategy <= HomebrewCurlDownloadStrategy
|
||||
brewed_curl_dep_if_needed(tags)
|
||||
parse_url_spec(spec.url, tags)
|
||||
elsif strategy <= CurlDownloadStrategy
|
||||
parse_url_spec(spec.url, tags)
|
||||
elsif strategy <= GitDownloadStrategy
|
||||
git_dep_if_needed(tags)
|
||||
|
@ -524,7 +524,11 @@ class CurlDownloadStrategy < AbstractFileDownloadStrategy
|
||||
raise CurlDownloadStrategyError, url
|
||||
end
|
||||
|
||||
curl_download resolved_url, to: temporary_path, timeout: timeout
|
||||
_curl_download resolved_url, temporary_path, timeout
|
||||
end
|
||||
|
||||
def _curl_download(resolved_url, to, timeout)
|
||||
curl_download resolved_url, to: to, timeout: timeout
|
||||
end
|
||||
|
||||
# Curl options to be always passed to curl,
|
||||
@ -559,6 +563,19 @@ class CurlDownloadStrategy < AbstractFileDownloadStrategy
|
||||
end
|
||||
end
|
||||
|
||||
# Strategy for downloading a file using homebrew's curl.
|
||||
#
|
||||
# @api public
|
||||
class HomebrewCurlDownloadStrategy < CurlDownloadStrategy
|
||||
private
|
||||
|
||||
def _curl_download(resolved_url, to, timeout)
|
||||
raise HomebrewCurlDownloadStrategyError, url unless Formula["curl"].any_version_installed?
|
||||
|
||||
curl_download resolved_url, to: to, timeout: timeout, use_homebrew_curl: true
|
||||
end
|
||||
end
|
||||
|
||||
# Strategy for downloading a file from an GitHub Packages URL.
|
||||
#
|
||||
# @api public
|
||||
@ -1368,6 +1385,7 @@ class DownloadStrategyDetector
|
||||
when :bzr then BazaarDownloadStrategy
|
||||
when :svn then SubversionDownloadStrategy
|
||||
when :curl then CurlDownloadStrategy
|
||||
when :homebrew_curl then HomebrewCurlDownloadStrategy
|
||||
when :cvs then CVSDownloadStrategy
|
||||
when :post then CurlPostDownloadStrategy
|
||||
when :fossil then FossilDownloadStrategy
|
||||
|
@ -602,6 +602,13 @@ class CurlDownloadStrategyError < RuntimeError
|
||||
end
|
||||
end
|
||||
|
||||
# Raised in {HomebrewCurlDownloadStrategy#fetch}.
|
||||
class HomebrewCurlDownloadStrategyError < CurlDownloadStrategyError
|
||||
def initialize(url)
|
||||
super "Homebrew-installed `curl` is not installed for: #{url}"
|
||||
end
|
||||
end
|
||||
|
||||
# Raised by {Kernel#safe_system} in `utils.rb`.
|
||||
class ErrorDuringExecution < RuntimeError
|
||||
extend T::Sig
|
||||
|
@ -531,7 +531,8 @@ module Homebrew
|
||||
|
||||
ra = ResourceAuditor.new(
|
||||
spec, spec_name,
|
||||
online: @online, strict: @strict, only: @only, except: except
|
||||
online: @online, strict: @strict, only: @only, except: except,
|
||||
use_homebrew_curl: spec.using == :homebrew_curl
|
||||
).audit
|
||||
ra.problems.each do |message|
|
||||
problem "#{name}: #{message}"
|
||||
|
@ -22,7 +22,8 @@ module Homebrew
|
||||
@strict = options[:strict]
|
||||
@only = options[:only]
|
||||
@except = options[:except]
|
||||
@problems = []
|
||||
@use_homebrew_curl = options[:use_homebrew_curl]
|
||||
@problems = []
|
||||
end
|
||||
|
||||
def audit
|
||||
@ -110,7 +111,14 @@ module Homebrew
|
||||
|
||||
strategy = DownloadStrategyDetector.detect(url, using)
|
||||
if strategy <= CurlDownloadStrategy && !url.start_with?("file")
|
||||
if (http_content_problem = curl_check_http_content(url, "source URL", specs: specs))
|
||||
|
||||
raise HomebrewCurlDownloadStrategyError, url if
|
||||
strategy <= HomebrewCurlDownloadStrategy && !Formula["curl"].any_version_installed?
|
||||
|
||||
if (http_content_problem = curl_check_http_content(url,
|
||||
"source URL",
|
||||
specs: specs,
|
||||
use_homebrew_curl: @use_homebrew_curl))
|
||||
problem http_content_problem
|
||||
end
|
||||
elsif strategy <= GitDownloadStrategy
|
||||
|
@ -14,7 +14,9 @@ module Utils
|
||||
|
||||
module_function
|
||||
|
||||
def curl_executable
|
||||
def curl_executable(use_homebrew_curl: false)
|
||||
return Formula["curl"].opt_bin/"curl" if use_homebrew_curl
|
||||
|
||||
@curl ||= [
|
||||
ENV["HOMEBREW_CURL"],
|
||||
which("curl"),
|
||||
@ -63,7 +65,8 @@ module Utils
|
||||
|
||||
def curl_with_workarounds(
|
||||
*args,
|
||||
secrets: nil, print_stdout: nil, print_stderr: nil, debug: nil, verbose: nil, env: {}, timeout: nil, **options
|
||||
secrets: nil, print_stdout: nil, print_stderr: nil, debug: nil,
|
||||
verbose: nil, env: {}, timeout: nil, use_homebrew_curl: false, **options
|
||||
)
|
||||
end_time = Time.now + timeout if timeout
|
||||
|
||||
@ -77,7 +80,7 @@ module Utils
|
||||
|
||||
# SSL_CERT_FILE can be incorrectly set by users or portable-ruby and screw
|
||||
# with SSL downloads so unset it here.
|
||||
result = system_command curl_executable,
|
||||
result = system_command curl_executable(use_homebrew_curl: use_homebrew_curl),
|
||||
args: curl_args(*args, **options),
|
||||
env: { "SSL_CERT_FILE" => nil }.merge(env),
|
||||
timeout: end_time&.remaining,
|
||||
@ -173,7 +176,7 @@ module Utils
|
||||
end
|
||||
|
||||
def curl_check_http_content(url, url_type, specs: {}, user_agents: [:default],
|
||||
check_content: false, strict: false)
|
||||
check_content: false, strict: false, use_homebrew_curl: false)
|
||||
return unless url.start_with? "http"
|
||||
|
||||
secure_url = url.sub(/\Ahttp:/, "https:")
|
||||
@ -183,7 +186,7 @@ module Utils
|
||||
user_agents.each do |user_agent|
|
||||
secure_details = begin
|
||||
curl_http_content_headers_and_checksum(secure_url, specs: specs, hash_needed: true,
|
||||
user_agent: user_agent)
|
||||
user_agent: user_agent, use_homebrew_curl: use_homebrew_curl)
|
||||
rescue Timeout::Error
|
||||
next
|
||||
end
|
||||
@ -199,7 +202,8 @@ module Utils
|
||||
details = nil
|
||||
user_agents.each do |user_agent|
|
||||
details =
|
||||
curl_http_content_headers_and_checksum(url, specs: specs, hash_needed: hash_needed, user_agent: user_agent)
|
||||
curl_http_content_headers_and_checksum(url, specs: specs, hash_needed: hash_needed,
|
||||
user_agent: user_agent, use_homebrew_curl: use_homebrew_curl)
|
||||
break if http_status_ok?(details[:status])
|
||||
end
|
||||
|
||||
@ -264,7 +268,8 @@ module Utils
|
||||
"The #{url_type} #{url} may be able to use HTTPS rather than HTTP. Please verify it in a browser."
|
||||
end
|
||||
|
||||
def curl_http_content_headers_and_checksum(url, specs: {}, hash_needed: false, user_agent: :default)
|
||||
def curl_http_content_headers_and_checksum(url, specs: {}, hash_needed: false,
|
||||
user_agent: :default, use_homebrew_curl: false)
|
||||
file = Tempfile.new.tap(&:close)
|
||||
|
||||
specs = specs.flat_map { |option, argument| ["--#{option.to_s.tr("_", "-")}", argument] }
|
||||
@ -272,7 +277,7 @@ module Utils
|
||||
output, _, status = curl_output(
|
||||
*specs, "--dump-header", "-", "--output", file.path, "--location",
|
||||
"--connect-timeout", "15", "--max-time", max_time, "--retry-max-time", max_time, url,
|
||||
user_agent: user_agent
|
||||
user_agent: user_agent, use_homebrew_curl: use_homebrew_curl
|
||||
)
|
||||
|
||||
status_code = :unknown
|
||||
|
Loading…
x
Reference in New Issue
Block a user