6
6
require "uri"
7
7
require "utils/curl"
8
8
require "extend/hash/keys"
9
+ require "api"
9
10
10
11
module Cask
11
12
# Loads a cask from various sources.
@@ -104,15 +105,23 @@ def self.try_new(ref, warn: false)
104
105
return
105
106
end
106
107
107
- return if %w[ .rb .json ] . exclude? ( path . extname )
108
108
return unless path . expand_path . exist?
109
+ return if invalid_path? ( path )
109
110
110
111
return if Homebrew ::EnvConfig . forbid_packages_from_paths? &&
111
112
!path . realpath . to_s . start_with? ( "#{ Caskroom . path } /" , "#{ HOMEBREW_LIBRARY } /Taps/" )
112
113
113
114
new ( path )
114
115
end
115
116
117
+ sig { params ( pathname : Pathname , valid_extnames : T ::Array [ String ] ) . returns ( T ::Boolean ) }
118
+ def self . invalid_path? ( pathname , valid_extnames : %w[ .rb .json ] )
119
+ return true if valid_extnames . exclude? ( pathname . extname )
120
+
121
+ @invalid_basenames ||= %w[ INSTALL_RECEIPT.json sbom.spdx.json ] . freeze
122
+ @invalid_basenames . include? ( pathname . basename . to_s )
123
+ end
124
+
116
125
attr_reader :token , :path
117
126
118
127
sig { params ( path : T . any ( Pathname , String ) , token : String ) . void }
@@ -135,8 +144,10 @@ def load(config:)
135
144
@content = path . read ( encoding : "UTF-8" )
136
145
@config = config
137
146
138
- if path . extname == ".json"
139
- return FromAPILoader . new ( token , from_json : JSON . parse ( @content ) , path :) . load ( config :)
147
+ if !self . class . invalid_path? ( path , valid_extnames : %w[ .json ] ) &&
148
+ ( from_json = JSON . parse ( @content ) . presence ) &&
149
+ from_json . is_a? ( Hash )
150
+ return FromAPILoader . new ( token , from_json :, path :) . load ( config :)
140
151
end
141
152
142
153
begin
@@ -284,7 +295,7 @@ class FromAPILoader
284
295
sig { returns ( Pathname ) }
285
296
attr_reader :path
286
297
287
- sig { returns ( T . nilable ( Hash ) ) }
298
+ sig { returns ( T . nilable ( T :: Hash [ T . any ( String , Symbol ) , T . anything ] ) ) }
288
299
attr_reader :from_json
289
300
290
301
sig {
@@ -306,7 +317,13 @@ def self.try_new(ref, warn: false)
306
317
new ( "#{ tap } /#{ token } " )
307
318
end
308
319
309
- sig { params ( token : String , from_json : Hash , path : T . nilable ( Pathname ) ) . void }
320
+ sig {
321
+ params (
322
+ token : String ,
323
+ from_json : T . nilable ( T ::Hash [ T . any ( String , Symbol ) , T . anything ] ) ,
324
+ path : T . nilable ( Pathname ) ,
325
+ ) . void
326
+ }
310
327
def initialize ( token , from_json : T . unsafe ( nil ) , path : nil )
311
328
@token = token . sub ( %r{^homebrew/(?:homebrew-)?cask/}i , "" )
312
329
@sourcefile_path = path || Homebrew ::API ::Cask . cached_json_file_path
@@ -400,7 +417,7 @@ def load(config:)
400
417
container ( **container_hash )
401
418
end
402
419
403
- json_cask [ :artifacts ] . each do |artifact |
420
+ json_cask [ :artifacts ] & .each do |artifact |
404
421
# convert generic string replacements into actual ones
405
422
artifact = cask . loader . from_h_gsubs ( artifact , appdir )
406
423
key = artifact . keys . first
0 commit comments