Skip to content

Commit cbd4d8b

Browse files
committed
Load installed formulae from kegs
1 parent 8caf1a8 commit cbd4d8b

File tree

1 file changed

+33
-4
lines changed

1 file changed

+33
-4
lines changed

Library/Homebrew/formulary.rb

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)