| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-19 19:43:15 +02:00
										 |  |  | require "source_location" | 
					
						
							| 
									
										
										
										
											2023-09-06 09:55:17 -04:00
										 |  |  | require "utils/curl" | 
					
						
							| 
									
										
										
										
											2023-05-19 19:43:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  | module Cask | 
					
						
							|  |  |  |   # Class corresponding to the `url` stanza. | 
					
						
							| 
									
										
										
										
											2024-10-14 10:50:57 -07:00
										 |  |  |   class URL < SimpleDelegator | 
					
						
							| 
									
										
										
										
											2025-07-04 10:09:41 -04:00
										 |  |  |     # Methods for the `url` stanza. | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |     class DSL | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |       sig { returns(T.any(URI::Generic, String)) } | 
					
						
							|  |  |  |       attr_reader :uri | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-04 10:09:41 -04:00
										 |  |  |       sig { returns(T.nilable(T::Hash[T.any(Symbol, String), String])) } | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |       attr_reader :revisions | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T.nilable(T::Boolean)) } | 
					
						
							|  |  |  |       attr_reader :trust_cert | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T.nilable(T::Hash[String, String])) } | 
					
						
							|  |  |  |       attr_reader :cookies, :data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T.nilable(T.any(String, T::Array[String]))) } | 
					
						
							|  |  |  |       attr_reader :header | 
					
						
							| 
									
										
										
										
											2024-10-05 18:56:38 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T.nilable(T.any(URI::Generic, String))) } | 
					
						
							|  |  |  |       attr_reader :referer | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T::Hash[Symbol, T.untyped]) } | 
					
						
							|  |  |  |       attr_reader :specs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T.nilable(T.any(Symbol, String))) } | 
					
						
							|  |  |  |       attr_reader :user_agent | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  |       sig { returns(T.any(T::Class[AbstractDownloadStrategy], Symbol, NilClass)) } | 
					
						
							| 
									
										
										
										
											2024-10-05 18:56:38 -07:00
										 |  |  |       attr_reader :using | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |       attr_reader :tag, :branch, :revision, :only_path, :verified | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       extend Forwardable | 
					
						
							|  |  |  |       def_delegators :uri, :path, :scheme, :to_s | 
					
						
							| 
									
										
										
										
											2021-03-31 06:14:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |       sig { | 
					
						
							|  |  |  |         params( | 
					
						
							|  |  |  |           uri:        T.any(URI::Generic, String), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           verified:   T.nilable(String), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  |           using:      T.any(T::Class[AbstractDownloadStrategy], Symbol, NilClass), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           tag:        T.nilable(String), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           branch:     T.nilable(String), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2025-07-04 10:09:41 -04:00
										 |  |  |           revisions:  T.nilable(T::Hash[T.any(Symbol, String), String]), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           revision:   T.nilable(String), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           trust_cert: T.nilable(T::Boolean), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           cookies:    T.nilable(T::Hash[String, String]), | 
					
						
							|  |  |  |           referer:    T.nilable(T.any(URI::Generic, String)), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-06-27 09:37:22 -04:00
										 |  |  |           header:     T.nilable(T.any(String, T::Array[String])), | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           user_agent: T.nilable(T.any(Symbol, String)), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           data:       T.nilable(T::Hash[String, String]), | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |           # @api public | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |           only_path:  T.nilable(String), | 
					
						
							|  |  |  |         ).void | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       def initialize( | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |         uri, verified: nil, using: nil, tag: nil, branch: nil, revisions: nil, revision: nil, trust_cert: nil, | 
					
						
							|  |  |  |         cookies: nil, referer: nil, header: nil, user_agent: nil, data: nil, only_path: nil | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |       ) | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |         @uri = T.let(URI(uri), T.any(URI::Generic, String)) | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 09:11:14 -04:00
										 |  |  |         header = Array(header) unless header.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |         specs = {} | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |         specs[:verified]   = @verified   = T.let(verified, T.nilable(String)) | 
					
						
							|  |  |  |         specs[:using]      = @using      = T.let(using, T.any(T::Class[AbstractDownloadStrategy], Symbol, NilClass)) | 
					
						
							|  |  |  |         specs[:tag]        = @tag        = T.let(tag, T.nilable(String)) | 
					
						
							|  |  |  |         specs[:branch]     = @branch     = T.let(branch, T.nilable(String)) | 
					
						
							| 
									
										
										
										
											2025-07-04 10:09:41 -04:00
										 |  |  |         specs[:revisions]  = @revisions  = T.let(revisions, T.nilable(T::Hash[T.any(Symbol, String), String])) | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |         specs[:revision]   = @revision   = T.let(revision, T.nilable(String)) | 
					
						
							|  |  |  |         specs[:trust_cert] = @trust_cert = T.let(trust_cert, T.nilable(T::Boolean)) | 
					
						
							|  |  |  |         specs[:cookies]    = @cookies    = T.let(cookies, T.nilable(T::Hash[String, String])) | 
					
						
							|  |  |  |         specs[:referer]    = @referer    = T.let(referer, T.nilable(T.any(URI::Generic, String))) | 
					
						
							|  |  |  |         specs[:headers]    = @header     = T.let(header, T.nilable(T.any(String, T::Array[String]))) | 
					
						
							|  |  |  |         specs[:user_agent] = @user_agent = T.let(user_agent || :default, T.nilable(T.any(Symbol, String))) | 
					
						
							|  |  |  |         specs[:data]       = @data       = T.let(data, T.nilable(T::Hash[String, String])) | 
					
						
							|  |  |  |         specs[:only_path]  = @only_path  = T.let(only_path, T.nilable(String)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @specs = T.let(specs.compact, T::Hash[Symbol, T.untyped]) | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-31 06:14:41 +02:00
										 |  |  |     sig { | 
					
						
							|  |  |  |       params( | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |         uri:             T.nilable(T.any(URI::Generic, String)), | 
					
						
							|  |  |  |         verified:        T.nilable(String), | 
					
						
							| 
									
										
										
										
											2025-03-12 11:39:01 -07:00
										 |  |  |         using:           T.any(T::Class[AbstractDownloadStrategy], Symbol, NilClass), | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |         tag:             T.nilable(String), | 
					
						
							|  |  |  |         branch:          T.nilable(String), | 
					
						
							| 
									
										
										
										
											2025-07-04 10:09:41 -04:00
										 |  |  |         revisions:       T.nilable(T::Hash[T.any(Symbol, String), String]), | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |         revision:        T.nilable(String), | 
					
						
							|  |  |  |         trust_cert:      T.nilable(T::Boolean), | 
					
						
							|  |  |  |         cookies:         T.nilable(T::Hash[String, String]), | 
					
						
							|  |  |  |         referer:         T.nilable(T.any(URI::Generic, String)), | 
					
						
							| 
									
										
										
										
											2023-11-09 10:23:13 +11:00
										 |  |  |         header:          T.nilable(T.any(String, T::Array[String])), | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |         user_agent:      T.nilable(T.any(Symbol, String)), | 
					
						
							|  |  |  |         data:            T.nilable(T::Hash[String, String]), | 
					
						
							|  |  |  |         only_path:       T.nilable(String), | 
					
						
							|  |  |  |         caller_location: Thread::Backtrace::Location, | 
					
						
							|  |  |  |         dsl:             T.nilable(::Cask::DSL), | 
					
						
							| 
									
										
										
										
											2021-03-31 06:14:41 +02:00
										 |  |  |       ).void | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     def initialize( | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |       uri = nil, verified: nil, using: nil, tag: nil, branch: nil, revisions: nil, revision: nil, trust_cert: nil, | 
					
						
							|  |  |  |       cookies: nil, referer: nil, header: nil, user_agent: nil, data: nil, only_path: nil, | 
					
						
							| 
									
										
										
										
											2025-07-30 08:32:22 +01:00
										 |  |  |       caller_location: caller_locations.fetch(0), dsl: nil | 
					
						
							| 
									
										
										
										
											2021-03-31 06:14:41 +02:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |       super( | 
					
						
							| 
									
										
										
										
											2025-07-30 08:32:22 +01:00
										 |  |  |         DSL.new(T.must(uri), verified:, using:, tag:, branch:, revisions:, revision:, trust_cert:, cookies:, | 
					
						
							|  |  |  |         referer:, header:, user_agent:, data:, only_path:) | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |       ) | 
					
						
							| 
									
										
										
										
											2021-03-31 06:14:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |       @caller_location = T.let(caller_location, Thread::Backtrace::Location) | 
					
						
							| 
									
										
										
										
											2021-03-31 06:14:41 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-19 19:43:15 +02:00
										 |  |  |     sig { returns(Homebrew::SourceLocation) } | 
					
						
							|  |  |  |     def location | 
					
						
							|  |  |  |       Homebrew::SourceLocation.new(@caller_location.lineno, raw_url_line&.index("url")) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |     sig { params(ignore_major_version: T::Boolean).returns(T::Boolean) } | 
					
						
							|  |  |  |     def unversioned?(ignore_major_version: false) | 
					
						
							| 
									
										
										
										
											2023-05-19 19:43:15 +02:00
										 |  |  |       interpolated_url = raw_url_line&.then { |line| line[/url\s+"([^"]+)"/, 1] } | 
					
						
							| 
									
										
										
										
											2021-03-31 06:14:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |       return false unless interpolated_url | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-10 16:15:33 +09:00
										 |  |  |       interpolated_url = interpolated_url.gsub(/\#{\s*arch\s*}/, "") | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |       interpolated_url = interpolated_url.gsub(/\#{\s*version\s*\.major\s*}/, "") if ignore_major_version | 
					
						
							| 
									
										
										
										
											2020-12-07 18:46:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |       interpolated_url.exclude?('#{') | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-12-12 06:01:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-05 18:56:38 -07:00
										 |  |  |     private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sig { returns(T.nilable(String)) } | 
					
						
							|  |  |  |     def raw_url_line | 
					
						
							|  |  |  |       return @raw_url_line if defined?(@raw_url_line) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |       @raw_url_line = T.let(Pathname(T.must(@caller_location.path)) | 
					
						
							| 
									
										
										
										
											2024-10-05 18:56:38 -07:00
										 |  |  |                       .each_line | 
					
						
							|  |  |  |                       .drop(@caller_location.lineno - 1) | 
					
						
							| 
									
										
										
										
											2025-03-12 19:05:01 -07:00
										 |  |  |                       .first, T.nilable(String)) | 
					
						
							| 
									
										
										
										
											2024-10-05 18:56:38 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-12-12 06:01:26 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | end |