Merge pull request #11157 from Bo98/bottle-domain-fallback
software_spec: fix bottle domain fallback handling
This commit is contained in:
commit
f904d63e04
@ -364,7 +364,7 @@ class Formula
|
||||
# @private
|
||||
sig { returns(T.nilable(Bottle)) }
|
||||
def bottle
|
||||
Bottle.new(self, bottle_specification) if bottled?
|
||||
@bottle ||= Bottle.new(self, bottle_specification) if bottled?
|
||||
end
|
||||
|
||||
# The description of the software.
|
||||
@ -1906,7 +1906,7 @@ class Formula
|
||||
|
||||
checksum = collector_os[:checksum].hexdigest
|
||||
filename = Bottle::Filename.create(self, os, bottle_spec.rebuild)
|
||||
path, = bottle_spec.path_resolved_basename(name, checksum, filename)
|
||||
path, = Utils::Bottles.path_resolved_basename(bottle_spec.root_url, name, checksum, filename)
|
||||
url = "#{bottle_spec.root_url}/#{path}"
|
||||
|
||||
hash["files"][os] = {
|
||||
|
||||
@ -174,6 +174,7 @@ class Resource
|
||||
@specs.merge!(specs)
|
||||
@using = @specs.delete(:using)
|
||||
@download_strategy = DownloadStrategyDetector.detect(url, using)
|
||||
@downloader = nil
|
||||
end
|
||||
|
||||
def version(val = nil)
|
||||
|
||||
@ -309,29 +309,24 @@ class Bottle
|
||||
|
||||
checksum, tag, cellar = spec.checksum_for(Utils::Bottles.tag)
|
||||
|
||||
filename = Filename.create(formula, tag, spec.rebuild)
|
||||
|
||||
path, resolved_basename = spec.path_resolved_basename(@name, checksum, filename)
|
||||
|
||||
@resource.url("#{spec.root_url}/#{path}", select_download_strategy(spec.root_url_specs))
|
||||
@resource.version = formula.pkg_version
|
||||
@resource.checksum = checksum
|
||||
@resource.downloader.resolved_basename = resolved_basename if resolved_basename.present?
|
||||
@prefix = spec.prefix
|
||||
@tag = tag
|
||||
@cellar = cellar
|
||||
@rebuild = spec.rebuild
|
||||
|
||||
@resource.version = formula.pkg_version
|
||||
@resource.checksum = checksum
|
||||
|
||||
root_url(spec.root_url, spec.root_url_specs)
|
||||
end
|
||||
|
||||
def fetch(verify_download_integrity: true)
|
||||
# add the default bottle domain as a fallback mirror
|
||||
if @resource.download_strategy == CurlDownloadStrategy &&
|
||||
@resource.url.start_with?(Homebrew::EnvConfig.bottle_domain)
|
||||
fallback_url = @resource.url
|
||||
.sub(/^#{Regexp.escape(Homebrew::EnvConfig.bottle_domain)}/,
|
||||
HOMEBREW_BOTTLE_DEFAULT_DOMAIN)
|
||||
@resource.mirror(fallback_url) if [@resource.url, *@resource.mirrors].exclude?(fallback_url)
|
||||
end
|
||||
@resource.fetch(verify_download_integrity: verify_download_integrity)
|
||||
rescue DownloadError
|
||||
raise unless fallback_on_error
|
||||
|
||||
fetch_tab
|
||||
retry
|
||||
end
|
||||
|
||||
def clear_cache
|
||||
@ -355,6 +350,10 @@ class Bottle
|
||||
def fetch_tab
|
||||
# a checksum is used later identifying the correct tab but we do not have the checksum for the manifest/tab
|
||||
github_packages_manifest_resource&.fetch(verify_download_integrity: false)
|
||||
rescue DownloadError
|
||||
raise unless fallback_on_error
|
||||
|
||||
retry
|
||||
end
|
||||
|
||||
def tab_attributes
|
||||
@ -403,7 +402,7 @@ class Bottle
|
||||
|
||||
image_name = GitHubPackages.image_formula_name(@name)
|
||||
image_tag = GitHubPackages.image_version_rebuild(version_rebuild)
|
||||
resource.url("#{@spec.root_url}/#{image_name}/manifests/#{image_tag}", {
|
||||
resource.url("#{root_url}/#{image_name}/manifests/#{image_tag}", {
|
||||
using: CurlGitHubPackagesDownloadStrategy,
|
||||
headers: ["Accept: application/vnd.oci.image.index.v1+json"],
|
||||
})
|
||||
@ -413,9 +412,33 @@ class Bottle
|
||||
end
|
||||
|
||||
def select_download_strategy(specs)
|
||||
specs[:using] ||= DownloadStrategyDetector.detect(@spec.root_url)
|
||||
specs[:using] ||= DownloadStrategyDetector.detect(@root_url)
|
||||
specs
|
||||
end
|
||||
|
||||
def fallback_on_error
|
||||
# Use the default bottle domain as a fallback mirror
|
||||
if @resource.url.start_with?(Homebrew::EnvConfig.bottle_domain) &&
|
||||
Homebrew::EnvConfig.bottle_domain != HOMEBREW_BOTTLE_DEFAULT_DOMAIN
|
||||
opoo "Bottle missing, falling back to the default domain..."
|
||||
root_url(HOMEBREW_BOTTLE_DEFAULT_DOMAIN)
|
||||
@github_packages_manifest_resource = nil
|
||||
true
|
||||
else
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def root_url(val = nil, specs = {})
|
||||
return @root_url if val.nil?
|
||||
|
||||
@root_url = val
|
||||
|
||||
filename = Filename.create(resource.owner, @tag, @spec.rebuild)
|
||||
path, resolved_basename = Utils::Bottles.path_resolved_basename(val, name, resource.checksum, filename)
|
||||
@resource.url("#{val}/#{path}", select_download_strategy(specs))
|
||||
@resource.downloader.resolved_basename = resolved_basename if resolved_basename.present?
|
||||
end
|
||||
end
|
||||
|
||||
class BottleSpecification
|
||||
@ -453,15 +476,6 @@ class BottleSpecification
|
||||
end
|
||||
end
|
||||
|
||||
def path_resolved_basename(name, checksum, filename)
|
||||
if root_url.match?(GitHubPackages::URL_REGEX)
|
||||
image_name = GitHubPackages.image_formula_name(name)
|
||||
["#{image_name}/blobs/sha256:#{checksum}", filename&.github_packages]
|
||||
else
|
||||
filename&.url_encode
|
||||
end
|
||||
end
|
||||
|
||||
def cellar(val = nil)
|
||||
if val.present?
|
||||
odeprecated(
|
||||
|
||||
@ -85,6 +85,15 @@ module Utils
|
||||
|
||||
contents
|
||||
end
|
||||
|
||||
def path_resolved_basename(root_url, name, checksum, filename)
|
||||
if root_url.match?(GitHubPackages::URL_REGEX)
|
||||
image_name = GitHubPackages.image_formula_name(name)
|
||||
["#{image_name}/blobs/sha256:#{checksum}", filename&.github_packages]
|
||||
else
|
||||
filename&.url_encode
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Denotes the arch and OS of a bottle.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user