@@ -738,6 +738,15 @@ def self.try_new(ref, from: nil, warn: false)
738738 return unless path . expand_path . exist?
739739 return unless ::Utils ::Path . loadable_package_path? ( path , :formula )
740740
741+ # If the path is for an installed keg, use FromKegLoader instead
742+ begin
743+ keg = Keg . for ( path )
744+ loader = FromKegLoader . try_new ( keg . name , from :, warn :)
745+ return T . cast ( loader , T . attached_class )
746+ rescue NotAKegError
747+ # Not a keg path, continue
748+ end
749+
741750 if ( tap = Tap . from_path ( path ) )
742751 # Only treat symlinks in taps as aliases.
743752 if path . symlink?
@@ -936,9 +945,15 @@ class FromKegLoader < FormulaLoader
936945 def self . try_new ( ref , from : nil , warn : false )
937946 ref = ref . to_s
938947
939- return unless ( keg_formula = HOMEBREW_PREFIX /"opt/#{ ref } /.brew/#{ ref } .rb" ) . file?
948+ keg_directory = HOMEBREW_PREFIX /"opt/#{ ref } "
949+ return unless keg_directory . directory?
940950
941- new ( ref , keg_formula )
951+ # The formula file in `.brew` will use the canonical name, whereas `ref` can be an alias.
952+ # Use `Keg#name` to get the canonical name.
953+ keg = Keg . new ( keg_directory )
954+ return unless ( keg_formula = HOMEBREW_PREFIX /"opt/#{ ref } /.brew/#{ keg . name } .rb" ) . file?
955+
956+ new ( keg . name , keg_formula , tap : keg . tab . tap )
942957 end
943958 end
944959
@@ -1054,7 +1069,12 @@ def klass(flags:, ignore_errors:)
10541069
10551070 sig { overridable . params ( flags : T ::Array [ String ] ) . void }
10561071 def load_from_api ( flags :)
1057- json_formula = Homebrew ::API ::Formula . all_formulae [ name ]
1072+ json_formula = if Homebrew ::EnvConfig . use_internal_api?
1073+ Homebrew ::API ::Formula . formula_json ( name )
1074+ else
1075+ Homebrew ::API ::Formula . all_formulae [ name ]
1076+ end
1077+
10581078 raise FormulaUnavailableError , name if json_formula . nil?
10591079
10601080 Formulary . load_formula_from_json! ( name , json_formula , flags :)
@@ -1223,7 +1243,16 @@ def self.from_keg(
12231243 flags :,
12241244 } . compact
12251245
1226- f = if tap . nil?
1246+ loader = FromKegLoader . try_new ( keg . name , warn : false )
1247+ f = if loader . present?
1248+ begin
1249+ loader . get_formula ( spec , alias_path :, force_bottle :, flags :, ignore_errors : true )
1250+ rescue FormulaUnreadableError
1251+ nil
1252+ end
1253+ end
1254+
1255+ f ||= if tap . nil?
12271256 factory ( formula_name , spec , **options )
12281257 else
12291258 begin
0 commit comments