Merge pull request #11157 from Bo98/bottle-domain-fallback

software_spec: fix bottle domain fallback handling
This commit is contained in:
Bo Anderson 2021-04-15 20:02:54 +01:00 committed by GitHub
commit f904d63e04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 53 additions and 29 deletions

View File

@ -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] = {

View File

@ -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)

View File

@ -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(

View File

@ -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.