| 
									
										
										
										
											2020-11-25 17:03:23 +01:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2020-08-02 00:59:36 +05:30
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  | require "abstract_command" | 
					
						
							| 
									
										
										
										
											2020-08-02 00:59:36 +05:30
										 |  |  | require "formula" | 
					
						
							|  |  |  | require "livecheck/livecheck" | 
					
						
							|  |  |  | require "livecheck/strategy" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |   module DevCmd | 
					
						
							|  |  |  |     class LivecheckCmd < AbstractCommand | 
					
						
							|  |  |  |       cmd_args do | 
					
						
							|  |  |  |         description <<~EOS | 
					
						
							|  |  |  |           Check for newer versions of formulae and/or casks from upstream. | 
					
						
							|  |  |  |           If no formula or cask argument is passed, the list of formulae and | 
					
						
							|  |  |  |           casks to check is taken from `HOMEBREW_LIVECHECK_WATCHLIST` or | 
					
						
							|  |  |  |           `~/.homebrew/livecheck_watchlist.txt`. | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |         switch "--full-name", | 
					
						
							|  |  |  |                description: "Print formulae and casks with fully-qualified names." | 
					
						
							|  |  |  |         flag   "--tap=", | 
					
						
							|  |  |  |                description: "Check formulae and casks within the given tap, specified as <user>`/`<repo>." | 
					
						
							|  |  |  |         switch "--eval-all", | 
					
						
							|  |  |  |                description: "Evaluate all available formulae and casks, whether installed or not, to check them." | 
					
						
							|  |  |  |         switch "--installed", | 
					
						
							|  |  |  |                description: "Check formulae and casks that are currently installed." | 
					
						
							|  |  |  |         switch "--newer-only", | 
					
						
							|  |  |  |                description: "Show the latest version only if it's newer than the formula/cask." | 
					
						
							|  |  |  |         switch "--json", | 
					
						
							|  |  |  |                description: "Output information in JSON format." | 
					
						
							|  |  |  |         switch "-r", "--resources", | 
					
						
							|  |  |  |                description: "Also check resources for formulae." | 
					
						
							|  |  |  |         switch "-q", "--quiet", | 
					
						
							|  |  |  |                description: "Suppress warnings, don't print a progress bar for JSON output." | 
					
						
							|  |  |  |         switch "--formula", "--formulae", | 
					
						
							|  |  |  |                description: "Only check formulae." | 
					
						
							|  |  |  |         switch "--cask", "--casks", | 
					
						
							|  |  |  |                description: "Only check casks." | 
					
						
							|  |  |  |         switch "--extract-plist", | 
					
						
							| 
									
										
										
										
											2024-03-29 09:25:36 -04:00
										 |  |  |                description: "Enable checking multiple casks with ExtractPlist strategy." | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         conflicts "--debug", "--json" | 
					
						
							|  |  |  |         conflicts "--tap=", "--eval-all", "--installed" | 
					
						
							|  |  |  |         conflicts "--cask", "--formula" | 
					
						
							|  |  |  |         conflicts "--formula", "--extract-plist" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         named_args [:formula, :cask], without_api: true | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { override.void } | 
					
						
							|  |  |  |       def run | 
					
						
							|  |  |  |         Homebrew.install_bundler_gems!(groups: ["livecheck"]) | 
					
						
							| 
									
										
										
										
											2020-08-02 00:59:36 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |         all = args.eval_all? | 
					
						
							| 
									
										
										
										
											2023-07-28 17:17:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |         if args.debug? && args.verbose? | 
					
						
							|  |  |  |           puts args | 
					
						
							|  |  |  |           puts Homebrew::EnvConfig.livecheck_watchlist if Homebrew::EnvConfig.livecheck_watchlist.present? | 
					
						
							| 
									
										
										
										
											2023-07-28 17:17:14 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |         formulae_and_casks_to_check = Homebrew.with_no_api_env do | 
					
						
							|  |  |  |           if args.tap | 
					
						
							|  |  |  |             tap = Tap.fetch(T.must(args.tap)) | 
					
						
							|  |  |  |             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 all | 
					
						
							|  |  |  |             formulae = args.cask? ? [] : Formula.all(eval_all: args.eval_all?) | 
					
						
							|  |  |  |             casks = args.formula? ? [] : Cask::Cask.all(eval_all: args.eval_all?) | 
					
						
							|  |  |  |             formulae + casks | 
					
						
							|  |  |  |           elsif args.named.present? | 
					
						
							|  |  |  |             if args.formula? | 
					
						
							|  |  |  |               args.named.to_formulae | 
					
						
							|  |  |  |             elsif args.cask? | 
					
						
							|  |  |  |               args.named.to_casks | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |               args.named.to_formulae_and_casks | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           elsif File.exist?(watchlist_path) | 
					
						
							|  |  |  |             begin | 
					
						
							|  |  |  |               names = Pathname.new(watchlist_path).read.lines | 
					
						
							|  |  |  |                               .reject { |line| line.start_with?("#") || line.blank? } | 
					
						
							|  |  |  |                               .map(&:strip) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |               named_args = CLI::NamedArgs.new(*names, parent: args) | 
					
						
							|  |  |  |               named_args.to_formulae_and_casks(ignore_unavailable: true) | 
					
						
							|  |  |  |             rescue Errno::ENOENT => e | 
					
						
							|  |  |  |               onoe e | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           else | 
					
						
							|  |  |  |             raise UsageError, "A watchlist file is required when no arguments are given." | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2023-07-28 17:17:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |         formulae_and_casks_to_check = formulae_and_casks_to_check.sort_by do |formula_or_cask| | 
					
						
							|  |  |  |           formula_or_cask.respond_to?(:token) ? formula_or_cask.token : formula_or_cask.name | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2020-08-02 00:59:36 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |         raise UsageError, "No formulae or casks to check." if formulae_and_casks_to_check.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         options = { | 
					
						
							|  |  |  |           json:                 args.json?, | 
					
						
							|  |  |  |           full_name:            args.full_name?, | 
					
						
							|  |  |  |           handle_name_conflict: !args.formula? && !args.cask?, | 
					
						
							|  |  |  |           check_resources:      args.resources?, | 
					
						
							|  |  |  |           newer_only:           args.newer_only?, | 
					
						
							|  |  |  |           extract_plist:        args.extract_plist?, | 
					
						
							|  |  |  |           quiet:                args.quiet?, | 
					
						
							|  |  |  |           debug:                args.debug?, | 
					
						
							|  |  |  |           verbose:              args.verbose?, | 
					
						
							|  |  |  |         }.compact | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Livecheck.run_checks(formulae_and_casks_to_check, **options) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-09-04 21:52:51 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |       private | 
					
						
							| 
									
										
										
										
											2022-09-05 13:57:22 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |       def watchlist_path | 
					
						
							|  |  |  |         @watchlist_path ||= begin | 
					
						
							|  |  |  |           watchlist = File.expand_path(Homebrew::EnvConfig.livecheck_watchlist) | 
					
						
							| 
									
										
										
										
											2020-08-02 00:59:36 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-21 10:48:43 -07:00
										 |  |  |           unless File.exist?(watchlist) | 
					
						
							|  |  |  |             previous_default_watchlist = File.expand_path("~/.brew_livecheck_watchlist") | 
					
						
							|  |  |  |             if File.exist?(previous_default_watchlist) | 
					
						
							|  |  |  |               odisabled "~/.brew_livecheck_watchlist", "~/.homebrew/livecheck_watchlist.txt" | 
					
						
							|  |  |  |               watchlist = previous_default_watchlist | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           watchlist | 
					
						
							| 
									
										
										
										
											2023-06-22 16:53:46 +01:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-03-04 23:54:25 +05:30
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-08-02 00:59:36 +05:30
										 |  |  |   end | 
					
						
							|  |  |  | end |