| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2020-06-29 10:16:58 -05:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  | require "abstract_command" | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | require "bump_version_parser" | 
					
						
							| 
									
										
										
										
											2021-01-11 08:29:34 +05:30
										 |  |  | require "livecheck/livecheck" | 
					
						
							| 
									
										
										
										
											2024-07-14 10:08:55 -04:00
										 |  |  | require "utils/repology" | 
					
						
							| 
									
										
										
										
											2020-06-29 09:47:19 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |   module DevCmd | 
					
						
							|  |  |  |     class Bump < AbstractCommand | 
					
						
							|  |  |  |       class VersionBumpInfo < T::Struct | 
					
						
							|  |  |  |         const :type, Symbol | 
					
						
							|  |  |  |         const :multiple_versions, T::Boolean | 
					
						
							|  |  |  |         const :version_name, String | 
					
						
							|  |  |  |         const :current_version, BumpVersionParser | 
					
						
							|  |  |  |         const :repology_latest, T.any(String, Version) | 
					
						
							|  |  |  |         const :new_version, BumpVersionParser | 
					
						
							| 
									
										
										
										
											2024-08-30 08:55:13 +01:00
										 |  |  |         const :duplicate_pull_requests, T.nilable(T.any(T::Array[String], String)) | 
					
						
							|  |  |  |         const :maybe_duplicate_pull_requests, T.nilable(T.any(T::Array[String], String)) | 
					
						
							| 
									
										
										
										
											2023-08-05 09:51:54 -07:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2020-08-16 20:38:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       cmd_args do | 
					
						
							|  |  |  |         description <<~EOS | 
					
						
							| 
									
										
										
										
											2024-07-14 23:46:17 -04:00
										 |  |  |           Displays out-of-date packages and the latest version available. If the | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           returned current and livecheck versions differ or when querying specific | 
					
						
							| 
									
										
										
										
											2024-07-14 23:46:17 -04:00
										 |  |  |           packages, also displays whether a pull request has been opened with the URL. | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         EOS | 
					
						
							|  |  |  |         switch "--full-name", | 
					
						
							|  |  |  |                description: "Print formulae/casks with fully-qualified names." | 
					
						
							|  |  |  |         switch "--no-pull-requests", | 
					
						
							|  |  |  |                description: "Do not retrieve pull requests from GitHub." | 
					
						
							| 
									
										
										
										
											2024-09-02 19:50:07 +08:00
										 |  |  |         switch "--auto", | 
					
						
							| 
									
										
										
										
											2024-09-02 22:10:05 +08:00
										 |  |  |                description: "Read the list of formulae/casks from the tap autobump list.", | 
					
						
							| 
									
										
										
										
											2024-09-02 19:50:07 +08:00
										 |  |  |                hidden:      true | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         switch "--formula", "--formulae", | 
					
						
							|  |  |  |                description: "Check only formulae." | 
					
						
							|  |  |  |         switch "--cask", "--casks", | 
					
						
							|  |  |  |                description: "Check only casks." | 
					
						
							| 
									
										
										
										
											2024-07-14 15:11:39 -04:00
										 |  |  |         switch "--eval-all", | 
					
						
							|  |  |  |                description: "Evaluate all formulae and casks." | 
					
						
							| 
									
										
										
										
											2024-07-14 16:35:10 -04:00
										 |  |  |         switch "--repology", | 
					
						
							|  |  |  |                description: "Use Repology to check for outdated packages." | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         flag   "--tap=", | 
					
						
							|  |  |  |                description: "Check formulae and casks within the given tap, specified as <user>`/`<repo>." | 
					
						
							|  |  |  |         switch "--installed", | 
					
						
							|  |  |  |                description: "Check formulae and casks that are currently installed." | 
					
						
							|  |  |  |         switch "--no-fork", | 
					
						
							|  |  |  |                description: "Don't try to fork the repository." | 
					
						
							|  |  |  |         switch "--open-pr", | 
					
						
							|  |  |  |                description: "Open a pull request for the new version if none have been opened yet." | 
					
						
							|  |  |  |         flag   "--start-with=", | 
					
						
							|  |  |  |                description: "Letter or word that the list of package results should alphabetically follow." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         conflicts "--cask", "--formula" | 
					
						
							|  |  |  |         conflicts "--tap=", "--installed" | 
					
						
							| 
									
										
										
										
											2024-07-14 23:11:23 -04:00
										 |  |  |         conflicts "--eval-all", "--installed" | 
					
						
							| 
									
										
										
										
											2024-09-02 19:50:07 +08:00
										 |  |  |         conflicts "--installed", "--auto" | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         conflicts "--no-pull-requests", "--open-pr" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         named_args [:formula, :cask], without_api: true | 
					
						
							| 
									
										
										
										
											2023-08-05 09:51:54 -07:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       sig { override.void } | 
					
						
							|  |  |  |       def run | 
					
						
							|  |  |  |         Homebrew.install_bundler_gems!(groups: ["livecheck"]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Homebrew.with_no_api_env do | 
					
						
							| 
									
										
										
										
											2024-07-14 23:11:23 -04:00
										 |  |  |           eval_all = args.eval_all? || Homebrew::EnvConfig.eval_all? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 19:50:07 +08:00
										 |  |  |           formulae_and_casks = if args.auto? | 
					
						
							| 
									
										
										
										
											2024-09-02 22:10:05 +08:00
										 |  |  |             raise UsageError, "`--formula` or `--cask` must be passed with `--auto`." if !args.formula? && !args.cask? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 19:50:07 +08:00
										 |  |  |             tap_arg = args.tap | 
					
						
							|  |  |  |             raise UsageError, "`--tap=` must be passed with `--auto`." if tap_arg.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             tap = Tap.fetch(tap_arg) | 
					
						
							| 
									
										
										
										
											2024-09-02 22:10:05 +08:00
										 |  |  |             autobump_list = tap.autobump | 
					
						
							|  |  |  |             what = args.cask? ? "casks" : "formulae" | 
					
						
							|  |  |  |             raise UsageError, "No autobumped #{what} found." if autobump_list.blank? | 
					
						
							| 
									
										
										
										
											2024-09-02 19:50:07 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 22:10:05 +08:00
										 |  |  |             autobump_list.map do |name| | 
					
						
							| 
									
										
										
										
											2024-09-02 19:50:07 +08:00
										 |  |  |               qualified_name = "#{tap.name}/#{name}" | 
					
						
							|  |  |  |               next Cask::CaskLoader.load(qualified_name) if args.cask? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               Formulary.factory(qualified_name) | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           elsif args.tap | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |             tap = Tap.fetch(T.must(args.tap)) | 
					
						
							| 
									
										
										
										
											2024-09-06 16:39:55 +08:00
										 |  |  |             raise UsageError, "`--tap` requires `--auto` for official taps." if tap.official? | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             formulae = args.cask? ? [] : tap.formula_files.map { |path| Formulary.factory(path) } | 
					
						
							|  |  |  |             casks = args.formula? ? [] : tap.cask_files.map { |path| Cask::CaskLoader.load(path) } | 
					
						
							|  |  |  |             formulae + casks | 
					
						
							|  |  |  |           elsif args.installed? | 
					
						
							|  |  |  |             formulae = args.cask? ? [] : Formula.installed | 
					
						
							|  |  |  |             casks = args.formula? ? [] : Cask::Caskroom.casks | 
					
						
							|  |  |  |             formulae + casks | 
					
						
							|  |  |  |           elsif args.named.present? | 
					
						
							| 
									
										
										
										
											2024-05-06 23:34:23 -07:00
										 |  |  |             args.named.to_formulae_and_casks_with_taps | 
					
						
							| 
									
										
										
										
											2024-07-14 23:11:23 -04:00
										 |  |  |           elsif eval_all | 
					
						
							|  |  |  |             formulae = args.cask? ? [] : Formula.all(eval_all:) | 
					
						
							|  |  |  |             casks = args.formula? ? [] : Cask::Cask.all(eval_all:) | 
					
						
							| 
									
										
										
										
											2024-07-14 15:11:39 -04:00
										 |  |  |             formulae + casks | 
					
						
							| 
									
										
										
										
											2024-07-14 23:11:23 -04:00
										 |  |  |           else | 
					
						
							| 
									
										
										
										
											2024-07-14 23:13:59 -04:00
										 |  |  |             raise UsageError, | 
					
						
							|  |  |  |                   "`brew bump` without named arguments needs `--installed` or `--eval-all` passed or " \ | 
					
						
							|  |  |  |                   "`HOMEBREW_EVAL_ALL` set!" | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2021-03-04 01:39:37 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 23:46:17 -04:00
										 |  |  |           if args.start_with | 
					
						
							|  |  |  |             formulae_and_casks.select! do |formula_or_cask| | 
					
						
							|  |  |  |               name = formula_or_cask.respond_to?(:token) ? formula_or_cask.token : formula_or_cask.name | 
					
						
							|  |  |  |               name.start_with?(args.start_with) | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           formulae_and_casks = formulae_and_casks&.sort_by do |formula_or_cask| | 
					
						
							|  |  |  |             formula_or_cask.respond_to?(:token) ? formula_or_cask.token : formula_or_cask.name | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2024-03-14 02:38:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 23:46:17 -04:00
										 |  |  |           if args.repology? && !Utils::Curl.curl_supports_tls13? | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |             begin | 
					
						
							|  |  |  |               ensure_formula_installed!("curl", reason: "Repology queries") unless HOMEBREW_BREWED_CURL_PATH.exist? | 
					
						
							|  |  |  |             rescue FormulaUnavailableError | 
					
						
							|  |  |  |               opoo "A newer `curl` is required for Repology queries." | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2020-07-02 17:06:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 23:11:23 -04:00
										 |  |  |           handle_formulae_and_casks(formulae_and_casks) | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-02-17 00:09:02 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       private | 
					
						
							| 
									
										
										
										
											2020-07-28 09:30:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 16:35:10 -04:00
										 |  |  |       sig { params(formula_or_cask: T.any(Formula, Cask::Cask)).returns(T::Boolean) } | 
					
						
							|  |  |  |       def skip_repology?(formula_or_cask) | 
					
						
							|  |  |  |         return true unless args.repology? | 
					
						
							| 
									
										
										
										
											2024-04-04 09:43:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 16:35:10 -04:00
										 |  |  |         (ENV["CI"].present? && args.open_pr? && formula_or_cask.livecheckable?) || | 
					
						
							|  |  |  |           (formula_or_cask.is_a?(Formula) && formula_or_cask.versioned_formula?) | 
					
						
							| 
									
										
										
										
											2020-08-16 20:38:03 -05:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       sig { params(formulae_and_casks: T::Array[T.any(Formula, Cask::Cask)]).void } | 
					
						
							| 
									
										
										
										
											2024-07-14 23:11:23 -04:00
										 |  |  |       def handle_formulae_and_casks(formulae_and_casks) | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         Livecheck.load_other_tap_strategies(formulae_and_casks) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ambiguous_casks = [] | 
					
						
							|  |  |  |         if !args.formula? && !args.cask? | 
					
						
							|  |  |  |           ambiguous_casks = formulae_and_casks | 
					
						
							|  |  |  |                             .group_by { |item| Livecheck.package_or_resource_name(item, full_name: true) } | 
					
						
							|  |  |  |                             .values | 
					
						
							|  |  |  |                             .select { |items| items.length > 1 } | 
					
						
							|  |  |  |                             .flatten | 
					
						
							|  |  |  |                             .select { |item| item.is_a?(Cask::Cask) } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-02-17 00:09:02 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         ambiguous_names = [] | 
					
						
							|  |  |  |         unless args.full_name? | 
					
						
							|  |  |  |           ambiguous_names = (formulae_and_casks - ambiguous_casks) | 
					
						
							|  |  |  |                             .group_by { |item| Livecheck.package_or_resource_name(item) } | 
					
						
							|  |  |  |                             .values | 
					
						
							|  |  |  |                             .select { |items| items.length > 1 } | 
					
						
							|  |  |  |                             .flatten | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-01-11 08:29:34 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         formulae_and_casks.each_with_index do |formula_or_cask, i| | 
					
						
							|  |  |  |           puts if i.positive? | 
					
						
							|  |  |  |           next if skip_ineligible_formulae(formula_or_cask) | 
					
						
							| 
									
										
										
										
											2021-09-24 22:44:27 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           use_full_name = args.full_name? || ambiguous_names.include?(formula_or_cask) | 
					
						
							|  |  |  |           name = Livecheck.package_or_resource_name(formula_or_cask, full_name: use_full_name) | 
					
						
							|  |  |  |           repository = if formula_or_cask.is_a?(Formula) | 
					
						
							|  |  |  |             Repology::HOMEBREW_CORE | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             Repology::HOMEBREW_CASK | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2021-01-11 08:29:34 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           package_data = Repology.single_package_query(name, repository:) unless skip_repology?(formula_or_cask) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           retrieve_and_display_info_and_open_pr( | 
					
						
							|  |  |  |             formula_or_cask, | 
					
						
							|  |  |  |             name, | 
					
						
							| 
									
										
										
										
											2024-03-20 13:40:35 -07:00
										 |  |  |             package_data&.values&.first || [], | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |             ambiguous_cask: ambiguous_casks.include?(formula_or_cask), | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-02-17 00:09:02 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       sig { | 
					
						
							|  |  |  |         params(formula_or_cask: T.any(Formula, Cask::Cask)).returns(T::Boolean) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       def skip_ineligible_formulae(formula_or_cask) | 
					
						
							|  |  |  |         if formula_or_cask.is_a?(Formula) | 
					
						
							|  |  |  |           skip = formula_or_cask.disabled? || formula_or_cask.head_only? | 
					
						
							|  |  |  |           name = formula_or_cask.name | 
					
						
							| 
									
										
										
										
											2024-05-31 10:23:13 +01:00
										 |  |  |           text = "Formula is #{formula_or_cask.disabled? ? "disabled" : "HEAD-only"} so not accepting updates.\n" | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         else | 
					
						
							|  |  |  |           skip = formula_or_cask.disabled? | 
					
						
							|  |  |  |           name = formula_or_cask.token | 
					
						
							| 
									
										
										
										
											2024-05-31 10:23:13 +01:00
										 |  |  |           text = "Cask is disabled so not accepting updates.\n" | 
					
						
							| 
									
										
										
										
											2021-02-17 00:09:02 +05:30
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         if (tap = formula_or_cask.tap) && !tap.allow_bump?(name) | 
					
						
							|  |  |  |           skip = true | 
					
						
							| 
									
										
										
										
											2024-05-31 10:23:13 +01:00
										 |  |  |           text = "#{text.split.first} is autobumped so will have bump PRs opened by BrewTestBot every ~3 hours.\n" | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         end | 
					
						
							|  |  |  |         return false unless skip | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ohai name | 
					
						
							|  |  |  |         puts text | 
					
						
							|  |  |  |         true | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       sig { | 
					
						
							| 
									
										
										
										
											2024-03-21 09:12:14 -04:00
										 |  |  |         params(formula_or_cask: T.any(Formula, Cask::Cask)).returns(T.any(Version, String)) | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |       def livecheck_result(formula_or_cask) | 
					
						
							|  |  |  |         name = Livecheck.package_or_resource_name(formula_or_cask) | 
					
						
							| 
									
										
										
										
											2023-09-13 18:02:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         referenced_formula_or_cask, = Livecheck.resolve_livecheck_reference( | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  |           formula_or_cask, | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           full_name: false, | 
					
						
							|  |  |  |           debug:     false, | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2020-08-16 20:38:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         # Check skip conditions for a referenced formula/cask | 
					
						
							|  |  |  |         if referenced_formula_or_cask | 
					
						
							|  |  |  |           skip_info = Livecheck::SkipConditions.referenced_skip_information( | 
					
						
							|  |  |  |             referenced_formula_or_cask, | 
					
						
							|  |  |  |             name, | 
					
						
							|  |  |  |             full_name: false, | 
					
						
							|  |  |  |             verbose:   false, | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-09-13 18:02:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         skip_info ||= Livecheck::SkipConditions.skip_information( | 
					
						
							|  |  |  |           formula_or_cask, | 
					
						
							|  |  |  |           full_name: false, | 
					
						
							|  |  |  |           verbose:   false, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-07-19 12:55:57 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         if skip_info.present? | 
					
						
							| 
									
										
										
										
											2024-03-19 11:17:00 -04:00
										 |  |  |           return "#{skip_info[:status]}" \ | 
					
						
							| 
									
										
										
										
											2024-03-21 09:12:14 -04:00
										 |  |  |                  "#{" - #{skip_info[:messages].join(", ")}" if skip_info[:messages].present?}" | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         version_info = Livecheck.latest_version( | 
					
						
							|  |  |  |           formula_or_cask, | 
					
						
							|  |  |  |           referenced_formula_or_cask:, | 
					
						
							|  |  |  |           json: true, full_name: false, verbose: true, debug: false | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-03-21 09:12:14 -04:00
										 |  |  |         return "unable to get versions" if version_info.blank? | 
					
						
							| 
									
										
										
										
											2020-08-16 19:22:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 09:12:14 -04:00
										 |  |  |         if !version_info.key?(:latest_throttled) | 
					
						
							|  |  |  |           Version.new(version_info[:latest]) | 
					
						
							| 
									
										
										
										
											2024-03-19 11:17:00 -04:00
										 |  |  |         elsif version_info[:latest_throttled].nil? | 
					
						
							|  |  |  |           "unable to get throttled versions" | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           Version.new(version_info[:latest_throttled]) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       rescue => e | 
					
						
							| 
									
										
										
										
											2024-03-21 09:12:14 -04:00
										 |  |  |         "error: #{e}" | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-01-11 08:29:34 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       sig { | 
					
						
							|  |  |  |         params( | 
					
						
							|  |  |  |           formula_or_cask: T.any(Formula, Cask::Cask), | 
					
						
							|  |  |  |           name:            String, | 
					
						
							|  |  |  |           version:         T.nilable(String), | 
					
						
							|  |  |  |         ).returns T.nilable(T.any(T::Array[String], String)) | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2024-08-30 08:55:13 +01:00
										 |  |  |       def retrieve_pull_requests(formula_or_cask, name, version: nil) | 
					
						
							| 
									
										
										
										
											2024-09-25 10:03:17 -04:00
										 |  |  |         tap_remote_repo = formula_or_cask.tap&.remote_repository || formula_or_cask.tap&.full_name | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         pull_requests = begin | 
					
						
							| 
									
										
										
										
											2024-09-25 10:03:17 -04:00
										 |  |  |           GitHub.fetch_pull_requests(name, tap_remote_repo, version:) | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         rescue GitHub::API::ValidationFailedError => e | 
					
						
							|  |  |  |           odebug "Error fetching pull requests for #{formula_or_cask} #{name}: #{e}" | 
					
						
							|  |  |  |           nil | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-11-24 10:01:48 -05:00
										 |  |  |         return if pull_requests.blank? | 
					
						
							| 
									
										
										
										
											2020-07-02 17:06:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-24 10:01:48 -05:00
										 |  |  |         pull_requests.map { |pr| "#{pr["title"]} (#{Formatter.url(pr["html_url"])})" }.join(", ") | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2024-01-19 19:46:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       sig { | 
					
						
							|  |  |  |         params( | 
					
						
							|  |  |  |           formula_or_cask: T.any(Formula, Cask::Cask), | 
					
						
							| 
									
										
										
										
											2024-07-04 10:35:00 +01:00
										 |  |  |           repositories:    T::Array[String], | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           name:            String, | 
					
						
							|  |  |  |         ).returns(VersionBumpInfo) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       def retrieve_versions_by_arch(formula_or_cask:, repositories:, name:) | 
					
						
							|  |  |  |         is_cask_with_blocks = formula_or_cask.is_a?(Cask::Cask) && formula_or_cask.on_system_blocks_exist? | 
					
						
							|  |  |  |         type, version_name = if formula_or_cask.is_a?(Formula) | 
					
						
							|  |  |  |           [:formula, "formula version:"] | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           [:cask, "cask version:   "] | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-07-06 03:32:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         old_versions = {} | 
					
						
							|  |  |  |         new_versions = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         repology_latest = repositories.present? ? Repology.latest_version(repositories) : "not found" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # When blocks are absent, arch is not relevant. For consistency, we simulate the arm architecture. | 
					
						
							|  |  |  |         arch_options = is_cask_with_blocks ? OnSystem::ARCH_OPTIONS : [:arm] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         arch_options.each do |arch| | 
					
						
							|  |  |  |           SimulateSystem.with(arch:) do | 
					
						
							|  |  |  |             version_key = is_cask_with_blocks ? arch : :general | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # We reload the formula/cask here to ensure we're getting the correct version for the current arch | 
					
						
							|  |  |  |             if formula_or_cask.is_a?(Formula) | 
					
						
							|  |  |  |               loaded_formula_or_cask = formula_or_cask | 
					
						
							|  |  |  |               current_version_value = T.must(loaded_formula_or_cask.stable).version | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |               loaded_formula_or_cask = Cask::CaskLoader.load(formula_or_cask.sourcefile_path) | 
					
						
							|  |  |  |               current_version_value = Version.new(loaded_formula_or_cask.version) | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 09:12:14 -04:00
										 |  |  |             livecheck_latest = livecheck_result(loaded_formula_or_cask) | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-02 15:03:54 +02:00
										 |  |  |             new_version_value = if (livecheck_latest.is_a?(Version) && | 
					
						
							|  |  |  |                                     Livecheck::LivecheckVersion.create(formula_or_cask, livecheck_latest) >= | 
					
						
							|  |  |  |                                     Livecheck::LivecheckVersion.create(formula_or_cask, current_version_value)) || | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |                                    current_version_value == "latest" | 
					
						
							|  |  |  |               livecheck_latest | 
					
						
							|  |  |  |             elsif livecheck_latest.is_a?(String) && livecheck_latest.start_with?("skipped") | 
					
						
							|  |  |  |               "skipped" | 
					
						
							|  |  |  |             elsif repology_latest.is_a?(Version) && | 
					
						
							|  |  |  |                   repology_latest > current_version_value && | 
					
						
							|  |  |  |                   !loaded_formula_or_cask.livecheckable? && | 
					
						
							|  |  |  |                   current_version_value != "latest" | 
					
						
							|  |  |  |               repology_latest | 
					
						
							|  |  |  |             end.presence | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Store old and new versions | 
					
						
							|  |  |  |             old_versions[version_key] = current_version_value | 
					
						
							|  |  |  |             new_versions[version_key] = new_version_value | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         # If arm and intel versions are identical, as it happens with casks where only the checksums differ, | 
					
						
							|  |  |  |         # we consolidate them into a single version. | 
					
						
							|  |  |  |         if old_versions[:arm].present? && old_versions[:arm] == old_versions[:intel] | 
					
						
							|  |  |  |           old_versions = { general: old_versions[:arm] } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         if new_versions[:arm].present? && new_versions[:arm] == new_versions[:intel] | 
					
						
							|  |  |  |           new_versions = { general: new_versions[:arm] } | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         multiple_versions = old_versions.values_at(:arm, :intel).all?(&:present?) || | 
					
						
							|  |  |  |                             new_versions.values_at(:arm, :intel).all?(&:present?) | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         current_version = BumpVersionParser.new(general: old_versions[:general], | 
					
						
							|  |  |  |                                                 arm:     old_versions[:arm], | 
					
						
							|  |  |  |                                                 intel:   old_versions[:intel]) | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         begin | 
					
						
							|  |  |  |           new_version = BumpVersionParser.new(general: new_versions[:general], | 
					
						
							|  |  |  |                                               arm:     new_versions[:arm], | 
					
						
							|  |  |  |                                               intel:   new_versions[:intel]) | 
					
						
							|  |  |  |         rescue | 
					
						
							|  |  |  |           # When livecheck fails, we fail gracefully. Otherwise VersionParser will | 
					
						
							|  |  |  |           # raise a usage error | 
					
						
							|  |  |  |           new_version = BumpVersionParser.new(general: "unable to get versions") | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-24 20:37:18 -05:00
										 |  |  |         if !args.no_pull_requests? && | 
					
						
							|  |  |  |            (new_version.general != "unable to get versions") && | 
					
						
							|  |  |  |            (new_version != current_version) | 
					
						
							|  |  |  |           # We use the ARM version for the pull request version. This is | 
					
						
							|  |  |  |           # consistent with the behavior of bump-cask-pr. | 
					
						
							|  |  |  |           pull_request_version = if multiple_versions | 
					
						
							|  |  |  |             new_version.arm.to_s | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             new_version.general.to_s | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-24 10:01:48 -05:00
										 |  |  |           duplicate_pull_requests = retrieve_pull_requests( | 
					
						
							|  |  |  |             formula_or_cask, | 
					
						
							|  |  |  |             name, | 
					
						
							|  |  |  |             version: pull_request_version, | 
					
						
							|  |  |  |           ) | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-24 10:01:48 -05:00
										 |  |  |           maybe_duplicate_pull_requests = if duplicate_pull_requests.nil? | 
					
						
							|  |  |  |             retrieve_pull_requests(formula_or_cask, name) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2022-01-12 17:31:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         VersionBumpInfo.new( | 
					
						
							|  |  |  |           type:, | 
					
						
							|  |  |  |           multiple_versions:, | 
					
						
							|  |  |  |           version_name:, | 
					
						
							|  |  |  |           current_version:, | 
					
						
							|  |  |  |           repology_latest:, | 
					
						
							|  |  |  |           new_version:, | 
					
						
							| 
									
										
										
										
											2024-08-30 08:55:13 +01:00
										 |  |  |           duplicate_pull_requests:, | 
					
						
							|  |  |  |           maybe_duplicate_pull_requests:, | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         ) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       sig { | 
					
						
							|  |  |  |         params( | 
					
						
							|  |  |  |           formula_or_cask: T.any(Formula, Cask::Cask), | 
					
						
							|  |  |  |           name:            String, | 
					
						
							| 
									
										
										
										
											2024-07-04 10:35:00 +01:00
										 |  |  |           repositories:    T::Array[String], | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           ambiguous_cask:  T::Boolean, | 
					
						
							|  |  |  |         ).void | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       def retrieve_and_display_info_and_open_pr(formula_or_cask, name, repositories, ambiguous_cask: false) | 
					
						
							|  |  |  |         version_info = retrieve_versions_by_arch(formula_or_cask:, | 
					
						
							|  |  |  |                                                  repositories:, | 
					
						
							|  |  |  |                                                  name:) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         current_version = version_info.current_version | 
					
						
							|  |  |  |         new_version = version_info.new_version | 
					
						
							|  |  |  |         repology_latest = version_info.repology_latest | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Check if all versions are equal | 
					
						
							| 
									
										
										
										
											2024-11-24 10:01:48 -05:00
										 |  |  |         versions_equal = (new_version == current_version) | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         title_name = ambiguous_cask ? "#{name} (cask)" : name | 
					
						
							|  |  |  |         title = if (repology_latest == current_version.general || !repology_latest.is_a?(Version)) && versions_equal | 
					
						
							|  |  |  |           "#{title_name} #{Tty.green}is up to date!#{Tty.reset}" | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           title_name | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-01-11 08:29:34 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         # Conditionally format output based on type of formula_or_cask | 
					
						
							|  |  |  |         current_versions = if version_info.multiple_versions | 
					
						
							|  |  |  |           "arm:   #{current_version.arm}
 | 
					
						
							| 
									
										
										
										
											2023-08-03 09:58:59 -04:00
										 |  |  |                           intel: #{current_version.intel}" | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         else | 
					
						
							|  |  |  |           current_version.general.to_s | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         current_versions << " (deprecated)" if formula_or_cask.deprecated? | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         new_versions = if version_info.multiple_versions && new_version.arm && new_version.intel | 
					
						
							|  |  |  |           "arm:   #{new_version.arm}
 | 
					
						
							| 
									
										
										
										
											2023-08-03 09:58:59 -04:00
										 |  |  |                           intel: #{new_version.intel}" | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         else | 
					
						
							|  |  |  |           new_version.general | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         version_label = version_info.version_name | 
					
						
							| 
									
										
										
										
											2024-11-24 10:01:48 -05:00
										 |  |  |         duplicate_pull_requests = version_info.duplicate_pull_requests | 
					
						
							|  |  |  |         maybe_duplicate_pull_requests = version_info.maybe_duplicate_pull_requests | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ohai title | 
					
						
							|  |  |  |         puts <<~EOS | 
					
						
							|  |  |  |           Current #{version_label}  #{current_versions} | 
					
						
							| 
									
										
										
										
											2024-03-19 11:17:00 -04:00
										 |  |  |           Latest livecheck version: #{new_versions}#{" (throttled)" if formula_or_cask.livecheck.throttle} | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         EOS | 
					
						
							|  |  |  |         puts <<~EOS unless skip_repology?(formula_or_cask) | 
					
						
							|  |  |  |           Latest Repology version:  #{repology_latest} | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |         if formula_or_cask.is_a?(Formula) && formula_or_cask.synced_with_other_formulae? | 
					
						
							|  |  |  |           outdated_synced_formulae = synced_with(formula_or_cask, new_version.general) | 
					
						
							|  |  |  |           puts <<~EOS if outdated_synced_formulae.present? | 
					
						
							|  |  |  |             Version syncing:          #{title_name} version should be kept in sync with | 
					
						
							|  |  |  |                                       #{outdated_synced_formulae.join(", ")}. | 
					
						
							|  |  |  |           EOS | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-11-24 20:37:18 -05:00
										 |  |  |         if !args.no_pull_requests? && | 
					
						
							|  |  |  |            (new_version.general != "unable to get versions") && | 
					
						
							|  |  |  |            !versions_equal | 
					
						
							| 
									
										
										
										
											2024-11-24 10:01:48 -05:00
										 |  |  |           if duplicate_pull_requests | 
					
						
							|  |  |  |             duplicate_pull_requests_text = duplicate_pull_requests | 
					
						
							|  |  |  |           elsif maybe_duplicate_pull_requests | 
					
						
							|  |  |  |             duplicate_pull_requests_text = "none" | 
					
						
							|  |  |  |             maybe_duplicate_pull_requests_text = maybe_duplicate_pull_requests | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             duplicate_pull_requests_text = "none" | 
					
						
							|  |  |  |             maybe_duplicate_pull_requests_text = "none" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           puts "Duplicate pull requests:  #{duplicate_pull_requests_text}" | 
					
						
							|  |  |  |           if maybe_duplicate_pull_requests_text | 
					
						
							|  |  |  |             puts "Maybe duplicate pull requests: #{maybe_duplicate_pull_requests_text}" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return unless args.open_pr? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-28 11:56:25 +00:00
										 |  |  |         if GitHub.too_many_open_prs?(formula_or_cask.tap) | 
					
						
							|  |  |  |           odie "You have too many PRs open: close or merge some first!" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         if repology_latest.is_a?(Version) && | 
					
						
							|  |  |  |            repology_latest > current_version.general && | 
					
						
							|  |  |  |            repology_latest > new_version.general && | 
					
						
							|  |  |  |            formula_or_cask.livecheckable? | 
					
						
							|  |  |  |           puts "#{title_name} was not bumped to the Repology version because it's livecheckable." | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         if new_version.blank? || versions_equal || | 
					
						
							|  |  |  |            (!new_version.general.is_a?(Version) && !version_info.multiple_versions) | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-30 08:55:13 +01:00
										 |  |  |         return if duplicate_pull_requests.present? | 
					
						
							| 
									
										
										
										
											2023-07-26 07:52:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         version_args = if version_info.multiple_versions | 
					
						
							|  |  |  |           %W[--version-arm=#{new_version.arm} --version-intel=#{new_version.intel}] | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           "--version=#{new_version.general}" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2022-02-20 17:10:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         bump_cask_pr_args = [ | 
					
						
							|  |  |  |           "bump-#{version_info.type}-pr", | 
					
						
							|  |  |  |           name, | 
					
						
							|  |  |  |           *version_args, | 
					
						
							|  |  |  |           "--no-browse", | 
					
						
							|  |  |  |           "--message=Created by `brew bump`", | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2022-01-12 17:31:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         bump_cask_pr_args << "--no-fork" if args.no_fork? | 
					
						
							| 
									
										
										
										
											2024-02-23 12:20:59 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         system HOMEBREW_BREW_FILE, *bump_cask_pr_args | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2024-01-21 00:32:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |       sig { | 
					
						
							|  |  |  |         params( | 
					
						
							|  |  |  |           formula:     Formula, | 
					
						
							|  |  |  |           new_version: T.nilable(T.any(Version, Cask::DSL::Version)), | 
					
						
							|  |  |  |         ).returns(T::Array[String]) | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       def synced_with(formula, new_version) | 
					
						
							|  |  |  |         synced_with = [] | 
					
						
							| 
									
										
										
										
											2024-01-21 00:32:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |         formula.tap&.synced_versions_formulae&.each do |synced_formulae| | 
					
						
							|  |  |  |           next unless synced_formulae.include?(formula.name) | 
					
						
							| 
									
										
										
										
											2024-01-21 00:32:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |           synced_formulae.each do |synced_formula| | 
					
						
							|  |  |  |             synced_formula = Formulary.factory(synced_formula) | 
					
						
							|  |  |  |             next if synced_formula == formula.name | 
					
						
							| 
									
										
										
										
											2024-01-21 00:32:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 16:59:34 -07:00
										 |  |  |             synced_with << synced_formula.name if synced_formula.version != new_version | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         synced_with | 
					
						
							| 
									
										
										
										
											2024-01-21 00:32:12 +00:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-06-29 09:47:19 -05:00
										 |  |  | end |