@@ -626,11 +626,18 @@ def versioned_formula? = name.include?("@")
626626 # Returns any other `@`-versioned formulae names for any Formula (including versioned formulae).
627627 sig { returns ( T ::Array [ String ] ) }
628628 def versioned_formulae_names
629- versioned_names = if tap
630- name_prefix = name . gsub ( /(@[\d .]+)?$/ , "" )
631- T . must ( tap ) . prefix_to_versioned_formulae_names . fetch ( name_prefix , [ ] )
629+ name_prefix = unversioned_formula_name || name
630+
631+ versioned_names = if ( formula_tap = tap )
632+ formula_tap . prefix_to_versioned_formulae_names . fetch ( name_prefix , [ ] )
632633 elsif path . exist?
633- Pathname . glob ( path . to_s . gsub ( /(@[\d .]+)?\. rb$/ , "@*.rb" ) )
634+ versioned_formula_glob = if name_prefix . end_with? ( "-full" )
635+ "#{ name_prefix . delete_suffix ( "-full" ) } @*-full.rb"
636+ else
637+ "#{ name_prefix } @*.rb"
638+ end
639+
640+ Pathname . glob ( ( path . dirname /versioned_formula_glob ) . to_s )
634641 . map { |path | path . basename ( ".rb" ) . to_s }
635642 . sort
636643 else
@@ -652,6 +659,94 @@ def versioned_formulae
652659 end . sort_by ( &:version ) . reverse
653660 end
654661
662+ sig { returns ( T . nilable ( String ) ) }
663+ def unversioned_formula_name
664+ return unless versioned_formula?
665+
666+ name . sub ( /@[\d .]+(?=-full$|$)/ , "" )
667+ end
668+
669+ # Returns the sibling `-full` or non-`-full` formula names for any Formula.
670+ sig { returns ( T ::Array [ String ] ) }
671+ def full_formulae_names
672+ [
673+ if name . end_with? ( "-full" )
674+ name . delete_suffix ( "-full" )
675+ else
676+ "#{ name } -full"
677+ end ,
678+ ]
679+ end
680+
681+ # Returns sibling `-full` or non-`-full` Formula objects for any Formula.
682+ sig { returns ( T ::Array [ Formula ] ) }
683+ def full_formulae
684+ full_formulae_names . filter_map do |formula_name |
685+ Formula [ formula_name ]
686+ rescue FormulaUnavailableError
687+ nil
688+ end . sort_by ( &:version ) . reverse
689+ end
690+
691+ sig { returns ( T . nilable ( String ) ) }
692+ def link_overwrite_reason
693+ installed_overwrite_formulae = link_overwrite_formulae . select ( &:any_version_installed? )
694+ return if installed_overwrite_formulae . empty?
695+
696+ reason_formulae = installed_overwrite_formulae . select ( &:linked? )
697+ status = if reason_formulae . empty?
698+ reason_formulae = installed_overwrite_formulae
699+ "installed"
700+ else
701+ "linked"
702+ end
703+
704+ "#{ reason_formulae . map ( &:full_name ) . to_sentence } #{ reason_formulae . one? ? "is" : "are" } already #{ status } "
705+ end
706+
707+ sig { returns ( T ::Array [ String ] ) }
708+ def link_overwrite_related_formula_names
709+ [ *versioned_formulae_names , *full_formulae_names , unversioned_formula_name ] . compact
710+ end
711+
712+ # Returns sibling Formula names whose prefix links should be replaced when this Formula is linked.
713+ sig { returns ( T ::Array [ String ] ) }
714+ def link_overwrite_formulae_names
715+ formula_names = T . let ( Set . new , T ::Set [ String ] )
716+ pending_formula_names = T . let ( [ name ] , T ::Array [ String ] )
717+
718+ pending_formula_names . each do |current_name |
719+ current_formula = begin
720+ if current_name == name
721+ self
722+ else
723+ Formula [ current_name ]
724+ end
725+ rescue FormulaUnavailableError
726+ next
727+ end
728+
729+ current_formula . link_overwrite_related_formula_names . each do |related_formula_name |
730+ next if related_formula_name == name
731+ next unless formula_names . add? ( related_formula_name )
732+
733+ pending_formula_names << related_formula_name
734+ end
735+ end
736+
737+ formula_names . to_a . sort
738+ end
739+
740+ # Returns sibling Formulae whose prefix links should be replaced when this Formula is linked.
741+ sig { returns ( T ::Array [ Formula ] ) }
742+ def link_overwrite_formulae
743+ link_overwrite_formulae_names . filter_map do |formula_name |
744+ Formula [ formula_name ]
745+ rescue FormulaUnavailableError
746+ nil
747+ end
748+ end
749+
655750 # Whether this {Formula} is version-synced with other formulae.
656751 sig { returns ( T ::Boolean ) }
657752 def synced_with_other_formulae?
0 commit comments