Add source paths to API.
This commit is contained in:
parent
d15f571eb6
commit
844db75361
@ -116,11 +116,13 @@ module Homebrew
|
||||
end
|
||||
end
|
||||
|
||||
sig { params(name: String, git_head: T.nilable(String), sha256: T.nilable(String)).returns(String) }
|
||||
def self.fetch_homebrew_cask_source(name, git_head: nil, sha256: nil)
|
||||
sig {
|
||||
params(name: String, path: T.any(Pathname, String), git_head: String,
|
||||
sha256: T.nilable(String)).returns(String)
|
||||
}
|
||||
def self.fetch_homebrew_cask_source(name, path:, git_head:, sha256: nil)
|
||||
# TODO: unify with formula logic (https://github.com/Homebrew/brew/issues/14746)
|
||||
git_head = "master" if git_head.blank?
|
||||
raw_endpoint = "#{git_head}/Casks/#{name}.rb"
|
||||
raw_endpoint = "#{git_head}/#{path}"
|
||||
return cache[raw_endpoint] if cache.present? && cache.key?(raw_endpoint)
|
||||
|
||||
# This API sometimes returns random 404s so needs a fallback at formulae.brew.sh.
|
||||
|
||||
@ -20,9 +20,12 @@ module Homebrew
|
||||
Homebrew::API.fetch "cask/#{token}.json"
|
||||
end
|
||||
|
||||
sig { params(token: String, git_head: T.nilable(String), sha256: T.nilable(String)).returns(String) }
|
||||
def fetch_source(token, git_head: nil, sha256: nil)
|
||||
Homebrew::API.fetch_homebrew_cask_source token, git_head: git_head, sha256: sha256
|
||||
sig {
|
||||
params(token: String, path: T.any(String, Pathname), git_head: String,
|
||||
sha256: T.nilable(String)).returns(String)
|
||||
}
|
||||
def fetch_source(token, path:, git_head:, sha256: nil)
|
||||
Homebrew::API.fetch_homebrew_cask_source token, path: path, git_head: git_head, sha256: sha256
|
||||
end
|
||||
|
||||
sig { returns(T::Boolean) }
|
||||
|
||||
@ -241,6 +241,15 @@ module Cask
|
||||
end
|
||||
end
|
||||
|
||||
def ruby_source_path
|
||||
return @ruby_source_path if defined?(@ruby_source_path)
|
||||
|
||||
return unless sourcefile_path
|
||||
return unless tap
|
||||
|
||||
@ruby_source_path = sourcefile_path.relative_path_from(tap.path)
|
||||
end
|
||||
|
||||
def ruby_source_checksum
|
||||
@ruby_source_checksum ||= {
|
||||
"sha256" => Digest::SHA256.file(sourcefile_path).hexdigest,
|
||||
@ -259,7 +268,9 @@ module Cask
|
||||
raise ArgumentError, "Expected cask to be loaded from the API" unless loaded_from_api?
|
||||
|
||||
@languages = json_cask[:languages]
|
||||
@tap_git_head = json_cask[:tap_git_head]
|
||||
@tap_git_head = json_cask.fetch(:tap_git_head, "HEAD")
|
||||
|
||||
@ruby_source_path = json_cask[:ruby_source_path]
|
||||
@ruby_source_checksum = json_cask[:ruby_source_checksum].freeze
|
||||
end
|
||||
|
||||
@ -308,6 +319,7 @@ module Cask
|
||||
"auto_updates" => auto_updates,
|
||||
"tap_git_head" => tap_git_head,
|
||||
"languages" => languages,
|
||||
"ruby_source_path" => ruby_source_path,
|
||||
"ruby_source_checksum" => ruby_source_checksum,
|
||||
}
|
||||
end
|
||||
|
||||
@ -564,8 +564,12 @@ on_request: true)
|
||||
end
|
||||
|
||||
def load_cask_from_source_api!
|
||||
options = { git_head: @cask.tap_git_head, sha256: @cask.ruby_source_checksum["sha256"] }
|
||||
cask_source = Homebrew::API::Cask.fetch_source(@cask.token, **options)
|
||||
cask_source = Homebrew::API::Cask.fetch_source(
|
||||
@cask.token,
|
||||
path: @cask.ruby_source_path || "Casks/#{@cask.token}.rb",
|
||||
git_head: @cask.tap_git_head,
|
||||
sha256: @cask.ruby_source_checksum["sha256"],
|
||||
)
|
||||
@cask = CaskLoader::FromContentLoader.new(cask_source, tap: @cask.tap).load(config: @cask.config)
|
||||
end
|
||||
end
|
||||
|
||||
@ -2199,6 +2199,7 @@ class Formula
|
||||
"sha256" => resource("ruby-source").checksum.hexdigest,
|
||||
}
|
||||
elsif !self.class.loaded_from_api && path.exist?
|
||||
hsh["ruby_source_path"] = path.relative_path_from(tap.path).to_s
|
||||
hsh["ruby_source_checksum"] = {
|
||||
"sha256" => Digest::SHA256.file(path).hexdigest,
|
||||
}
|
||||
|
||||
@ -255,10 +255,12 @@ module Formulary
|
||||
end
|
||||
|
||||
resource "ruby-source" do
|
||||
url "https://raw.githubusercontent.com/Homebrew/homebrew-core/#{json_formula["tap_git_head"]}/Formula/#{name}.rb"
|
||||
if (ruby_source_sha256 = json_formula.dig("ruby_source_checksum", "sha256")).present?
|
||||
sha256 ruby_source_sha256
|
||||
end
|
||||
tap_git_head = json_formula.fetch("tap_git_head", "HEAD")
|
||||
ruby_source_path = json_formula.fetch("ruby_source_path", "Formula/#{name}.rb")
|
||||
ruby_source_sha256 = json_formula.dig("ruby_source_checksum", "sha256")
|
||||
|
||||
url "https://raw.githubusercontent.com/Homebrew/homebrew-core/#{tap_git_head}/#{ruby_source_path}"
|
||||
sha256 ruby_source_sha256 if ruby_source_sha256
|
||||
end
|
||||
|
||||
def install
|
||||
|
||||
@ -51,9 +51,9 @@ describe Homebrew::API::Cask do
|
||||
it "fetches the source of a cask (defaulting to master when no `git_head` is passed)" do
|
||||
curl_output = instance_double(SystemCommand::Result, stdout: "foo", success?: true)
|
||||
expect(Utils::Curl).to receive(:curl_output)
|
||||
.with("--fail", "https://raw.githubusercontent.com/Homebrew/homebrew-cask/master/Casks/foo.rb")
|
||||
.with("--fail", "https://raw.githubusercontent.com/Homebrew/homebrew-cask/HEAD/Casks/foo.rb")
|
||||
.and_return(curl_output)
|
||||
described_class.fetch_source("foo", git_head: nil)
|
||||
described_class.fetch_source("foo", path: "Casks/foo.rb", git_head: "HEAD")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -72,14 +72,14 @@ describe Homebrew::API do
|
||||
describe "::fetch_file_source" do
|
||||
it "fetches a file" do
|
||||
mock_curl_output stdout: json
|
||||
fetched_json = described_class.fetch_homebrew_cask_source("foo", git_head: "master")
|
||||
fetched_json = described_class.fetch_homebrew_cask_source("foo", path: "Casks/foo.rb", git_head: "HEAD")
|
||||
expect(fetched_json).to eq json
|
||||
end
|
||||
|
||||
it "raises an error if the file does not exist" do
|
||||
mock_curl_output success: false
|
||||
expect do
|
||||
described_class.fetch_homebrew_cask_source("bar", git_head: "master")
|
||||
described_class.fetch_homebrew_cask_source("bar", path: "Casks/bar.rb", git_head: "HEAD")
|
||||
end.to raise_error(ArgumentError, /No valid file found/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -93,6 +93,7 @@
|
||||
"en",
|
||||
"eo"
|
||||
],
|
||||
"ruby_source_path": "Formula/everything.rb",
|
||||
"ruby_source_checksum": {
|
||||
"sha256": "b2707d1952f02c3fa566b7ad2a707a847a959d36f51d3dee642dbe5deec12f27"
|
||||
}
|
||||
|
||||
@ -93,6 +93,7 @@
|
||||
"en",
|
||||
"eo"
|
||||
],
|
||||
"ruby_source_path": "Casks/everything.rb",
|
||||
"ruby_source_checksum": {
|
||||
"sha256": "b2707d1952f02c3fa566b7ad2a707a847a959d36f51d3dee642dbe5deec12f27"
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user