Copy and tweak code from Library/Homebrew/system_config.rb:110 to commit
and date information. This information can be useful when debugging
formulae in custom taps to ensure the tap has been correctly updated
recently or to suss out important differences from one version of a tap
to another.
This removes the need to ask users to run something like
git -C $(brew --repository)/Library/Taps/<tap> show -s --decorate
Close https://github.com/Homebrew/brew/issues/18381
98 lines
3.2 KiB
Ruby
98 lines
3.2 KiB
Ruby
# typed: strict
|
|
# frozen_string_literal: true
|
|
|
|
require "abstract_command"
|
|
|
|
module Homebrew
|
|
module Cmd
|
|
class TapInfo < AbstractCommand
|
|
cmd_args do
|
|
description <<~EOS
|
|
Show detailed information about one or more <tap>s.
|
|
If no <tap> names are provided, display brief statistics for all installed taps.
|
|
EOS
|
|
switch "--installed",
|
|
description: "Show information on each installed tap."
|
|
flag "--json",
|
|
description: "Print a JSON representation of <tap>. Currently the default and only accepted " \
|
|
"value for <version> is `v1`. See the docs for examples of using the JSON " \
|
|
"output: <https://docs.brew.sh/Querying-Brew>"
|
|
|
|
named_args :tap
|
|
end
|
|
|
|
sig { override.void }
|
|
def run
|
|
require "tap"
|
|
|
|
taps = if args.installed?
|
|
Tap
|
|
else
|
|
args.named.to_taps
|
|
end
|
|
|
|
if args.json
|
|
raise UsageError, "invalid JSON version: #{args.json}" unless ["v1", true].include? args.json
|
|
|
|
print_tap_json(taps.sort_by(&:to_s))
|
|
else
|
|
print_tap_info(taps.sort_by(&:to_s))
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
sig { params(taps: T::Array[Tap]).void }
|
|
def print_tap_info(taps)
|
|
if taps.none?
|
|
tap_count = 0
|
|
formula_count = 0
|
|
command_count = 0
|
|
private_count = 0
|
|
Tap.installed.each do |tap|
|
|
tap_count += 1
|
|
formula_count += tap.formula_files.size
|
|
command_count += tap.command_files.size
|
|
private_count += 1 if tap.private?
|
|
end
|
|
info = Utils.pluralize("tap", tap_count, include_count: true)
|
|
info += ", #{private_count} private"
|
|
info += ", #{Utils.pluralize("formula", formula_count, plural: "e", include_count: true)}"
|
|
info += ", #{Utils.pluralize("command", command_count, include_count: true)}"
|
|
info += ", #{HOMEBREW_TAP_DIRECTORY.dup.abv}" if HOMEBREW_TAP_DIRECTORY.directory?
|
|
puts info
|
|
else
|
|
info = ""
|
|
taps.each_with_index do |tap, i|
|
|
puts unless i.zero?
|
|
info = "#{tap}: "
|
|
if tap.installed?
|
|
info += "Installed"
|
|
info += if (contents = tap.contents).blank?
|
|
"\nNo commands/casks/formulae"
|
|
else
|
|
"\n#{contents.join(", ")}"
|
|
end
|
|
info += "\nPrivate" if tap.private?
|
|
info += "\n#{tap.path} (#{tap.path.abv})"
|
|
info += "\nFrom: #{tap.remote.presence || "N/A"}"
|
|
info += "\norigin: #{tap.remote}" if tap.remote != tap.default_remote
|
|
info += "\nHEAD: #{tap.git_head || "(none)"}"
|
|
info += "\nlast commit: #{tap.git_last_commit || "never"}"
|
|
info += "\nbranch: #{tap.git_branch || "(none)"}" if tap.git_branch != "master"
|
|
else
|
|
info += "Not installed"
|
|
end
|
|
puts info
|
|
end
|
|
end
|
|
end
|
|
|
|
sig { params(taps: T::Array[Tap]).void }
|
|
def print_tap_json(taps)
|
|
puts JSON.pretty_generate(taps.map(&:to_hash))
|
|
end
|
|
end
|
|
end
|
|
end
|