| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | require "forwardable" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "hbc/dsl" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  | module Hbc | 
					
						
							|  |  |  |   class Cask | 
					
						
							|  |  |  |     extend Forwardable | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     attr_reader :token, :sourcefile_path | 
					
						
							|  |  |  |     def initialize(token, sourcefile_path: nil, dsl: nil, &block) | 
					
						
							|  |  |  |       @token = token | 
					
						
							|  |  |  |       @sourcefile_path = sourcefile_path | 
					
						
							|  |  |  |       @dsl = dsl || DSL.new(@token) | 
					
						
							| 
									
										
										
										
											2016-10-23 14:26:17 +02:00
										 |  |  |       return unless block_given? | 
					
						
							|  |  |  |       @dsl.instance_eval(&block) | 
					
						
							|  |  |  |       @dsl.language_eval | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     DSL::DSL_METHODS.each do |method_name| | 
					
						
							|  |  |  |       define_method(method_name) { @dsl.send(method_name) } | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     METADATA_SUBDIR = ".metadata".freeze | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def metadata_master_container_path | 
					
						
							|  |  |  |       @metadata_master_container_path ||= caskroom_path.join(METADATA_SUBDIR) | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def metadata_versioned_container_path | 
					
						
							|  |  |  |       cask_version = version ? version : :unknown | 
					
						
							|  |  |  |       metadata_master_container_path.join(cask_version.to_s) | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def metadata_path(timestamp = :latest, create = false) | 
					
						
							|  |  |  |       return nil unless metadata_versioned_container_path.respond_to?(:join) | 
					
						
							|  |  |  |       if create && timestamp == :latest | 
					
						
							|  |  |  |         raise CaskError, "Cannot create metadata path when timestamp is :latest" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       path = if timestamp == :latest | 
					
						
							| 
									
										
										
										
											2016-10-14 20:11:33 +02:00
										 |  |  |         Pathname.glob(metadata_versioned_container_path.join("*")).sort.last | 
					
						
							|  |  |  |       elsif timestamp == :now | 
					
						
							|  |  |  |         Utils.nowstamp_metadata_path(metadata_versioned_container_path) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         metadata_versioned_container_path.join(timestamp) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       if create | 
					
						
							|  |  |  |         odebug "Creating metadata directory #{path}" | 
					
						
							|  |  |  |         FileUtils.mkdir_p path | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       path | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def metadata_subdir(leaf, timestamp = :latest, create = false) | 
					
						
							|  |  |  |       if create && timestamp == :latest | 
					
						
							|  |  |  |         raise CaskError, "Cannot create metadata subdir when timestamp is :latest" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       unless leaf.respond_to?(:length) && !leaf.empty? | 
					
						
							|  |  |  |         raise CaskError, "Cannot create metadata subdir for empty leaf" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       parent = metadata_path(timestamp, create) | 
					
						
							|  |  |  |       return nil unless parent.respond_to?(:join) | 
					
						
							|  |  |  |       subdir = parent.join(leaf) | 
					
						
							|  |  |  |       if create | 
					
						
							|  |  |  |         odebug "Creating metadata subdirectory #{subdir}" | 
					
						
							|  |  |  |         FileUtils.mkdir_p subdir | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       subdir | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def timestamped_versions | 
					
						
							|  |  |  |       Pathname.glob(metadata_master_container_path.join("*", "*")) | 
					
						
							|  |  |  |               .map { |p| p.relative_path_from(metadata_master_container_path) } | 
					
						
							|  |  |  |               .sort_by(&:basename) # sort by timestamp | 
					
						
							|  |  |  |               .map(&:split) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def versions | 
					
						
							|  |  |  |       timestamped_versions.map(&:first) | 
					
						
							|  |  |  |                           .reverse | 
					
						
							|  |  |  |                           .uniq | 
					
						
							|  |  |  |                           .reverse | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def installed? | 
					
						
							|  |  |  |       !versions.empty? | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def to_s | 
					
						
							|  |  |  |       @token | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |     def dumpcask | 
					
						
							|  |  |  |       return unless Hbc.respond_to?(:debug) | 
					
						
							|  |  |  |       return unless Hbc.debug | 
					
						
							| 
									
										
										
										
											2016-09-20 15:11:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       odebug "Cask instance dumps in YAML:" | 
					
						
							|  |  |  |       odebug "Cask instance toplevel:", to_yaml | 
					
						
							|  |  |  |       [ | 
					
						
							|  |  |  |         :name, | 
					
						
							|  |  |  |         :homepage, | 
					
						
							|  |  |  |         :url, | 
					
						
							|  |  |  |         :appcast, | 
					
						
							|  |  |  |         :version, | 
					
						
							|  |  |  |         :sha256, | 
					
						
							|  |  |  |         :artifacts, | 
					
						
							|  |  |  |         :caveats, | 
					
						
							|  |  |  |         :depends_on, | 
					
						
							|  |  |  |         :conflicts_with, | 
					
						
							|  |  |  |         :container, | 
					
						
							|  |  |  |         :gpg, | 
					
						
							|  |  |  |         :accessibility_access, | 
					
						
							|  |  |  |         :auto_updates, | 
					
						
							|  |  |  |       ].each do |method| | 
					
						
							|  |  |  |         odebug "Cask instance method '#{method}':", send(method).to_yaml | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |