| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  | # typed: true | 
					
						
							|  |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "forwardable" | 
					
						
							|  |  |  | require "rubocops/shared/on_system_conditionals_helper" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module RuboCop | 
					
						
							|  |  |  |   module Cop | 
					
						
							|  |  |  |     module Cask | 
					
						
							|  |  |  |       # This cop makes sure that OS conditionals are consistent. | 
					
						
							|  |  |  |       # | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # ### Example | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       # ```ruby | 
					
						
							|  |  |  |       # # bad | 
					
						
							|  |  |  |       # cask 'foo' do | 
					
						
							|  |  |  |       #   if MacOS.version == :high_sierra | 
					
						
							|  |  |  |       #     sha256 "..." | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |       #   end | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # end | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |       # | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # # good | 
					
						
							|  |  |  |       # cask 'foo' do | 
					
						
							|  |  |  |       #   on_high_sierra do | 
					
						
							|  |  |  |       #     sha256 "..." | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |       #   end | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # end | 
					
						
							|  |  |  |       # ``` | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |       class OnSystemConditionals < Base | 
					
						
							|  |  |  |         extend Forwardable | 
					
						
							|  |  |  |         extend AutoCorrector | 
					
						
							|  |  |  |         include OnSystemConditionalsHelper | 
					
						
							|  |  |  |         include CaskHelp | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         FLIGHT_STANZA_NAMES = [:preflight, :postflight, :uninstall_preflight, :uninstall_postflight].freeze | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def on_cask(cask_block) | 
					
						
							|  |  |  |           @cask_block = cask_block | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           toplevel_stanzas.each do |stanza| | 
					
						
							|  |  |  |             next unless FLIGHT_STANZA_NAMES.include? stanza.stanza_name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             audit_on_system_blocks(stanza.stanza_node, stanza.stanza_name) | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-21 10:00:46 +00:00
										 |  |  |           audit_arch_conditionals(cask_body, allowed_blocks: FLIGHT_STANZA_NAMES) | 
					
						
							| 
									
										
										
										
											2022-12-28 16:09:05 -05:00
										 |  |  |           audit_macos_version_conditionals(cask_body, recommend_on_system: false) | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |           simplify_sha256_stanzas | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         attr_reader :cask_block | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def_delegators :cask_block, :toplevel_stanzas, :cask_body | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def simplify_sha256_stanzas | 
					
						
							|  |  |  |           nodes = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           sha256_on_arch_stanzas(cask_body) do |node, method, value| | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |             nodes[method.to_s.delete_prefix("on_").to_sym] = { node:, value: } | 
					
						
							| 
									
										
										
										
											2022-08-16 01:42:24 -04:00
										 |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           return if !nodes.key?(:arm) || !nodes.key?(:intel) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           offending_node(nodes[:arm][:node]) | 
					
						
							|  |  |  |           replacement_string = "sha256 arm: #{nodes[:arm][:value].inspect}, intel: #{nodes[:intel][:value].inspect}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           problem "Use `#{replacement_string}` instead of nesting the `sha256` stanzas in " \ | 
					
						
							|  |  |  |                   "`on_intel` and `on_arm` blocks" do |corrector| | 
					
						
							|  |  |  |             corrector.replace(nodes[:arm][:node].source_range, replacement_string) | 
					
						
							|  |  |  |             corrector.replace(nodes[:intel][:node].source_range, "") | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def_node_search :sha256_on_arch_stanzas, <<~PATTERN | 
					
						
							|  |  |  |           $(block | 
					
						
							|  |  |  |             (send nil? ${:on_intel :on_arm}) | 
					
						
							|  |  |  |             (args) | 
					
						
							|  |  |  |             (send nil? :sha256 | 
					
						
							|  |  |  |               (str $_))) | 
					
						
							|  |  |  |         PATTERN | 
					
						
							| 
									
										
										
										
											2022-08-14 15:39:20 -04:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |