diagnostics: add formula/cask dup check

Duplicate names across taps are a real pain to deal with, so let's warn the user.
This commit is contained in:
Adrian Ho 2025-02-18 20:44:36 +08:00
parent 2bd665f65a
commit 46b49ff34d

View File

@ -1040,6 +1040,40 @@ module Homebrew
end
end
def non_core_taps
@non_core_taps ||= Tap.installed.reject(&:core_tap?).reject(&:core_cask_tap?)
end
def check_for_duplicate_formulae
core_formula_names = CoreTap.instance.formula_names
shadowed_formula_full_names = non_core_taps.flat_map do |tap|
tap_formula_names = tap.formula_names.map { |s| s.delete_prefix("#{tap.name}/") }
(core_formula_names & tap_formula_names).map { |f| "#{tap.name}/#{f}" }
end.compact
return if shadowed_formula_full_names.empty?
<<~EOS
The following formulae have the same name as core formulae:
#{shadowed_formula_full_names.join("\n ")}
You will need to use their full names throughout Homebrew.
EOS
end
def check_for_duplicate_casks
core_cask_names = CoreCaskTap.instance.cask_tokens
shadowed_cask_full_names = non_core_taps.flat_map do |tap|
tap_cask_names = tap.cask_tokens.map { |s| s.delete_prefix("#{tap.name}/") }
(core_cask_names & tap_cask_names).map { |f| "#{tap.name}/#{f}" }
end.compact
return if shadowed_cask_full_names.empty?
<<~EOS
The following casks have the same name as core casks:
#{shadowed_cask_full_names.join("\n ")}
You will need to use their full names throughout Homebrew.
EOS
end
def all
methods.map(&:to_s).grep(/^check_/).sort
end