| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | require "formula_versions" | 
					
						
							|  |  |  | 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" | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2016-09-26 01:44:51 +02:00
										 |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-11 09:31:50 +01:00
										 |  |  |   def update_preinstall_header | 
					
						
							| 
									
										
										
										
											2018-03-07 16:14:55 +00:00
										 |  |  |     @update_preinstall_header ||= begin | 
					
						
							| 
									
										
										
										
											2020-03-04 17:28:15 +00:00
										 |  |  |       ohai "Auto-updated Homebrew!" if args.preinstall? | 
					
						
							| 
									
										
										
										
											2016-04-11 09:31:50 +01:00
										 |  |  |       true | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  |   def update_report_args | 
					
						
							|  |  |  |     Homebrew::CLI::Parser.new do | 
					
						
							|  |  |  |       usage_banner <<~EOS | 
					
						
							| 
									
										
										
										
											2019-08-06 14:17:17 -04:00
										 |  |  |         `update-report` | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         The Ruby implementation of `brew update`. Never called manually. | 
					
						
							|  |  |  |       EOS | 
					
						
							|  |  |  |       switch "--preinstall", | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |              description: "Run in 'auto-update' mode (faster, less output)." | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  |       switch :force | 
					
						
							| 
									
										
										
										
											2019-02-04 15:06:06 +01:00
										 |  |  |       switch :quiet | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  |       switch :verbose | 
					
						
							| 
									
										
										
										
											2019-08-09 14:23:04 -04:00
										 |  |  |       switch :debug | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2019-01-30 21:30:45 +00:00
										 |  |  |     update_report_args.parse | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							|  |  |  |       ohai "Homebrew has enabled anonymous aggregate formulae and cask analytics." | 
					
						
							|  |  |  |       puts <<~EOS | 
					
						
							|  |  |  |         #{Tty.bold}Read the analytics documentation (and how to opt-out) here: | 
					
						
							|  |  |  |           #{Formatter.url("https://docs.brew.sh/Analytics")}#{Tty.reset} | 
					
						
							| 
									
										
										
										
											2020-02-22 17:13:51 +00:00
										 |  |  |         No analytics have been recorded yet (or 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     HOMEBREW_REPOSITORY.cd do | 
					
						
							| 
									
										
										
										
											2018-08-14 13:19:37 +01:00
										 |  |  |       donation_message_displayed = | 
					
						
							| 
									
										
										
										
											2019-11-16 09:39:18 +00:00
										 |  |  |         Utils.popen_read("git", "config", "--get", "homebrew.donationmessage").chomp == "true" | 
					
						
							| 
									
										
										
										
											2018-09-17 22:02:00 +02:00
										 |  |  |       unless donation_message_displayed | 
					
						
							| 
									
										
										
										
											2018-08-14 13:19:37 +01:00
										 |  |  |         ohai "Homebrew is run entirely by unpaid volunteers. Please consider donating:" | 
					
						
							|  |  |  |         puts "  #{Formatter.url("https://github.com/Homebrew/brew#donations")}\n" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Consider the message possibly missed if not a TTY. | 
					
						
							| 
									
										
										
										
											2019-11-16 09:39:18 +00:00
										 |  |  |         safe_system "git", "config", "--replace-all", "homebrew.donationmessage", "true" if $stdout.tty? | 
					
						
							| 
									
										
										
										
											2018-08-14 13:19:37 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2016-04-11 09:31:50 +01:00
										 |  |  |       update_preinstall_header | 
					
						
							| 
									
										
										
										
											2016-03-06 14:55:37 +08:00
										 |  |  |       puts "Updated Homebrew from #{shorten_revision(initial_revision)} to #{shorten_revision(current_revision)}." | 
					
						
							|  |  |  |       updated = true | 
					
						
							| 
									
										
										
										
											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"] | 
					
						
							|  |  |  |     return if ENV["HOMEBREW_DISABLE_LOAD_FORMULA"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |         hub.add(reporter) | 
					
						
							| 
									
										
										
										
											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? | 
					
						
							| 
									
										
										
										
											2016-04-11 09:31:50 +01:00
										 |  |  |       update_preinstall_header | 
					
						
							| 
									
										
										
										
											2018-09-17 20:11:11 +02: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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 14:55:37 +08:00
										 |  |  |     if !updated | 
					
						
							| 
									
										
										
										
											2020-03-04 17:28:15 +00:00
										 |  |  |       puts "Already up-to-date." if !args.preinstall? && !ENV["HOMEBREW_UPDATE_FAILED"] | 
					
						
							| 
									
										
										
										
											2016-02-25 16:41:34 +08:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2016-09-03 19:36:34 +01:00
										 |  |  |       if hub.empty? | 
					
						
							|  |  |  |         puts "No changes to formulae." | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         hub.dump | 
					
						
							|  |  |  |         hub.reporters.each(&:migrate_tap_migration) | 
					
						
							|  |  |  |         hub.reporters.each(&:migrate_formula_rename) | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |         CacheStoreDatabase.use(:descriptions) do |db| | 
					
						
							|  |  |  |           DescriptionCacheStore.new(db) | 
					
						
							|  |  |  |                                .update_from_report!(hub) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-09-03 19:36:34 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-03-04 17:28:15 +00:00
										 |  |  |       puts if args.preinstall? | 
					
						
							| 
									
										
										
										
											2016-01-26 09:03:28 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |     link_completions_manpages_and_docs | 
					
						
							|  |  |  |     Tap.each(&:link_completions_and_manpages) | 
					
						
							| 
									
										
										
										
											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"] | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |     Utils::Link.link_completions(repository, command) | 
					
						
							|  |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def report | 
					
						
							| 
									
										
										
										
											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) } | 
					
						
							|  |  |  |         # Currently only need to handle Cask deletion/migration. | 
					
						
							|  |  |  |         if status == "D" | 
					
						
							|  |  |  |           # Have a dedicated report array for deleted casks. | 
					
						
							|  |  |  |           @report[:DC] << tap.formula_file_to_name(src) | 
					
						
							| 
									
										
										
										
											2020-03-03 10:02:17 -05:00
										 |  |  |         elsif status == "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" | 
					
						
							|  |  |  |         begin | 
					
						
							|  |  |  |           formula = Formulary.factory(tap.path/src) | 
					
						
							|  |  |  |           new_version = formula.pkg_version | 
					
						
							|  |  |  |           old_version = FormulaVersions.new(formula).formula_at_revision(@initial_revision, &:pkg_version) | 
					
						
							|  |  |  |           next if new_version == old_version | 
					
						
							| 
									
										
										
										
											2019-07-17 09:27:02 +01:00
										 |  |  |         rescue FormulaUnavailableError | 
					
						
							|  |  |  |           # Don't care if the formula isn't available right now. | 
					
						
							|  |  |  |           nil | 
					
						
							| 
									
										
										
										
											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-01-10 20:28:52 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |         @report[:M] << tap.formula_file_to_name(src) | 
					
						
							|  |  |  |       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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |     unless renamed_formulae.empty? | 
					
						
							|  |  |  |       @report[:A] -= renamed_formulae.map(&:last) | 
					
						
							|  |  |  |       @report[:D] -= renamed_formulae.map(&:first) | 
					
						
							| 
									
										
										
										
											2017-01-02 17:24:52 +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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 16:00:33 +01:00
										 |  |  |       # This means it is a Cask | 
					
						
							|  |  |  |       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? | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |         ohai "#{name} has been moved to Homebrew.", <<~EOS | 
					
						
							| 
									
										
										
										
											2016-07-26 00:15:21 +03:00
										 |  |  |           To uninstall the cask run: | 
					
						
							|  |  |  |             brew cask uninstall --force #{name} | 
					
						
							|  |  |  |         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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-18 13:18:46 -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? | 
					
						
							| 
									
										
										
										
											2018-09-03 20:12:29 +01:00
										 |  |  |           ohai "#{name} has been moved to Homebrew Cask." | 
					
						
							| 
									
										
										
										
											2017-02-17 12:34:24 -05:00
										 |  |  |           ohai "brew unlink #{name}" | 
					
						
							|  |  |  |           system HOMEBREW_BREW_FILE, "unlink", name | 
					
						
							| 
									
										
										
										
											2019-01-02 13:21:34 +00:00
										 |  |  |           ohai "brew cleanup" | 
					
						
							|  |  |  |           system HOMEBREW_BREW_FILE, "cleanup" | 
					
						
							| 
									
										
										
										
											2016-12-18 13:18:46 -08:00
										 |  |  |           ohai "brew cask install #{new_name}" | 
					
						
							|  |  |  |           system HOMEBREW_BREW_FILE, "cask", "install", 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 | 
					
						
							| 
									
										
										
										
											2018-09-03 20:12:29 +01:00
										 |  |  |           ohai "#{name} has been moved to Homebrew Cask.", <<~EOS | 
					
						
							| 
									
										
										
										
											2016-06-22 16:36:17 +04:00
										 |  |  |             To uninstall the formula and install the cask run: | 
					
						
							|  |  |  |               brew uninstall --force #{name} | 
					
						
							| 
									
										
										
										
											2018-05-25 18:03:16 +02:00
										 |  |  |               brew tap #{new_tap_name} | 
					
						
							| 
									
										
										
										
											2016-12-18 13:18:46 -08:00
										 |  |  |               brew cask install #{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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:34:11 +08:00
										 |  |  |   def migrate_formula_rename | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-31 10:28:45 +01:00
										 |  |  |       Migrator.migrate_if_needed(f) | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |   extend Forwardable | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |   attr_reader :reporters | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |   def select_formula(key) | 
					
						
							|  |  |  |     @hash.fetch(key, []) | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |   def add(reporter) | 
					
						
							|  |  |  |     @reporters << reporter | 
					
						
							| 
									
										
										
										
											2016-09-10 10:24:57 +01:00
										 |  |  |     report = reporter.report.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
										 |  |  | 
 | 
					
						
							|  |  |  |   def dump | 
					
						
							|  |  |  |     # Key Legend: Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dump_formula_report :A, "New Formulae" | 
					
						
							|  |  |  |     dump_formula_report :M, "Updated Formulae" | 
					
						
							|  |  |  |     dump_formula_report :R, "Renamed Formulae" | 
					
						
							|  |  |  |     dump_formula_report :D, "Deleted Formulae" | 
					
						
							| 
									
										
										
										
											2020-03-02 17:08:24 -05:00
										 |  |  |     dump_formula_report :MC, "Updated Casks" | 
					
						
							| 
									
										
										
										
											2020-03-03 10:03:46 -05:00
										 |  |  |     dump_formula_report :DC, "Deleted Casks" | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  |   def dump_formula_report(key, title) | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |     formulae = select_formula(key).sort.map do |name, new_name| | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |       # Format list items of renamed formulae | 
					
						
							| 
									
										
										
										
											2017-04-04 15:15:42 +01:00
										 |  |  |       case key | 
					
						
							|  |  |  |       when :R | 
					
						
							| 
									
										
										
										
											2016-02-25 15:43:02 +08:00
										 |  |  |         name = pretty_installed(name) if installed?(name) | 
					
						
							|  |  |  |         new_name = pretty_installed(new_name) if installed?(new_name) | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |         "#{name} -> #{new_name}" | 
					
						
							| 
									
										
										
										
											2017-04-04 15:15:42 +01:00
										 |  |  |       when :A | 
					
						
							|  |  |  |         name unless installed?(name) | 
					
						
							| 
									
										
										
										
											2020-03-05 11:14:37 -05:00
										 |  |  |       when :MC, :DC | 
					
						
							|  |  |  |         name = name.split("/").last | 
					
						
							|  |  |  |         cask_installed?(name) ? pretty_installed(name) : name | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  |       else | 
					
						
							|  |  |  |         installed?(name) ? pretty_installed(name) : name | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-04-04 15:15:42 +01:00
										 |  |  |     end.compact | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |     return if formulae.empty? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |     # Dump formula list. | 
					
						
							|  |  |  |     ohai title | 
					
						
							| 
									
										
										
										
											2017-10-14 04:22:22 +01:00
										 |  |  |     puts Formatter.columns(formulae.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
										 |  |  | 
 | 
					
						
							|  |  |  |   def cask_installed?(cask) | 
					
						
							|  |  |  |     (Cask::Caskroom.path/cask).directory? | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-01-10 20:28:52 +00:00
										 |  |  | end |