mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
68 lines
2.0 KiB
Ruby
68 lines
2.0 KiB
Ruby
# typed: true
|
|
# frozen_string_literal: true
|
|
|
|
require "download_strategy"
|
|
require "utils/github"
|
|
|
|
module GitHub
|
|
# Downloads an artifact from GitHub Actions.
|
|
#
|
|
# @param url [String] URL to download from
|
|
# @param artifact_id [String] a value that uniquely identifies the downloaded artifact
|
|
#
|
|
# @api private
|
|
sig { params(url: String, artifact_id: String).void }
|
|
def self.download_artifact(url, artifact_id)
|
|
odie "Credentials must be set to access the Artifacts API" if API.credentials_type == :none
|
|
|
|
token = API.credentials
|
|
|
|
# Download the artifact as a zip file and unpack it into `dir`. This is
|
|
# preferred over system `curl` and `tar` as this leverages the Homebrew
|
|
# cache to avoid repeated downloads of (possibly large) bottles.
|
|
downloader = GitHubArtifactDownloadStrategy.new(url, artifact_id, token: token)
|
|
downloader.fetch
|
|
downloader.stage
|
|
end
|
|
end
|
|
|
|
# Strategy for downloading an artifact from GitHub Actions.
|
|
#
|
|
# @api private
|
|
class GitHubArtifactDownloadStrategy < AbstractFileDownloadStrategy
|
|
def initialize(url, artifact_id, token:)
|
|
super(url, "artifact", artifact_id)
|
|
@cache = HOMEBREW_CACHE/"gh-actions-artifact"
|
|
@token = token
|
|
end
|
|
|
|
def fetch(timeout: nil)
|
|
ohai "Downloading #{url}"
|
|
if cached_location.exist?
|
|
puts "Already downloaded: #{cached_location}"
|
|
else
|
|
begin
|
|
curl "--location", "--create-dirs", "--output", temporary_path, url,
|
|
"--header", "Authorization: token #{@token}",
|
|
secrets: [@token],
|
|
timeout: timeout
|
|
rescue ErrorDuringExecution
|
|
raise CurlDownloadStrategyError, url
|
|
end
|
|
ignore_interrupts do
|
|
cached_location.dirname.mkpath
|
|
temporary_path.rename(cached_location)
|
|
symlink_location.dirname.mkpath
|
|
end
|
|
end
|
|
FileUtils.ln_s cached_location.relative_path_from(symlink_location.dirname), symlink_location, force: true
|
|
end
|
|
|
|
private
|
|
|
|
sig { returns(String) }
|
|
def resolved_basename
|
|
"artifact.zip"
|
|
end
|
|
end
|