brew/Library/Homebrew/dev-cmd/livecheck.rb
Sam Ford 15a868c5e6
dev-cmd/livecheck: respect --cask and --formula
When running `brew livecheck --cask` or `brew livecheck --formula`,
livecheck wasn't properly respecting these flags. It should have
worked by only including the casks or formulae in the watchlist but
instead these flags were treating all the names in the watchlist as
formulae or casks, which doesn't work properly.

This addresses the issue by always using `#to_formulae_and_casks`
on the watchlist names and then using `#reject` to conditionally
exclude formulae or casks based on whether the related flags were
passed to `brew livecheck`.
2020-12-12 17:43:26 -05:00

107 lines
3.5 KiB
Ruby

# typed: true
# frozen_string_literal: true
require "cli/parser"
require "formula"
require "livecheck/livecheck"
require "livecheck/strategy"
module Homebrew
extend T::Sig
module_function
WATCHLIST_PATH = (
ENV["HOMEBREW_LIVECHECK_WATCHLIST"] ||
"#{Dir.home}/.brew_livecheck_watchlist"
).freeze
sig { returns(CLI::Parser) }
def livecheck_args
Homebrew::CLI::Parser.new do
usage_banner <<~EOS
`livecheck` [<formulae>|<casks>]
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
`~/.brew_livecheck_watchlist`.
EOS
switch "--full-name",
description: "Print formulae/casks with fully-qualified names."
flag "--tap=",
description: "Check formulae/casks within the given tap, specified as <user>`/`<repo>."
switch "--all",
description: "Check all available formulae/casks."
switch "--installed",
description: "Check formulae/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 "-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."
conflicts "--debug", "--json"
conflicts "--tap=", "--all", "--installed"
conflicts "--cask", "--formula"
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
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)
named_args = T.unsafe(CLI::NamedArgs).new(*names)
named_args.to_formulae_and_casks.reject do |formula_or_cask|
(args.formula? && !formula_or_cask.is_a?(Formula)) ||
(args.cask? && !formula_or_cask.is_a?(Cask::Cask))
end
rescue Errno::ENOENT => e
onoe e
end
end.sort_by do |formula_or_cask|
formula_or_cask.respond_to?(:token) ? formula_or_cask.token : formula_or_cask.name
end
raise UsageError, "No formulae or casks to check." if formulae_and_casks_to_check.blank?
Livecheck.run_checks(formulae_and_casks_to_check, args)
end
end