diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb index aaf5fecb65..088dbb6b71 100644 --- a/Library/Homebrew/download_strategy.rb +++ b/Library/Homebrew/download_strategy.rb @@ -533,20 +533,18 @@ end # # @api public class CurlGitHubPackagesDownloadStrategy < CurlDownloadStrategy - attr_accessor :checksum, :name + attr_writer :resolved_basename + + def initialize(url, name, version, **meta) + meta ||= {} + meta[:header] = "Authorization: Bearer" + super(url, name, version, meta) + end private - def _fetch(url:, resolved_url:) - raise CurlDownloadStrategyError, "Empty checksum" if checksum.blank? - raise CurlDownloadStrategyError, "Empty name" if name.blank? - - _, org, repo, = *url.match(GitHubPackages::URL_REGEX) - - # remove redundant repo prefix for a shorter name - repo = repo.delete_prefix("homebrew-") - blob_url = "#{GitHubPackages::URL_PREFIX}#{org}/#{repo}/#{name}/blobs/sha256:#{checksum}" - curl_download(blob_url, "--header", "Authorization: Bearer", to: temporary_path) + def resolved_basename + @resolved_basename.presence || super end end diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index 51839f3d88..6d8c123bfb 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -304,9 +304,18 @@ class Bottle checksum, tag, cellar = spec.checksum_for(Utils::Bottles.tag) - filename = Filename.create(formula, tag, spec.rebuild) - @resource.url("#{spec.root_url}/#{filename.bintray}", - select_download_strategy(spec.root_url_specs)) + filename = Filename.create(formula, tag, spec.rebuild).bintray + + # TODO: this will need adjusted when if we use GitHub Packages by default + path, resolved_basename = if (bottle_domain = Homebrew::EnvConfig.bottle_domain.presence) && + bottle_domain.start_with?(GitHubPackages::URL_PREFIX) + ["#{@name}/blobs/sha256:#{checksum}", filename] + else + filename + end + + @resource.url("#{spec.root_url}/#{path}", select_download_strategy(spec.root_url_specs)) + @resource.downloader.resolved_basename = resolved_basename if resolved_basename.present? @resource.version = formula.pkg_version @resource.checksum = checksum @prefix = spec.prefix @@ -316,16 +325,12 @@ class Bottle def fetch(verify_download_integrity: true) # add the default bottle domain as a fallback mirror - # TODO: this may need adjusted when if we use GitHub Packages by default 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) - elsif @resource.download_strategy == CurlGitHubPackagesDownloadStrategy - @resource.downloader.name = @name - @resource.downloader.checksum = @resource.checksum.hexdigest end @resource.fetch(verify_download_integrity: verify_download_integrity) end @@ -380,7 +385,7 @@ class BottleSpecification def root_url(var = nil, specs = {}) if var.nil? @root_url ||= if Homebrew::EnvConfig.bottle_domain.start_with?(GitHubPackages::URL_PREFIX) - "#{GitHubPackages::URL_PREFIX}#{tap.full_name}" + GitHubPackages.root_url(tap.user, tap.repo).to_s else "#{Homebrew::EnvConfig.bottle_domain}/#{Utils::Bottles::Bintray.repository(tap)}" end