| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  | # typed: true | 
					
						
							|  |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 08:49:39 -04:00
										 |  |  | require "macos_version" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2023-07-17 12:30:12 -07:00
										 |  |  |   # Helper module for simulating different system configurations. | 
					
						
							| 
									
										
										
										
											2022-06-28 15:04:30 -04:00
										 |  |  |   class SimulateSystem | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  |     class << self | 
					
						
							| 
									
										
										
										
											2022-11-21 21:04:22 -08:00
										 |  |  |       attr_reader :arch, :os | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-13 22:35:08 +02:00
										 |  |  |       sig { | 
					
						
							|  |  |  |         type_parameters(:U).params( | 
					
						
							|  |  |  |           os:     Symbol, | 
					
						
							|  |  |  |           arch:   Symbol, | 
					
						
							|  |  |  |           _block: T.proc.returns(T.type_parameter(:U)), | 
					
						
							|  |  |  |         ).returns(T.type_parameter(:U)) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       def with(os: T.unsafe(nil), arch: T.unsafe(nil), &_block) | 
					
						
							|  |  |  |         raise ArgumentError, "At least one of `os` or `arch` must be specified." if !os && !arch | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-15 13:44:51 +08:00
										 |  |  |         old_os = self.os | 
					
						
							|  |  |  |         old_arch = self.arch | 
					
						
							| 
									
										
										
										
											2023-05-13 22:35:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         begin | 
					
						
							| 
									
										
										
										
											2023-05-05 07:34:19 +02:00
										 |  |  |           self.os = os if os && os != current_os | 
					
						
							|  |  |  |           self.arch = arch if arch && arch != current_arch | 
					
						
							| 
									
										
										
										
											2023-05-13 22:35:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |           yield | 
					
						
							|  |  |  |         ensure | 
					
						
							| 
									
										
										
										
											2023-05-15 13:44:51 +08:00
										 |  |  |           @os = old_os | 
					
						
							|  |  |  |           @arch = old_arch | 
					
						
							| 
									
										
										
										
											2023-05-13 22:35:08 +02:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  |       sig { params(new_os: Symbol).void } | 
					
						
							|  |  |  |       def os=(new_os) | 
					
						
							| 
									
										
										
										
											2023-05-09 02:15:28 +02:00
										 |  |  |         os_options = [:macos, :linux, *MacOSVersion::SYMBOLS.keys] | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  |         raise "Unknown OS: #{new_os}" unless os_options.include?(new_os) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @os = new_os | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { params(new_arch: Symbol).void } | 
					
						
							|  |  |  |       def arch=(new_arch) | 
					
						
							| 
									
										
										
										
											2023-05-13 22:35:08 +02:00
										 |  |  |         raise "New arch must be :arm or :intel" unless OnSystem::ARCH_OPTIONS.include?(new_arch) | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         @arch = new_arch | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { void } | 
					
						
							|  |  |  |       def clear | 
					
						
							|  |  |  |         @os = @arch = nil | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2022-07-28 09:18:16 -04:00
										 |  |  |       def simulating_or_running_on_macos? | 
					
						
							| 
									
										
										
										
											2023-05-09 02:15:28 +02:00
										 |  |  |         [:macos, *MacOSVersion::SYMBOLS.keys].include?(os) | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2022-07-28 09:18:16 -04:00
										 |  |  |       def simulating_or_running_on_linux? | 
					
						
							| 
									
										
										
										
											2022-07-28 14:52:19 -04:00
										 |  |  |         os == :linux | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2022-07-23 02:00:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(Symbol) } | 
					
						
							|  |  |  |       def current_arch | 
					
						
							|  |  |  |         @arch || Hardware::CPU.type | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(Symbol) } | 
					
						
							|  |  |  |       def current_os | 
					
						
							| 
									
										
										
										
											2022-11-21 21:04:22 -08:00
										 |  |  |         os || :generic | 
					
						
							| 
									
										
										
										
											2022-07-23 02:00:28 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2022-06-23 17:18:58 -04:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2022-11-21 21:04:22 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | require "extend/os/simulate_system" |