| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | require "migrator" | 
					
						
							|  |  |  | require "formulary" | 
					
						
							|  |  |  | require "descriptions" | 
					
						
							| 
									
										
										
										
											2016-06-01 08:46:33 +01:00
										 |  |  | require "cleanup" | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  | require "description_cache_store" | 
					
						
							| 
									
										
										
										
											2019-04-17 18:25:08 +09:00
										 |  |  | require "cli/parser" | 
					
						
							| 
									
										
										
										
											2021-01-12 16:27:25 -05:00
										 |  |  | require "settings" | 
					
						
							| 
									
										
										
										
											2021-10-07 11:16:03 +01:00
										 |  |  | require "linuxbrew-core-migration" | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   extend T::Sig | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 01:44:51 +02:00
										 |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |   def auto_update_header(args:) | 
					
						
							|  |  |  |     @auto_update_header ||= begin | 
					
						
							|  |  |  |       ohai "Auto-updated Homebrew!" if args.auto_update? | 
					
						
							| 
									
										
										
										
											2016-04-11 09:31:50 +01:00
										 |  |  |       true | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(CLI::Parser) } | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  |   def update_report_args | 
					
						
							|  |  |  |     Homebrew::CLI::Parser.new do | 
					
						
							| 
									
										
										
										
											2021-01-15 15:04:02 -05:00
										 |  |  |       description <<~EOS | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  |         The Ruby implementation of `brew update`. Never called manually. | 
					
						
							|  |  |  |       EOS | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |       switch "--auto-update", "--preinstall", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Run in 'auto-update' mode (faster, less output)." | 
					
						
							| 
									
										
										
										
											2020-07-27 03:59:52 +02:00
										 |  |  |       switch "-f", "--force", | 
					
						
							| 
									
										
										
										
											2022-06-28 10:09:59 +01:00
										 |  |  |              description: "Treat installed and updated formulae as if they are from " \ | 
					
						
							| 
									
										
										
										
											2020-07-27 03:59:52 +02:00
										 |  |  |                           "the same taps and migrate them anyway." | 
					
						
							| 
									
										
										
										
											2020-07-30 18:40:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  |       hide_from_man_page! | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   def update_report | 
					
						
							| 
									
										
										
										
											2021-11-24 00:46:02 +08:00
										 |  |  |     return output_update_report if $stdout.tty? | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     redirect_stdout($stderr) do | 
					
						
							| 
									
										
										
										
											2021-11-24 00:46:02 +08:00
										 |  |  |       output_update_report | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-24 00:46:02 +08:00
										 |  |  |   def output_update_report | 
					
						
							| 
									
										
										
										
											2020-07-25 21:33:48 +02:00
										 |  |  |     args = update_report_args.parse | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 11:01:38 +01:00
										 |  |  |     # Run `brew update` (again) if we've got a linuxbrew-core CoreTap | 
					
						
							| 
									
										
										
										
											2021-10-25 16:52:29 +01:00
										 |  |  |     if CoreTap.instance.installed? && CoreTap.instance.linuxbrew_core? && | 
					
						
							|  |  |  |        ENV["HOMEBREW_LINUXBREW_CORE_MIGRATION"].blank? | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |       ohai "Re-running `brew update` for linuxbrew-core migration" | 
					
						
							| 
									
										
										
										
											2021-10-21 15:01:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-30 04:15:28 +01:00
										 |  |  |       if HOMEBREW_CORE_DEFAULT_GIT_REMOTE != Homebrew::EnvConfig.core_git_remote | 
					
						
							| 
									
										
										
										
											2021-10-21 15:01:58 +01:00
										 |  |  |         opoo <<~EOS | 
					
						
							| 
									
										
										
										
											2022-05-30 04:15:28 +01:00
										 |  |  |           HOMEBREW_CORE_GIT_REMOTE was set: #{Homebrew::EnvConfig.core_git_remote}. | 
					
						
							| 
									
										
										
										
											2021-10-21 15:10:17 +01:00
										 |  |  |           It has been unset for the migration. | 
					
						
							| 
									
										
										
										
											2021-10-21 15:01:58 +01:00
										 |  |  |           You may need to change this from a linuxbrew-core mirror to a homebrew-core one. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       ENV.delete("HOMEBREW_CORE_GIT_REMOTE") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-30 04:15:28 +01:00
										 |  |  |       if HOMEBREW_BOTTLE_DEFAULT_DOMAIN != Homebrew::EnvConfig.bottle_domain | 
					
						
							| 
									
										
										
										
											2021-10-21 15:01:58 +01:00
										 |  |  |         opoo <<~EOS | 
					
						
							| 
									
										
										
										
											2022-05-30 04:15:28 +01:00
										 |  |  |           HOMEBREW_BOTTLE_DOMAIN was set: #{Homebrew::EnvConfig.bottle_domain}. | 
					
						
							| 
									
										
										
										
											2021-10-21 15:10:17 +01:00
										 |  |  |           It has been unset for the migration. | 
					
						
							|  |  |  |           You may need to change this from a Linuxbrew package mirror to a Homebrew one. | 
					
						
							| 
									
										
										
										
											2021-10-21 15:01:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       ENV.delete("HOMEBREW_BOTTLE_DOMAIN") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 11:01:38 +01:00
										 |  |  |       ENV["HOMEBREW_LINUXBREW_CORE_MIGRATION"] = "1" | 
					
						
							| 
									
										
										
										
											2021-10-21 15:01:58 +01:00
										 |  |  |       FileUtils.rm_f HOMEBREW_LOCKS/"update" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 11:01:38 +01:00
										 |  |  |       update_args = [] | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |       update_args << "--auto-update" if args.auto_update? | 
					
						
							| 
									
										
										
										
											2021-10-20 11:01:38 +01:00
										 |  |  |       update_args << "--force" if args.force? | 
					
						
							|  |  |  |       exec HOMEBREW_BREW_FILE, "update", *update_args | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-22 09:08:31 +00:00
										 |  |  |     if !Utils::Analytics.messages_displayed? && | 
					
						
							|  |  |  |        !Utils::Analytics.disabled? && | 
					
						
							|  |  |  |        !Utils::Analytics.no_message_output? | 
					
						
							| 
									
										
										
										
											2016-04-25 18:05:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-22 09:08:31 +00:00
										 |  |  |       ENV["HOMEBREW_NO_ANALYTICS_THIS_RUN"] = "1" | 
					
						
							|  |  |  |       # Use the shell's audible bell. | 
					
						
							|  |  |  |       print "\a" | 
					
						
							| 
									
										
										
										
											2018-08-14 13:19:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-22 09:08:31 +00:00
										 |  |  |       # Use an extra newline and bold to avoid this being missed. | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |       ohai "Homebrew has enabled anonymous aggregate formula and cask analytics." | 
					
						
							|  |  |  |       puts <<~EOS | 
					
						
							| 
									
										
										
										
											2019-11-22 09:08:31 +00:00
										 |  |  |         #{Tty.bold}Read the analytics documentation (and how to opt-out) here: | 
					
						
							|  |  |  |           #{Formatter.url("https://docs.brew.sh/Analytics")}#{Tty.reset} | 
					
						
							| 
									
										
										
										
											2021-01-26 15:21:24 -05:00
										 |  |  |         No analytics have been recorded yet (nor will be during this `brew` run). | 
					
						
							| 
									
										
										
										
											2019-11-22 09:08:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       EOS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # Consider the messages possibly missed if not a TTY. | 
					
						
							|  |  |  |       Utils::Analytics.messages_displayed! if $stdout.tty? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-12 16:27:25 -05:00
										 |  |  |     if Settings.read("donationmessage") != "true" && !args.quiet? | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |       ohai "Homebrew is run entirely by unpaid volunteers. Please consider donating:" | 
					
						
							| 
									
										
										
										
											2022-07-06 23:24:25 -07:00
										 |  |  |       puts "  #{Formatter.url("https://github.com/Homebrew/brew#donations")}\n\n" | 
					
						
							| 
									
										
										
										
											2018-08-14 13:19:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-12 16:27:25 -05:00
										 |  |  |       # Consider the message possibly missed if not a TTY. | 
					
						
							|  |  |  |       Settings.write "donationmessage", true if $stdout.tty? | 
					
						
							| 
									
										
										
										
											2016-04-25 18:05:30 -05:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-26 17:39:49 +08:00
										 |  |  |     install_core_tap_if_necessary | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 14:55:37 +08:00
										 |  |  |     updated = false | 
					
						
							| 
									
										
										
										
											2022-07-04 11:03:14 -07:00
										 |  |  |     new_tag = nil | 
					
						
							| 
									
										
										
										
											2016-02-25 16:41:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 14:55:37 +08:00
										 |  |  |     initial_revision = ENV["HOMEBREW_UPDATE_BEFORE"].to_s | 
					
						
							|  |  |  |     current_revision = ENV["HOMEBREW_UPDATE_AFTER"].to_s | 
					
						
							| 
									
										
										
										
											2019-02-19 13:11:32 +00:00
										 |  |  |     odie "update-report should not be called directly!" if initial_revision.empty? || current_revision.empty? | 
					
						
							| 
									
										
										
										
											2016-02-25 16:41:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 14:55:37 +08:00
										 |  |  |     if initial_revision != current_revision | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |       auto_update_header args: args | 
					
						
							| 
									
										
										
										
											2022-04-13 11:10:04 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 14:55:37 +08:00
										 |  |  |       updated = true | 
					
						
							| 
									
										
										
										
											2020-12-23 12:06:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-12 16:27:25 -05:00
										 |  |  |       old_tag = Settings.read "latesttag" | 
					
						
							| 
									
										
										
										
											2020-12-25 14:08:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       new_tag = Utils.popen_read( | 
					
						
							| 
									
										
										
										
											2021-01-01 17:54:59 +09:00
										 |  |  |         "git", "-C", HOMEBREW_REPOSITORY, "tag", "--list", "--sort=-version:refname", "*.*" | 
					
						
							| 
									
										
										
										
											2020-12-25 14:08:11 -05:00
										 |  |  |       ).lines.first.chomp | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-25 17:20:47 -07:00
										 |  |  |       Settings.write "latesttag", new_tag if new_tag != old_tag | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-06 23:24:01 -07:00
										 |  |  |       if new_tag == old_tag | 
					
						
							| 
									
										
										
										
											2022-07-07 14:17:00 -07:00
										 |  |  |         ohai "Updated Homebrew from #{shorten_revision(initial_revision)} to #{shorten_revision(current_revision)}." | 
					
						
							| 
									
										
										
										
											2022-07-06 23:24:01 -07:00
										 |  |  |       elsif old_tag.blank? | 
					
						
							|  |  |  |         ohai "Updated Homebrew from #{shorten_revision(initial_revision)} " \ | 
					
						
							|  |  |  |              "to #{new_tag} (#{shorten_revision(current_revision)})." | 
					
						
							| 
									
										
										
										
											2022-04-13 11:10:04 -07:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2022-07-06 23:15:38 -07:00
										 |  |  |         ohai "Updated Homebrew from #{old_tag} (#{shorten_revision(initial_revision)}) " \ | 
					
						
							| 
									
										
										
										
											2022-04-13 11:10:04 -07:00
										 |  |  |              "to #{new_tag} (#{shorten_revision(current_revision)})." | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-27 23:50:37 +00:00
										 |  |  |     Homebrew.failed = true if ENV["HOMEBREW_UPDATE_FAILED"] | 
					
						
							| 
									
										
										
										
											2022-05-30 04:15:28 +01:00
										 |  |  |     return if Homebrew::EnvConfig.disable_load_formula? | 
					
						
							| 
									
										
										
										
											2020-03-27 23:50:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     hub = ReporterHub.new | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |     updated_taps = [] | 
					
						
							|  |  |  |     Tap.each do |tap| | 
					
						
							| 
									
										
										
										
											2016-01-20 19:42:55 +08:00
										 |  |  |       next unless tap.git? | 
					
						
							| 
									
										
										
										
											2022-06-17 13:43:52 -04:00
										 |  |  |       next if (tap.core_tap? || tap == "homebrew/cask") && Homebrew::EnvConfig.install_from_api? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-07 11:16:03 +01:00
										 |  |  |       if ENV["HOMEBREW_MIGRATE_LINUXBREW_FORMULAE"].present? && tap.core_tap? && | 
					
						
							|  |  |  |          Settings.read("linuxbrewmigrated") != "true" | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |         ohai "Migrating formulae from linuxbrew-core to homebrew-core" | 
					
						
							| 
									
										
										
										
											2021-10-07 11:16:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         LINUXBREW_CORE_MIGRATION_LIST.each do |name| | 
					
						
							|  |  |  |           begin | 
					
						
							|  |  |  |             formula = Formula[name] | 
					
						
							|  |  |  |           rescue FormulaUnavailableError | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |           next unless formula.any_version_installed? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           keg = formula.installed_kegs.last | 
					
						
							|  |  |  |           tab = Tab.for_keg(keg) | 
					
						
							|  |  |  |           # force a `brew upgrade` from the linuxbrew-core version to the homebrew-core version (even if lower) | 
					
						
							|  |  |  |           tab.source["versions"]["version_scheme"] = -1
 | 
					
						
							|  |  |  |           tab.write | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Settings.write "linuxbrewmigrated", true | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 16:41:34 +08:00
										 |  |  |       begin | 
					
						
							|  |  |  |         reporter = Reporter.new(tap) | 
					
						
							|  |  |  |       rescue Reporter::ReporterRevisionUnsetError => e | 
					
						
							| 
									
										
										
										
											2020-04-05 15:44:50 +01:00
										 |  |  |         onoe "#{e.message}\n#{e.backtrace.join "\n"}" if Homebrew::EnvConfig.developer? | 
					
						
							| 
									
										
										
										
											2016-02-25 16:41:34 +08:00
										 |  |  |         next | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       if reporter.updated? | 
					
						
							|  |  |  |         updated_taps << tap.name | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |         hub.add(reporter, auto_update: args.auto_update?) | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-06 14:55:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |     unless updated_taps.empty? | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |       auto_update_header args: args | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |       puts "Updated #{updated_taps.count} #{"tap".pluralize(updated_taps.count)} (#{updated_taps.to_sentence})." | 
					
						
							| 
									
										
										
										
											2016-03-06 14:55:37 +08:00
										 |  |  |       updated = true | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-01-26 09:03:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-09 20:09:16 +11:00
										 |  |  |     if updated | 
					
						
							| 
									
										
										
										
											2016-09-03 19:36:34 +01:00
										 |  |  |       if hub.empty? | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |         puts "No changes to formulae." unless args.quiet? | 
					
						
							| 
									
										
										
										
											2016-09-03 19:36:34 +01:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |         if ENV.fetch("HOMEBREW_UPDATE_REPORT_ONLY_INSTALLED", false) | 
					
						
							|  |  |  |           opoo "HOMEBREW_UPDATE_REPORT_ONLY_INSTALLED is now the default behaviour, " \ | 
					
						
							|  |  |  |                "so you can unset it from your environment." | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         hub.dump(updated_formula_report: !args.auto_update?) unless args.quiet? | 
					
						
							| 
									
										
										
										
											2016-09-03 19:36:34 +01:00
										 |  |  |         hub.reporters.each(&:migrate_tap_migration) | 
					
						
							| 
									
										
										
										
											2020-08-02 04:46:32 +02:00
										 |  |  |         hub.reporters.each { |r| r.migrate_formula_rename(force: args.force?, verbose: args.verbose?) } | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |         CacheStoreDatabase.use(:descriptions) do |db| | 
					
						
							|  |  |  |           DescriptionCacheStore.new(db) | 
					
						
							|  |  |  |                                .update_from_report!(hub) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2022-03-23 00:03:11 -04:00
										 |  |  |         CacheStoreDatabase.use(:cask_descriptions) do |db| | 
					
						
							|  |  |  |           CaskDescriptionCacheStore.new(db) | 
					
						
							|  |  |  |                                    .update_from_report!(hub) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-09-03 19:36:34 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |       puts if args.auto_update? | 
					
						
							|  |  |  |     elsif !args.auto_update? && !ENV["HOMEBREW_UPDATE_FAILED"] && !ENV["HOMEBREW_MIGRATE_LINUXBREW_FORMULAE"] | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |       puts "Already up-to-date." unless args.quiet? | 
					
						
							| 
									
										
										
										
											2016-01-26 09:03:28 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 18:03:40 -04:00
										 |  |  |     Commands.rebuild_commands_completion_list | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |     link_completions_manpages_and_docs | 
					
						
							|  |  |  |     Tap.each(&:link_completions_and_manpages) | 
					
						
							| 
									
										
										
										
											2020-12-23 12:06:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-06 10:03:21 +09:00
										 |  |  |     failed_fetch_dirs = ENV["HOMEBREW_MISSING_REMOTE_REF_DIRS"]&.split("\n") | 
					
						
							| 
									
										
										
										
											2021-01-28 01:51:40 -05:00
										 |  |  |     if failed_fetch_dirs.present? | 
					
						
							|  |  |  |       failed_fetch_taps = failed_fetch_dirs.map { |dir| Tap.from_path(dir) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-03 13:31:24 +00:00
										 |  |  |       ofail <<~EOS | 
					
						
							|  |  |  |         Some taps failed to update! | 
					
						
							| 
									
										
										
										
											2021-01-28 01:51:40 -05:00
										 |  |  |         The following taps can not read their remote branches: | 
					
						
							|  |  |  |           #{failed_fetch_taps.join("\n  ")} | 
					
						
							| 
									
										
										
										
											2021-01-28 09:10:07 -05:00
										 |  |  |         This is happening because the remote branch was renamed or deleted. | 
					
						
							| 
									
										
										
										
											2021-01-28 01:51:40 -05:00
										 |  |  |         Reset taps to point to the correct remote branches by running `brew tap --repair` | 
					
						
							|  |  |  |       EOS | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-30 18:41:44 -07:00
										 |  |  |     return if new_tag.blank? || new_tag == old_tag || args.quiet? | 
					
						
							| 
									
										
										
										
											2020-12-23 12:06:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |     puts | 
					
						
							| 
									
										
										
										
											2022-07-06 23:15:38 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-28 00:02:45 -07:00
										 |  |  |     new_major_version, new_minor_version, new_patch_version = new_tag.split(".").map(&:to_i) | 
					
						
							|  |  |  |     old_major_version, old_minor_version = (old_tag.split(".")[0, 2]).map(&:to_i) if old_tag.present? | 
					
						
							|  |  |  |     if old_tag.blank? || new_major_version > old_major_version \ | 
					
						
							|  |  |  |         || new_minor_version > old_minor_version | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |       puts <<~EOS | 
					
						
							| 
									
										
										
										
											2022-07-06 23:15:38 -07:00
										 |  |  |         The #{new_major_version}.#{new_minor_version}.0 release notes are available on the Homebrew Blog: | 
					
						
							| 
									
										
										
										
											2022-06-28 00:02:45 -07:00
										 |  |  |           #{Formatter.url("https://brew.sh/blog/#{new_major_version}.#{new_minor_version}.0")} | 
					
						
							| 
									
										
										
										
											2020-12-24 19:05:23 -05:00
										 |  |  |       EOS | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-06-28 00:02:45 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return if new_patch_version.zero? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     puts <<~EOS | 
					
						
							| 
									
										
										
										
											2022-07-06 23:15:38 -07:00
										 |  |  |       The #{new_tag} changelog can be found at: | 
					
						
							| 
									
										
										
										
											2022-06-28 00:02:45 -07:00
										 |  |  |         #{Formatter.url("https://github.com/Homebrew/brew/releases/tag/#{new_tag}")} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def shorten_revision(revision) | 
					
						
							| 
									
										
										
										
											2016-02-25 16:41:34 +08:00
										 |  |  |     Utils.popen_read("git", "-C", HOMEBREW_REPOSITORY, "rev-parse", "--short", revision).chomp | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-02-26 17:39:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def install_core_tap_if_necessary | 
					
						
							| 
									
										
										
										
											2016-10-02 17:16:35 +01:00
										 |  |  |     return if ENV["HOMEBREW_UPDATE_TEST"] | 
					
						
							| 
									
										
										
										
											2021-10-22 11:46:54 -04:00
										 |  |  |     return if Homebrew::EnvConfig.install_from_api? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-26 17:39:49 +08:00
										 |  |  |     core_tap = CoreTap.instance | 
					
						
							|  |  |  |     return if core_tap.installed? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-07 12:09:52 +01:00
										 |  |  |     CoreTap.ensure_installed! | 
					
						
							| 
									
										
										
										
											2016-02-26 17:39:49 +08:00
										 |  |  |     revision = core_tap.git_head | 
					
						
							|  |  |  |     ENV["HOMEBREW_UPDATE_BEFORE_HOMEBREW_HOMEBREW_CORE"] = revision | 
					
						
							|  |  |  |     ENV["HOMEBREW_UPDATE_AFTER_HOMEBREW_HOMEBREW_CORE"] = revision | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-06-01 08:46:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |   def link_completions_manpages_and_docs(repository = HOMEBREW_REPOSITORY) | 
					
						
							| 
									
										
										
										
											2016-09-06 09:04:51 +01:00
										 |  |  |     command = "brew update" | 
					
						
							| 
									
										
										
										
											2021-01-11 12:24:48 -05:00
										 |  |  |     Utils::Link.link_completions(repository, command) | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |     Utils::Link.link_manpages(repository, command) | 
					
						
							|  |  |  |     Utils::Link.link_docs(repository, command) | 
					
						
							| 
									
										
										
										
											2016-09-20 08:03:06 +01:00
										 |  |  |   rescue => e | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |     ofail <<~EOS | 
					
						
							| 
									
										
										
										
											2016-09-20 08:03:06 +01:00
										 |  |  |       Failed to link all completions, docs and manpages: | 
					
						
							|  |  |  |         #{e} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2016-08-22 11:07:15 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Reporter | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |   class ReporterRevisionUnsetError < RuntimeError | 
					
						
							|  |  |  |     def initialize(var_name) | 
					
						
							|  |  |  |       super "#{var_name} is unset!" | 
					
						
							| 
									
										
										
										
											2016-01-20 19:41:42 +08:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |   attr_reader :tap, :initial_revision, :current_revision | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize(tap) | 
					
						
							|  |  |  |     @tap = tap | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-25 16:21:37 +02:00
										 |  |  |     initial_revision_var = "HOMEBREW_UPDATE_BEFORE#{tap.repo_var}" | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |     @initial_revision = ENV[initial_revision_var].to_s | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |     raise ReporterRevisionUnsetError, initial_revision_var if @initial_revision.empty? | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-25 16:21:37 +02:00
										 |  |  |     current_revision_var = "HOMEBREW_UPDATE_AFTER#{tap.repo_var}" | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |     @current_revision = ENV[current_revision_var].to_s | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |     raise ReporterRevisionUnsetError, current_revision_var if @current_revision.empty? | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |   def report(auto_update: false) | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |     return @report if @report | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @report = Hash.new { |h, k| h[k] = [] } | 
					
						
							|  |  |  |     return @report unless updated? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     diff.each_line do |line| | 
					
						
							|  |  |  |       status, *paths = line.split | 
					
						
							|  |  |  |       src = Pathname.new paths.first | 
					
						
							|  |  |  |       dst = Pathname.new paths.last | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       next unless dst.extname == ".rb" | 
					
						
							| 
									
										
										
										
											2016-08-05 16:00:33 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if paths.any? { |p| tap.cask_file?(p) } | 
					
						
							| 
									
										
										
										
											2020-07-13 22:48:53 +10:00
										 |  |  |         case status | 
					
						
							| 
									
										
										
										
											2022-02-28 09:54:12 +00:00
										 |  |  |         when "A" | 
					
						
							|  |  |  |           # Have a dedicated report array for new casks. | 
					
						
							|  |  |  |           @report[:AC] << tap.formula_file_to_name(src) | 
					
						
							| 
									
										
										
										
											2020-07-13 22:48:53 +10:00
										 |  |  |         when "D" | 
					
						
							| 
									
										
										
										
											2016-08-05 16:00:33 +01:00
										 |  |  |           # Have a dedicated report array for deleted casks. | 
					
						
							|  |  |  |           @report[:DC] << tap.formula_file_to_name(src) | 
					
						
							| 
									
										
										
										
											2020-07-13 22:48:53 +10:00
										 |  |  |         when "M" | 
					
						
							| 
									
										
										
										
											2020-03-02 17:08:24 -05:00
										 |  |  |           # Report updated casks | 
					
						
							|  |  |  |           @report[:MC] << tap.formula_file_to_name(src) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-08-05 16:00:33 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       next unless paths.any? { |p| tap.formula_file?(p) } | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       case status | 
					
						
							|  |  |  |       when "A", "D" | 
					
						
							| 
									
										
										
										
											2017-03-20 15:28:24 +02:00
										 |  |  |         full_name = tap.formula_file_to_name(src) | 
					
						
							|  |  |  |         name = full_name.split("/").last | 
					
						
							|  |  |  |         new_tap = tap.tap_migrations[name] | 
					
						
							|  |  |  |         @report[status.to_sym] << full_name unless new_tap | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       when "M" | 
					
						
							| 
									
										
										
										
											2020-07-20 00:21:51 +10:00
										 |  |  |         name = tap.formula_file_to_name(src) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         @report[:M] << name | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       when /^R\d{0,3}/ | 
					
						
							| 
									
										
										
										
											2016-07-16 01:18:30 -04:00
										 |  |  |         src_full_name = tap.formula_file_to_name(src) | 
					
						
							|  |  |  |         dst_full_name = tap.formula_file_to_name(dst) | 
					
						
							|  |  |  |         # Don't report formulae that are moved within a tap but not renamed | 
					
						
							|  |  |  |         next if src_full_name == dst_full_name | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-16 01:18:30 -04:00
										 |  |  |         @report[:D] << src_full_name | 
					
						
							|  |  |  |         @report[:A] << dst_full_name | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 17:24:52 +00:00
										 |  |  |     renamed_formulae = Set.new | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |     @report[:D].each do |old_full_name| | 
					
						
							|  |  |  |       old_name = old_full_name.split("/").last | 
					
						
							|  |  |  |       new_name = tap.formula_renames[old_name] | 
					
						
							|  |  |  |       next unless new_name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |       new_full_name = if tap.core_tap? | 
					
						
							|  |  |  |         new_name | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |         "#{tap}/#{new_name}" | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       renamed_formulae << [old_full_name, new_full_name] if @report[:A].include? new_full_name | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 17:24:52 +00:00
										 |  |  |     @report[:A].each do |new_full_name| | 
					
						
							|  |  |  |       new_name = new_full_name.split("/").last | 
					
						
							|  |  |  |       old_name = tap.formula_renames.key(new_name) | 
					
						
							|  |  |  |       next unless old_name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |       old_full_name = if tap.core_tap? | 
					
						
							|  |  |  |         old_name | 
					
						
							| 
									
										
										
										
											2017-01-02 17:24:52 +00:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |         "#{tap}/#{old_name}" | 
					
						
							| 
									
										
										
										
											2017-01-02 17:24:52 +00:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       renamed_formulae << [old_full_name, new_full_name] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-28 09:58:20 +00:00
										 |  |  |     if renamed_formulae.present? | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       @report[:A] -= renamed_formulae.map(&:last) | 
					
						
							|  |  |  |       @report[:D] -= renamed_formulae.map(&:first) | 
					
						
							| 
									
										
										
										
											2022-02-28 09:54:12 +00:00
										 |  |  |       @report[:R] = renamed_formulae.to_a | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |     @report | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def updated? | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |     initial_revision != current_revision | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |   def migrate_tap_migration | 
					
						
							| 
									
										
										
										
											2016-08-05 16:00:33 +01:00
										 |  |  |     (report[:D] + report[:DC]).each do |full_name| | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       name = full_name.split("/").last | 
					
						
							| 
									
										
										
										
											2016-07-26 00:15:21 +03:00
										 |  |  |       new_tap_name = tap.tap_migrations[name] | 
					
						
							|  |  |  |       next if new_tap_name.nil? # skip if not in tap_migrations list. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-18 13:18:46 -08:00
										 |  |  |       new_tap_user, new_tap_repo, new_tap_new_name = new_tap_name.split("/") | 
					
						
							|  |  |  |       new_name = if new_tap_new_name | 
					
						
							|  |  |  |         new_full_name = new_tap_new_name | 
					
						
							|  |  |  |         new_tap_name = "#{new_tap_user}/#{new_tap_repo}" | 
					
						
							|  |  |  |         new_tap_new_name | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         new_full_name = "#{new_tap_name}/#{name}" | 
					
						
							|  |  |  |         name | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |       # This means it is a cask | 
					
						
							| 
									
										
										
										
											2016-08-05 16:00:33 +01:00
										 |  |  |       if report[:DC].include? full_name | 
					
						
							| 
									
										
										
										
											2016-12-18 13:18:46 -08:00
										 |  |  |         next unless (HOMEBREW_PREFIX/"Caskroom"/new_name).exist? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-26 00:15:21 +03:00
										 |  |  |         new_tap = Tap.fetch(new_tap_name) | 
					
						
							|  |  |  |         new_tap.install unless new_tap.installed? | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |         ohai "#{name} has been moved to Homebrew.", <<~EOS | 
					
						
							| 
									
										
										
										
											2021-01-26 15:21:24 -05:00
										 |  |  |           To uninstall the cask, run: | 
					
						
							| 
									
										
										
										
											2020-11-18 08:10:21 +01:00
										 |  |  |             brew uninstall --cask --force #{name} | 
					
						
							| 
									
										
										
										
											2016-07-26 00:15:21 +03:00
										 |  |  |         EOS | 
					
						
							| 
									
										
										
										
											2016-12-18 13:18:46 -08:00
										 |  |  |         next if (HOMEBREW_CELLAR/new_name.split("/").last).directory? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |         ohai "Installing #{new_name}..." | 
					
						
							| 
									
										
										
										
											2016-07-26 00:15:21 +03:00
										 |  |  |         system HOMEBREW_BREW_FILE, "install", new_full_name | 
					
						
							|  |  |  |         begin | 
					
						
							|  |  |  |           unless Formulary.factory(new_full_name).keg_only? | 
					
						
							| 
									
										
										
										
											2016-08-02 11:48:11 +01:00
										 |  |  |             system HOMEBREW_BREW_FILE, "link", new_full_name, "--overwrite" | 
					
						
							| 
									
										
										
										
											2016-07-26 00:15:21 +03:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2017-10-07 00:31:28 +02:00
										 |  |  |         rescue Exception => e # rubocop:disable Lint/RescueException | 
					
						
							| 
									
										
										
										
											2020-04-05 15:44:50 +01:00
										 |  |  |           onoe "#{e.message}\n#{e.backtrace.join "\n"}" if Homebrew::EnvConfig.developer? | 
					
						
							| 
									
										
										
										
											2016-07-26 00:15:21 +03:00
										 |  |  |         end | 
					
						
							|  |  |  |         next | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       next unless (dir = HOMEBREW_CELLAR/name).exist? # skip if formula is not installed. | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       tabs = dir.subdirs.map { |d| Tab.for_keg(Keg.new(d)) } | 
					
						
							|  |  |  |       next unless tabs.first.tap == tap # skip if installed formula is not from this tap. | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       new_tap = Tap.fetch(new_tap_name) | 
					
						
							| 
									
										
										
										
											2016-06-22 16:36:17 +04:00
										 |  |  |       # For formulae migrated to cask: Auto-install cask or provide install instructions. | 
					
						
							| 
									
										
										
										
											2018-05-25 18:03:16 +02:00
										 |  |  |       if new_tap_name.start_with?("homebrew/cask") | 
					
						
							| 
									
										
										
										
											2016-11-05 15:37:28 -04:00
										 |  |  |         if new_tap.installed? && (HOMEBREW_PREFIX/"Caskroom").directory? | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |           ohai "#{name} has been moved to Homebrew Cask." | 
					
						
							|  |  |  |           ohai "brew unlink #{name}" | 
					
						
							| 
									
										
										
										
											2017-02-17 12:34:24 -05:00
										 |  |  |           system HOMEBREW_BREW_FILE, "unlink", name | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |           ohai "brew cleanup" | 
					
						
							| 
									
										
										
										
											2019-01-02 13:21:34 +00:00
										 |  |  |           system HOMEBREW_BREW_FILE, "cleanup" | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |           ohai "brew install --cask #{new_name}" | 
					
						
							| 
									
										
										
										
											2020-11-18 08:10:21 +01:00
										 |  |  |           system HOMEBREW_BREW_FILE, "install", "--cask", new_name | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |           ohai <<~EOS | 
					
						
							| 
									
										
										
										
											2018-09-03 20:12:29 +01:00
										 |  |  |             #{name} has been moved to Homebrew Cask. | 
					
						
							| 
									
										
										
										
											2017-02-17 12:34:24 -05:00
										 |  |  |             The existing keg has been unlinked. | 
					
						
							|  |  |  |             Please uninstall the formula when convenient by running: | 
					
						
							|  |  |  |               brew uninstall --force #{name} | 
					
						
							|  |  |  |           EOS | 
					
						
							| 
									
										
										
										
											2016-06-22 16:36:17 +04:00
										 |  |  |         else | 
					
						
							| 
									
										
										
										
											2021-11-23 23:55:06 +08:00
										 |  |  |           ohai "#{name} has been moved to Homebrew Cask.", <<~EOS | 
					
						
							| 
									
										
										
										
											2021-01-26 15:21:24 -05:00
										 |  |  |             To uninstall the formula and install the cask, run: | 
					
						
							| 
									
										
										
										
											2016-06-22 16:36:17 +04:00
										 |  |  |               brew uninstall --force #{name} | 
					
						
							| 
									
										
										
										
											2018-05-25 18:03:16 +02:00
										 |  |  |               brew tap #{new_tap_name} | 
					
						
							| 
									
										
										
										
											2020-11-18 08:10:21 +01:00
										 |  |  |               brew install --cask #{new_name} | 
					
						
							| 
									
										
										
										
											2016-06-22 16:36:17 +04:00
										 |  |  |           EOS | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         new_tap.install unless new_tap.installed? | 
					
						
							|  |  |  |         # update tap for each Tab | 
					
						
							|  |  |  |         tabs.each { |tab| tab.tap = new_tap } | 
					
						
							|  |  |  |         tabs.each(&:write) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 04:46:32 +02:00
										 |  |  |   def migrate_formula_rename(force:, verbose:) | 
					
						
							| 
									
										
										
										
											2017-03-29 11:22:59 +01:00
										 |  |  |     Formula.installed.each do |formula| | 
					
						
							|  |  |  |       next unless Migrator.needs_migration?(formula) | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 11:22:59 +01:00
										 |  |  |       oldname = formula.oldname | 
					
						
							|  |  |  |       oldname_rack = HOMEBREW_CELLAR/oldname | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if oldname_rack.subdirs.empty? | 
					
						
							|  |  |  |         oldname_rack.rmdir_if_possible | 
					
						
							|  |  |  |         next | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       new_name = tap.formula_renames[oldname] | 
					
						
							| 
									
										
										
										
											2017-03-20 18:10:28 +02:00
										 |  |  |       next unless new_name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       new_full_name = "#{tap}/#{new_name}" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       begin | 
					
						
							|  |  |  |         f = Formulary.factory(new_full_name) | 
					
						
							| 
									
										
										
										
											2017-10-07 00:31:28 +02:00
										 |  |  |       rescue Exception => e # rubocop:disable Lint/RescueException | 
					
						
							| 
									
										
										
										
											2020-04-05 15:44:50 +01:00
										 |  |  |         onoe "#{e.message}\n#{e.backtrace.join "\n"}" if Homebrew::EnvConfig.developer? | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |         next | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-02 14:32:31 +02:00
										 |  |  |       Migrator.migrate_if_needed(f, force: force) | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   def diff | 
					
						
							|  |  |  |     Utils.popen_read( | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |       "git", "-C", tap.path, "diff-tree", "-r", "--name-status", "--diff-filter=AMDR", | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |       "-M85%", initial_revision, current_revision | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  | class ReporterHub | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   extend T::Sig | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |   extend Forwardable | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |   attr_reader :reporters | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { void } | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   def initialize | 
					
						
							|  |  |  |     @hash = {} | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |     @reporters = [] | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |   def select_formula_or_cask(key) | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |     @hash.fetch(key, []) | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |   def add(reporter, auto_update: false) | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |     @reporters << reporter | 
					
						
							| 
									
										
										
										
											2022-05-19 11:04:20 -04:00
										 |  |  |     report = reporter.report(auto_update: auto_update).delete_if { |_k, v| v.empty? } | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |     @hash.update(report) { |_key, oldval, newval| oldval.concat(newval) } | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-13 05:04:35 +01:00
										 |  |  |   delegate empty?: :@hash | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-20 00:21:51 +10:00
										 |  |  |   def dump(updated_formula_report: true) | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |     report_all = Homebrew::EnvConfig.update_report_all_formulae? | 
					
						
							| 
									
										
										
										
											2022-02-28 09:54:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-13 09:12:32 +01:00
										 |  |  |     dump_new_formula_report | 
					
						
							|  |  |  |     dump_new_cask_report | 
					
						
							|  |  |  |     dump_renamed_formula_report if report_all | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |     dump_deleted_formula_report(report_all) | 
					
						
							|  |  |  |     dump_deleted_cask_report(report_all) | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     outdated_formulae = nil | 
					
						
							|  |  |  |     outdated_casks = nil | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |     if updated_formula_report && report_all | 
					
						
							|  |  |  |       dump_modified_formula_report | 
					
						
							|  |  |  |       dump_modified_cask_report | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |     elsif updated_formula_report | 
					
						
							|  |  |  |       outdated_formulae = Formula.installed.select(&:outdated?).map(&:name) | 
					
						
							|  |  |  |       output_dump_formula_or_cask_report "Outdated Formulae", outdated_formulae | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       outdated_casks = Cask::Caskroom.casks.select(&:outdated?).map(&:token) | 
					
						
							|  |  |  |       output_dump_formula_or_cask_report "Outdated Casks", outdated_casks | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |     elsif report_all | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |       if (changed_formulae = select_formula_or_cask(:M).count) && changed_formulae.positive? | 
					
						
							|  |  |  |         ohai "Modified Formulae", "Modified #{changed_formulae} #{"formula".pluralize(changed_formulae)}." | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (changed_casks = select_formula_or_cask(:MC).count) && changed_casks.positive? | 
					
						
							|  |  |  |         ohai "Modified Casks", "Modified #{changed_casks} #{"cask".pluralize(changed_casks)}." | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-07-20 00:21:51 +10:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |       outdated_formulae = Formula.installed.select(&:outdated?).map(&:name) | 
					
						
							|  |  |  |       outdated_casks = Cask::Caskroom.casks.select(&:outdated?).map(&:token) | 
					
						
							| 
									
										
										
										
											2020-07-20 00:21:51 +10:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return if outdated_formulae.blank? && outdated_casks.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     outdated_formulae = outdated_formulae.count | 
					
						
							|  |  |  |     outdated_casks = outdated_casks.count | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     update_pronoun = if (outdated_formulae + outdated_casks) == 1
 | 
					
						
							|  |  |  |       "it" | 
					
						
							| 
									
										
										
										
											2020-12-14 19:49:35 -05:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |       "them" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     msg = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if outdated_formulae.positive? | 
					
						
							|  |  |  |       msg += "#{Tty.bold}#{outdated_formulae}#{Tty.reset} outdated #{"formula".pluralize(outdated_formulae)}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if outdated_casks.positive? | 
					
						
							|  |  |  |       msg += " and " if msg.present? | 
					
						
							|  |  |  |       msg += "#{Tty.bold}#{outdated_casks}#{Tty.reset} outdated #{"cask".pluralize(outdated_casks)}" | 
					
						
							| 
									
										
										
										
											2020-12-14 19:49:35 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return if msg.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     puts | 
					
						
							|  |  |  |     puts <<~EOS | 
					
						
							|  |  |  |       You have #{msg} installed. | 
					
						
							|  |  |  |       You can upgrade #{update_pronoun} with #{Tty.bold}brew upgrade#{Tty.reset} | 
					
						
							|  |  |  |       or list #{update_pronoun} with #{Tty.bold}brew outdated#{Tty.reset}. | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |   private | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |   def dump_new_formula_report | 
					
						
							| 
									
										
										
										
											2022-06-17 19:53:30 +01:00
										 |  |  |     formulae = select_formula_or_cask(:A).sort.reject { |name| installed?(name) } | 
					
						
							| 
									
										
										
										
											2022-02-28 09:54:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |     output_dump_formula_or_cask_report "New Formulae", formulae | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def dump_new_cask_report | 
					
						
							|  |  |  |     casks = select_formula_or_cask(:AC).sort.map do |name| | 
					
						
							|  |  |  |       name.split("/").last unless cask_installed?(name) | 
					
						
							| 
									
										
										
										
											2022-06-17 00:30:49 +01:00
										 |  |  |     end.compact | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     output_dump_formula_or_cask_report "New Casks", casks | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def dump_renamed_formula_report | 
					
						
							|  |  |  |     formulae = select_formula_or_cask(:R).sort.map do |name, new_name| | 
					
						
							|  |  |  |       name = pretty_installed(name) if installed?(name) | 
					
						
							|  |  |  |       new_name = pretty_installed(new_name) if installed?(new_name) | 
					
						
							|  |  |  |       "#{name} -> #{new_name}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     output_dump_formula_or_cask_report "Renamed Formulae", formulae | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def dump_deleted_formula_report(report_all) | 
					
						
							|  |  |  |     formulae = select_formula_or_cask(:D).sort.map do |name| | 
					
						
							|  |  |  |       if installed?(name) | 
					
						
							|  |  |  |         pretty_uninstalled(name) | 
					
						
							|  |  |  |       elsif report_all | 
					
						
							|  |  |  |         name | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end.compact | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     output_dump_formula_or_cask_report "Deleted Formulae", formulae | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def dump_deleted_cask_report(report_all) | 
					
						
							|  |  |  |     casks = select_formula_or_cask(:DC).sort.map do |name| | 
					
						
							|  |  |  |       name = name.split("/").last | 
					
						
							|  |  |  |       if cask_installed?(name) | 
					
						
							|  |  |  |         pretty_uninstalled(name) | 
					
						
							|  |  |  |       elsif report_all | 
					
						
							|  |  |  |         name | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end.compact | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     output_dump_formula_or_cask_report "Deleted Casks", casks | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def dump_modified_formula_report | 
					
						
							|  |  |  |     formulae = select_formula_or_cask(:M).sort.map do |name| | 
					
						
							|  |  |  |       if installed?(name) | 
					
						
							|  |  |  |         if outdated?(name) | 
					
						
							|  |  |  |           pretty_outdated(name) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           pretty_installed(name) | 
					
						
							| 
									
										
										
										
											2022-02-28 09:54:12 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |       else | 
					
						
							|  |  |  |         name | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     output_dump_formula_or_cask_report "Modified Formulae", formulae | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def dump_modified_cask_report | 
					
						
							|  |  |  |     casks = select_formula_or_cask(:MC).sort.map do |name| | 
					
						
							|  |  |  |       name = name.split("/").last | 
					
						
							|  |  |  |       if cask_installed?(name) | 
					
						
							|  |  |  |         if cask_outdated?(name) | 
					
						
							|  |  |  |           pretty_outdated(name) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           pretty_installed(name) | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |         end | 
					
						
							|  |  |  |       else | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |         name | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-11 15:41:28 -07:00
										 |  |  |     output_dump_formula_or_cask_report "Modified Casks", casks | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def output_dump_formula_or_cask_report(title, formulae_or_casks) | 
					
						
							|  |  |  |     return if formulae_or_casks.blank? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |     ohai title, Formatter.columns(formulae_or_casks.sort) | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def installed?(formula) | 
					
						
							|  |  |  |     (HOMEBREW_CELLAR/formula.split("/").last).directory? | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-03-05 11:14:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  |   def outdated?(formula) | 
					
						
							|  |  |  |     Formula[formula].outdated? | 
					
						
							|  |  |  |   rescue FormulaUnavailableError | 
					
						
							|  |  |  |     false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-05 11:14:37 -05:00
										 |  |  |   def cask_installed?(cask) | 
					
						
							|  |  |  |     (Cask::Caskroom.path/cask).directory? | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-06-03 19:16:15 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def cask_outdated?(cask) | 
					
						
							|  |  |  |     Cask::CaskLoader.load(cask).outdated? | 
					
						
							|  |  |  |   rescue Cask::CaskError | 
					
						
							|  |  |  |     false | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | end |