| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  | # Never `require` anything in this file (except English). It needs to be able to | 
					
						
							|  |  |  | # work as the first item in `brew.rb` so we can load gems with Bundler when | 
					
						
							|  |  |  | # needed before anything else is loaded (e.g. `json`). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "English" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # Keep in sync with the `Gemfile.lock`'s BUNDLED WITH. | 
					
						
							| 
									
										
										
										
											2022-10-08 18:58:13 +01:00
										 |  |  |   # After updating this, run `brew vendor-gems --update=--bundler`. | 
					
						
							| 
									
										
										
										
											2024-06-14 02:29:30 +01:00
										 |  |  |   HOMEBREW_BUNDLER_VERSION = "2.5.11" | 
					
						
							| 
									
										
										
										
											2020-01-01 15:47:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-11 13:58:59 -08:00
										 |  |  |   # Bump this whenever a committed vendored gem is later added to or exclusion removed from gitignore. | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  |   # This will trigger it to reinstall properly if `brew install-bundler-gems` needs it. | 
					
						
							| 
									
										
										
										
											2024-05-16 14:57:20 +09:00
										 |  |  |   VENDOR_VERSION = 7
 | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  |   private_constant :VENDOR_VERSION | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   RUBY_BUNDLE_VENDOR_DIRECTORY = (HOMEBREW_LIBRARY_PATH/"vendor/bundle/ruby").freeze | 
					
						
							|  |  |  |   private_constant :RUBY_BUNDLE_VENDOR_DIRECTORY | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # This is tracked across Ruby versions. | 
					
						
							|  |  |  |   GEM_GROUPS_FILE = (RUBY_BUNDLE_VENDOR_DIRECTORY/".homebrew_gem_groups").freeze | 
					
						
							| 
									
										
										
										
											2023-09-04 21:48:26 +01:00
										 |  |  |   private_constant :GEM_GROUPS_FILE | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  |   # This is tracked per Ruby version. | 
					
						
							|  |  |  |   VENDOR_VERSION_FILE = ( | 
					
						
							|  |  |  |     RUBY_BUNDLE_VENDOR_DIRECTORY/"#{RbConfig::CONFIG["ruby_version"]}/.homebrew_vendor_version" | 
					
						
							|  |  |  |   ).freeze | 
					
						
							|  |  |  |   private_constant :VENDOR_VERSION_FILE | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-10 16:53:59 +01:00
										 |  |  |   def gemfile | 
					
						
							|  |  |  |     File.join(ENV.fetch("HOMEBREW_LIBRARY"), "Homebrew", "Gemfile") | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-03-06 01:00:39 +01:00
										 |  |  |   private_class_method :gemfile | 
					
						
							| 
									
										
										
										
											2023-04-10 16:53:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  |   def bundler_definition | 
					
						
							|  |  |  |     @bundler_definition ||= Bundler::Definition.build(Bundler.default_gemfile, Bundler.default_lockfile, false) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-03-06 01:00:39 +01:00
										 |  |  |   private_class_method :bundler_definition | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-10 16:53:59 +01:00
										 |  |  |   def valid_gem_groups | 
					
						
							|  |  |  |     install_bundler! | 
					
						
							|  |  |  |     require "bundler" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Bundler.with_unbundled_env do | 
					
						
							|  |  |  |       ENV["BUNDLE_GEMFILE"] = gemfile | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  |       groups = bundler_definition.groups | 
					
						
							| 
									
										
										
										
											2023-04-10 16:53:59 +01:00
										 |  |  |       groups.delete(:default) | 
					
						
							|  |  |  |       groups.map(&:to_s) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |   def ruby_bindir | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  |     "#{RbConfig::CONFIG["prefix"]}/bin" | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |   def ohai_if_defined(message) | 
					
						
							|  |  |  |     if defined?(ohai) | 
					
						
							| 
									
										
										
										
											2020-11-28 20:33:24 +01:00
										 |  |  |       $stderr.ohai message | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2020-11-28 20:33:24 +01:00
										 |  |  |       $stderr.puts "==> #{message}" | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-25 15:59:17 +00:00
										 |  |  |   def opoo_if_defined(message) | 
					
						
							|  |  |  |     if defined?(opoo) | 
					
						
							|  |  |  |       $stderr.opoo message | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       $stderr.puts "Warning: #{message}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |   def odie_if_defined(message) | 
					
						
							|  |  |  |     if defined?(odie) | 
					
						
							|  |  |  |       odie message | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       $stderr.puts "Error: #{message}" | 
					
						
							|  |  |  |       exit 1
 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-08 16:01:16 +01:00
										 |  |  |   def setup_gem_environment!(setup_path: true) | 
					
						
							| 
									
										
										
										
											2022-10-24 19:42:49 +01:00
										 |  |  |     require "rubygems" | 
					
						
							|  |  |  |     raise "RubyGems too old!" if Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.2.0") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-16 01:26:36 +01:00
										 |  |  |     ENV["BUNDLER_NO_OLD_RUBYGEMS_WARNING"] = "1" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |     # Match where our bundler gems are. | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  |     gem_home = "#{RUBY_BUNDLE_VENDOR_DIRECTORY}/#{RbConfig::CONFIG["ruby_version"]}" | 
					
						
							| 
									
										
										
										
											2021-02-27 15:50:08 +00:00
										 |  |  |     Gem.paths = { | 
					
						
							|  |  |  |       "GEM_HOME" => gem_home, | 
					
						
							|  |  |  |       "GEM_PATH" => gem_home, | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-05 15:30:50 +02:00
										 |  |  |     # Set TMPDIR so Xcode's `make` doesn't fall back to `/var/tmp/`, | 
					
						
							|  |  |  |     # which may be not user-writable. | 
					
						
							| 
									
										
										
										
											2022-05-30 04:37:09 +01:00
										 |  |  |     ENV["TMPDIR"] = ENV.fetch("HOMEBREW_TEMP", nil) | 
					
						
							| 
									
										
										
										
											2020-04-05 15:30:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-24 18:04:26 +00:00
										 |  |  |     return unless setup_path | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-29 16:09:10 +01:00
										 |  |  |     # Add necessary Ruby and Gem binary directories to `PATH`. | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |     paths = ENV.fetch("PATH").split(":") | 
					
						
							| 
									
										
										
										
											2020-04-05 15:38:10 +01:00
										 |  |  |     paths.unshift(ruby_bindir) unless paths.include?(ruby_bindir) | 
					
						
							| 
									
										
										
										
											2022-10-08 16:01:16 +01:00
										 |  |  |     paths.unshift(Gem.bindir) unless paths.include?(Gem.bindir) | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |     ENV["PATH"] = paths.compact.join(":") | 
					
						
							| 
									
										
										
										
											2021-02-28 01:26:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Set envs so the above binaries can be invoked. | 
					
						
							|  |  |  |     # We don't do this unless requested as some formulae may invoke system Ruby instead of ours. | 
					
						
							|  |  |  |     ENV["GEM_HOME"] = gem_home | 
					
						
							|  |  |  |     ENV["GEM_PATH"] = gem_home | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-28 08:31:18 +00:00
										 |  |  |   def install_gem!(name, version: nil, setup_gem_environment: true) | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |     setup_gem_environment! if setup_gem_environment | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-28 01:26:08 +00:00
										 |  |  |     specs = Gem::Specification.find_all_by_name(name, version) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if specs.empty? | 
					
						
							|  |  |  |       ohai_if_defined "Installing '#{name}' gem" | 
					
						
							| 
									
										
										
										
											2022-10-17 22:24:08 +01:00
										 |  |  |       # `document: []` is equivalent to --no-document | 
					
						
							|  |  |  |       # `build_args: []` stops ARGV being used as a default | 
					
						
							| 
									
										
										
										
											2022-11-19 00:58:05 +00:00
										 |  |  |       # `env_shebang: true` makes shebangs generic to allow switching between system and Portable Ruby | 
					
						
							|  |  |  |       specs = Gem.install name, version, document: [], build_args: [], env_shebang: true | 
					
						
							| 
									
										
										
										
											2021-02-28 01:26:08 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-26 20:36:26 +00:00
										 |  |  |     specs += specs.flat_map(&:runtime_dependencies) | 
					
						
							|  |  |  |                   .flat_map(&:to_specs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Add the specs to the $LOAD_PATH. | 
					
						
							| 
									
										
										
										
											2021-02-28 01:26:08 +00:00
										 |  |  |     specs.each do |spec| | 
					
						
							|  |  |  |       spec.require_paths.each do |path| | 
					
						
							|  |  |  |         full_path = File.join(spec.full_gem_path, path) | 
					
						
							|  |  |  |         $LOAD_PATH.unshift full_path unless $LOAD_PATH.include?(full_path) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-06-04 11:36:58 +05:30
										 |  |  |   rescue Gem::UnsatisfiableDependencyError | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |     odie_if_defined "failed to install the '#{name}' gem." | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-28 08:31:18 +00:00
										 |  |  |   def install_gem_setup_path!(name, version: nil, executable: name, setup_gem_environment: true) | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |     install_gem!(name, version:, setup_gem_environment:) | 
					
						
							| 
									
										
										
										
											2019-10-30 13:49:17 +00:00
										 |  |  |     return if find_in_path(executable) | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |     odie_if_defined <<~EOS | 
					
						
							|  |  |  |       the '#{name}' gem is installed but couldn't find '#{executable}' in the PATH: | 
					
						
							| 
									
										
										
										
											2022-05-30 04:37:09 +01:00
										 |  |  |         #{ENV.fetch("PATH")} | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |     EOS | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-30 13:49:17 +00:00
										 |  |  |   def find_in_path(executable) | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |     ENV.fetch("PATH").split(":").find do |path| | 
					
						
							|  |  |  |       File.executable?(File.join(path, executable)) | 
					
						
							| 
									
										
										
										
											2019-10-30 13:49:17 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-03-06 01:00:39 +01:00
										 |  |  |   private_class_method :find_in_path | 
					
						
							| 
									
										
										
										
											2019-10-30 13:49:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |   def install_bundler! | 
					
						
							| 
									
										
										
										
											2023-06-06 23:32:52 +01:00
										 |  |  |     old_bundler_version = ENV.fetch("BUNDLER_VERSION", nil) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-08 16:01:16 +01:00
										 |  |  |     setup_gem_environment! | 
					
						
							| 
									
										
										
										
											2023-06-06 23:32:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ENV["BUNDLER_VERSION"] = HOMEBREW_BUNDLER_VERSION # Set so it correctly finds existing installs | 
					
						
							| 
									
										
										
										
											2020-01-01 15:47:06 +00:00
										 |  |  |     install_gem_setup_path!( | 
					
						
							|  |  |  |       "bundler", | 
					
						
							|  |  |  |       version:               HOMEBREW_BUNDLER_VERSION, | 
					
						
							|  |  |  |       executable:            "bundle", | 
					
						
							|  |  |  |       setup_gem_environment: false, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-06-06 23:32:52 +01:00
										 |  |  |   ensure | 
					
						
							|  |  |  |     ENV["BUNDLER_VERSION"] = old_bundler_version | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-04 21:48:26 +01:00
										 |  |  |   def user_gem_groups | 
					
						
							|  |  |  |     @user_gem_groups ||= if GEM_GROUPS_FILE.exist? | 
					
						
							|  |  |  |       GEM_GROUPS_FILE.readlines(chomp: true) | 
					
						
							| 
									
										
										
										
											2023-09-29 01:58:41 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       [] | 
					
						
							| 
									
										
										
										
											2023-09-04 21:48:26 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-03-06 01:00:39 +01:00
										 |  |  |   private_class_method :user_gem_groups | 
					
						
							| 
									
										
										
										
											2023-09-04 21:48:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def write_user_gem_groups(groups) | 
					
						
							| 
									
										
										
										
											2023-11-09 14:57:47 +00:00
										 |  |  |     return if @user_gem_groups == groups && GEM_GROUPS_FILE.exist? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-30 20:26:08 +00:00
										 |  |  |     # Write the file atomically, in case we're working parallel | 
					
						
							|  |  |  |     require "tempfile" | 
					
						
							|  |  |  |     tmpfile = Tempfile.new([GEM_GROUPS_FILE.basename.to_s, "~"], GEM_GROUPS_FILE.dirname) | 
					
						
							| 
									
										
										
										
											2023-11-09 14:57:47 +00:00
										 |  |  |     path = tmpfile.path | 
					
						
							|  |  |  |     return if path.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     require "fileutils" | 
					
						
							| 
									
										
										
										
											2023-10-30 20:26:08 +00:00
										 |  |  |     begin | 
					
						
							| 
									
										
										
										
											2023-11-09 14:57:47 +00:00
										 |  |  |       FileUtils.chmod("+r", path) | 
					
						
							| 
									
										
										
										
											2023-10-30 20:26:08 +00:00
										 |  |  |       tmpfile.write(groups.join("\n")) | 
					
						
							|  |  |  |       tmpfile.close | 
					
						
							| 
									
										
										
										
											2023-11-09 14:57:47 +00:00
										 |  |  |       File.rename(path, GEM_GROUPS_FILE) | 
					
						
							| 
									
										
										
										
											2023-10-30 20:26:08 +00:00
										 |  |  |     ensure | 
					
						
							|  |  |  |       tmpfile.unlink | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2023-11-09 14:57:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @user_gem_groups = groups | 
					
						
							| 
									
										
										
										
											2023-09-04 21:48:26 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-03-06 01:00:39 +01:00
										 |  |  |   private_class_method :write_user_gem_groups | 
					
						
							| 
									
										
										
										
											2023-09-04 21:48:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def forget_user_gem_groups! | 
					
						
							| 
									
										
										
										
											2023-12-12 03:09:59 +00:00
										 |  |  |     GEM_GROUPS_FILE.truncate(0) if GEM_GROUPS_FILE.exist? | 
					
						
							| 
									
										
										
										
											2023-11-09 14:57:47 +00:00
										 |  |  |     @user_gem_groups = [] | 
					
						
							| 
									
										
										
										
											2023-09-04 21:48:26 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  |   def user_vendor_version | 
					
						
							|  |  |  |     @user_vendor_version ||= if VENDOR_VERSION_FILE.exist? | 
					
						
							|  |  |  |       VENDOR_VERSION_FILE.read.to_i | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       0
 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-03-06 01:00:39 +01:00
										 |  |  |   private_class_method :user_vendor_version | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  |   def install_bundler_gems!(only_warn_on_failure: false, setup_path: true, groups: []) | 
					
						
							| 
									
										
										
										
											2022-05-30 04:37:09 +01:00
										 |  |  |     old_path = ENV.fetch("PATH", nil) | 
					
						
							|  |  |  |     old_gem_path = ENV.fetch("GEM_PATH", nil) | 
					
						
							|  |  |  |     old_gem_home = ENV.fetch("GEM_HOME", nil) | 
					
						
							|  |  |  |     old_bundle_gemfile = ENV.fetch("BUNDLE_GEMFILE", nil) | 
					
						
							|  |  |  |     old_bundle_with = ENV.fetch("BUNDLE_WITH", nil) | 
					
						
							| 
									
										
										
										
											2022-10-08 16:02:37 +01:00
										 |  |  |     old_bundle_frozen = ENV.fetch("BUNDLE_FROZEN", nil) | 
					
						
							| 
									
										
										
										
											2021-03-10 04:46:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-10 16:53:59 +01:00
										 |  |  |     invalid_groups = groups - valid_gem_groups | 
					
						
							| 
									
										
										
										
											2023-04-10 13:11:38 +01:00
										 |  |  |     raise ArgumentError, "Invalid gem groups: #{invalid_groups.join(", ")}" unless invalid_groups.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-30 11:10:23 +02:00
										 |  |  |     # Tests should not modify the state of the repository. | 
					
						
							| 
									
										
										
										
											2023-04-24 17:05:38 +01:00
										 |  |  |     if ENV["HOMEBREW_TESTS"] | 
					
						
							|  |  |  |       setup_gem_environment! | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |     install_bundler! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |     # Combine the passed groups with the ones stored in settings. | 
					
						
							| 
									
										
										
										
											2023-12-14 15:34:15 +00:00
										 |  |  |     groups |= (user_gem_groups & valid_gem_groups) | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  |     groups.sort! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-18 00:08:42 +09:00
										 |  |  |     if (homebrew_bundle_user_cache = ENV.fetch("HOMEBREW_BUNDLE_USER_CACHE", nil)) | 
					
						
							|  |  |  |       ENV["BUNDLE_USER_CACHE"] = homebrew_bundle_user_cache | 
					
						
							| 
									
										
										
										
											2024-05-16 11:08:51 +09:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2023-04-10 16:53:59 +01:00
										 |  |  |     ENV["BUNDLE_GEMFILE"] = gemfile | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  |     ENV["BUNDLE_WITH"] = groups.join(" ") | 
					
						
							| 
									
										
										
										
											2022-10-08 16:02:37 +01:00
										 |  |  |     ENV["BUNDLE_FROZEN"] = "true" | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if @bundle_installed_groups != groups | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |       bundle = File.join(find_in_path("bundle"), "bundle") | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |       bundle_check_output = `#{bundle} check 2>&1` | 
					
						
							| 
									
										
										
										
											2019-10-04 09:19:02 +02:00
										 |  |  |       bundle_check_failed = !$CHILD_STATUS.success? | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # for some reason sometimes the exit code lies so check the output too. | 
					
						
							| 
									
										
										
										
											2023-09-04 21:54:30 +01:00
										 |  |  |       bundle_install_required = bundle_check_failed || bundle_check_output.include?("Install missing gems") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if user_vendor_version != VENDOR_VERSION | 
					
						
							|  |  |  |         # Check if the install is intact. This is useful if any gems are added to gitignore. | 
					
						
							|  |  |  |         # We intentionally map over everything and then call `any?` so that we remove the spec of each bad gem. | 
					
						
							|  |  |  |         specs = bundler_definition.resolve.materialize(bundler_definition.locked_dependencies) | 
					
						
							|  |  |  |         vendor_reinstall_required = specs.map do |spec| | 
					
						
							|  |  |  |           spec_file = "#{Gem.dir}/specifications/#{spec.full_name}.gemspec" | 
					
						
							|  |  |  |           next false unless File.exist?(spec_file) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           cache_file = "#{Gem.dir}/cache/#{spec.full_name}.gem" | 
					
						
							|  |  |  |           if File.exist?(cache_file) | 
					
						
							|  |  |  |             require "rubygems/package" | 
					
						
							|  |  |  |             package = Gem::Package.new(cache_file) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             package_install_intact = begin | 
					
						
							|  |  |  |               contents = package.contents | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               # If the gem has contents, ensure we have every file installed it contains. | 
					
						
							|  |  |  |               contents&.all? do |gem_file| | 
					
						
							|  |  |  |                 File.exist?("#{Gem.dir}/gems/#{spec.full_name}/#{gem_file}") | 
					
						
							|  |  |  |               end | 
					
						
							|  |  |  |             rescue Gem::Package::Error, Gem::Security::Exception | 
					
						
							|  |  |  |               # Malformed, assume broken | 
					
						
							|  |  |  |               File.unlink(cache_file) | 
					
						
							|  |  |  |               false | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             next false if package_install_intact | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # Mark gem for reinstallation | 
					
						
							|  |  |  |           File.unlink(spec_file) | 
					
						
							|  |  |  |           true | 
					
						
							|  |  |  |         end.any? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         VENDOR_VERSION_FILE.dirname.mkpath | 
					
						
							|  |  |  |         VENDOR_VERSION_FILE.write(VENDOR_VERSION.to_s) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bundle_install_required ||= vendor_reinstall_required | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       bundle_installed = if bundle_install_required | 
					
						
							| 
									
										
										
										
											2024-05-01 14:28:16 +01:00
										 |  |  |         Process.wait(fork do | 
					
						
							|  |  |  |           # Native build scripts fail if EUID != UID | 
					
						
							|  |  |  |           Process::UID.change_privilege(Process.euid) if Process.euid != Process.uid | 
					
						
							|  |  |  |           exec bundle, "install", out: :err | 
					
						
							|  |  |  |         end) | 
					
						
							|  |  |  |         if $CHILD_STATUS.success? | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  |           true | 
					
						
							|  |  |  |         else | 
					
						
							| 
									
										
										
										
											2021-02-25 15:59:17 +00:00
										 |  |  |           message = <<~EOS | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |             failed to run `#{bundle} install`! | 
					
						
							|  |  |  |           EOS | 
					
						
							| 
									
										
										
										
											2021-02-25 15:59:17 +00:00
										 |  |  |           if only_warn_on_failure | 
					
						
							|  |  |  |             opoo_if_defined message | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             odie_if_defined message | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  |           false | 
					
						
							| 
									
										
										
										
											2019-02-26 22:13:00 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-09-27 20:05:03 +01:00
										 |  |  |       elsif system bundle, "clean", out: :err # even if we have nothing to install, we may have removed gems | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |         true | 
					
						
							| 
									
										
										
										
											2023-04-24 15:46:30 +01:00
										 |  |  |       else | 
					
						
							|  |  |  |         message = <<~EOS | 
					
						
							|  |  |  |           failed to run `#{bundle} clean`! | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |         if only_warn_on_failure | 
					
						
							|  |  |  |           opoo_if_defined message | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           odie_if_defined message | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         false | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if bundle_installed | 
					
						
							| 
									
										
										
										
											2023-09-04 21:48:26 +01:00
										 |  |  |         write_user_gem_groups(groups) | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  |         @bundle_installed_groups = groups | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setup_gem_environment! | 
					
						
							| 
									
										
										
										
											2021-03-10 04:46:39 +00:00
										 |  |  |   ensure | 
					
						
							|  |  |  |     unless setup_path | 
					
						
							|  |  |  |       # Reset the paths. We need to have at least temporarily changed them while invoking `bundle`. | 
					
						
							|  |  |  |       ENV["PATH"] = old_path | 
					
						
							|  |  |  |       ENV["GEM_PATH"] = old_gem_path | 
					
						
							|  |  |  |       ENV["GEM_HOME"] = old_gem_home | 
					
						
							| 
									
										
										
										
											2021-03-27 02:15:56 +00:00
										 |  |  |       ENV["BUNDLE_GEMFILE"] = old_bundle_gemfile | 
					
						
							| 
									
										
										
										
											2021-05-12 16:07:47 +01:00
										 |  |  |       ENV["BUNDLE_WITH"] = old_bundle_with | 
					
						
							| 
									
										
										
										
											2022-10-08 16:02:37 +01:00
										 |  |  |       ENV["BUNDLE_FROZEN"] = old_bundle_frozen | 
					
						
							| 
									
										
										
										
											2021-03-10 04:46:39 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2019-02-20 12:28:59 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | end |