2020-11-25 17:03:23 +01:00
|
|
|
# typed: true
|
2020-08-02 00:59:36 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require "cli/parser"
|
|
|
|
require "formula"
|
|
|
|
require "livecheck/livecheck"
|
|
|
|
require "livecheck/strategy"
|
|
|
|
|
|
|
|
module Homebrew
|
2020-10-20 12:03:48 +02:00
|
|
|
extend T::Sig
|
|
|
|
|
2020-08-02 00:59:36 +05:30
|
|
|
module_function
|
|
|
|
|
|
|
|
WATCHLIST_PATH = (
|
|
|
|
ENV["HOMEBREW_LIVECHECK_WATCHLIST"] ||
|
2020-09-01 11:45:05 -07:00
|
|
|
"#{Dir.home}/.brew_livecheck_watchlist"
|
2020-08-02 00:59:36 +05:30
|
|
|
).freeze
|
|
|
|
|
2020-10-20 12:03:48 +02:00
|
|
|
sig { returns(CLI::Parser) }
|
2020-08-02 00:59:36 +05:30
|
|
|
def livecheck_args
|
|
|
|
Homebrew::CLI::Parser.new do
|
2021-01-15 15:04:02 -05:00
|
|
|
description <<~EOS
|
2020-09-03 21:18:04 -07:00
|
|
|
Check for newer versions of formulae and/or casks from upstream.
|
2020-08-02 00:59:36 +05:30
|
|
|
|
2020-12-12 10:12:58 -05:00
|
|
|
If no formula or cask argument is passed, the list of formulae and
|
|
|
|
casks to check is taken from `HOMEBREW_LIVECHECK_WATCHLIST` or
|
|
|
|
`~/.brew_livecheck_watchlist`.
|
2020-08-02 00:59:36 +05:30
|
|
|
EOS
|
|
|
|
switch "--full-name",
|
2020-09-03 21:18:04 -07:00
|
|
|
description: "Print formulae/casks with fully-qualified names."
|
2020-08-02 00:59:36 +05:30
|
|
|
flag "--tap=",
|
2020-09-03 21:18:04 -07:00
|
|
|
description: "Check formulae/casks within the given tap, specified as <user>`/`<repo>."
|
2020-08-02 00:59:36 +05:30
|
|
|
switch "--all",
|
2020-09-03 21:18:04 -07:00
|
|
|
description: "Check all available formulae/casks."
|
2020-09-03 00:41:16 +05:30
|
|
|
switch "--installed",
|
2020-09-03 21:18:04 -07:00
|
|
|
description: "Check formulae/casks that are currently installed."
|
2020-08-02 00:59:36 +05:30
|
|
|
switch "--newer-only",
|
2020-09-03 21:18:04 -07:00
|
|
|
description: "Show the latest version only if it's newer than the formula/cask."
|
2020-09-03 00:41:16 +05:30
|
|
|
switch "--json",
|
|
|
|
description: "Output information in JSON format."
|
|
|
|
switch "-q", "--quiet",
|
|
|
|
description: "Suppress warnings, don't print a progress bar for JSON output."
|
2020-09-03 21:33:08 -07:00
|
|
|
switch "--formula", "--formulae",
|
|
|
|
description: "Only check formulae."
|
|
|
|
switch "--cask", "--casks",
|
|
|
|
description: "Only check casks."
|
2020-11-27 11:41:08 -05:00
|
|
|
|
2020-08-02 00:59:36 +05:30
|
|
|
conflicts "--debug", "--json"
|
|
|
|
conflicts "--tap=", "--all", "--installed"
|
2020-09-03 21:33:08 -07:00
|
|
|
conflicts "--cask", "--formula"
|
2021-01-10 14:26:40 -05:00
|
|
|
|
|
|
|
named_args [:formula, :cask]
|
2020-08-02 00:59:36 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def livecheck
|
|
|
|
args = livecheck_args.parse
|
|
|
|
|
|
|
|
if args.debug? && args.verbose?
|
|
|
|
puts args
|
|
|
|
puts ENV["HOMEBREW_LIVECHECK_WATCHLIST"] if ENV["HOMEBREW_LIVECHECK_WATCHLIST"].present?
|
|
|
|
end
|
|
|
|
|
2020-12-18 10:47:09 -05:00
|
|
|
formulae_and_casks_to_check =
|
|
|
|
if args.tap
|
|
|
|
tap = Tap.fetch(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 args.all?
|
|
|
|
formulae = args.cask? ? [] : Formula.to_a
|
|
|
|
casks = args.formula? ? [] : Cask::Cask.to_a
|
|
|
|
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)
|
2020-12-12 17:30:30 -05:00
|
|
|
|
2021-01-27 12:50:47 -08:00
|
|
|
named_args = T.unsafe(CLI::NamedArgs).new(*names, parent: args)
|
|
|
|
named_args.to_formulae_and_casks(ignore_unavailable: true)
|
2020-12-18 10:47:09 -05:00
|
|
|
rescue Errno::ENOENT => e
|
|
|
|
onoe e
|
2020-09-03 21:33:08 -07:00
|
|
|
end
|
2020-12-18 21:59:31 +09:00
|
|
|
else
|
2020-12-20 11:34:07 +09:00
|
|
|
raise UsageError, "A watchlist file is required when no arguments are given."
|
2020-12-18 10:47:09 -05:00
|
|
|
end&.sort_by do |formula_or_cask|
|
|
|
|
formula_or_cask.respond_to?(:token) ? formula_or_cask.token : formula_or_cask.name
|
2020-08-02 00:59:36 +05:30
|
|
|
end
|
|
|
|
|
2020-09-02 12:24:21 -07:00
|
|
|
raise UsageError, "No formulae or casks to check." if formulae_and_casks_to_check.blank?
|
2020-08-02 00:59:36 +05:30
|
|
|
|
2020-12-14 14:30:36 +01:00
|
|
|
options = {
|
2021-02-18 15:05:01 +05:30
|
|
|
json: args.json?,
|
|
|
|
full_name: args.full_name?,
|
2021-03-04 01:01:56 +05:30
|
|
|
handle_name_conflict: !args.formula? && !args.cask?,
|
2021-02-18 15:05:01 +05:30
|
|
|
newer_only: args.newer_only?,
|
|
|
|
quiet: args.quiet?,
|
|
|
|
debug: args.debug?,
|
|
|
|
verbose: args.verbose?,
|
2020-12-14 14:30:36 +01:00
|
|
|
}.compact
|
|
|
|
|
|
|
|
Livecheck.run_checks(formulae_and_casks_to_check, **options)
|
2020-08-02 00:59:36 +05:30
|
|
|
end
|
|
|
|
end
|