Class: Formulary::FromNameLoader Private

Inherits:
FromTapLoader show all
Extended by:
Utils::Output::Mixin
Defined in:
formulary.rb

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

Loads a formula from a name, as long as it exists only in a single tap.

Instance Attribute Summary

Attributes inherited from FromTapLoader

#path, #tap

Attributes inherited from FormulaLoader

#alias_path, #name, #path, #tap

Class Method Summary collapse

Methods included from Utils::Output::Mixin

issue_reporting_message, odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_outside_github_actions, pretty_deprecated, pretty_disabled, pretty_duration, pretty_install_status, pretty_installed, pretty_outdated, pretty_uninstalled, pretty_upgradable

Methods inherited from FromTapLoader

#get_formula, #initialize, #load_file, loader_from_name_tap_type

Methods inherited from FormulaLoader

#get_formula, #initialize, #klass

Methods included from Context

current, current=, #debug?, #quiet?, #verbose?, #with_context

Constructor Details

This class inherits a constructor from Formulary::FromTapLoader

Class Method Details

.try_new(ref, from: nil, warn: false) ⇒ T.attached_class?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • ref (String, Pathname, URI::Generic)
  • from (Symbol, nil) (defaults to: nil)
  • warn (Boolean) (defaults to: false)

Returns:

  • (T.attached_class, nil)


748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
# File 'formulary.rb', line 748

def self.try_new(ref, from: nil, warn: false)
  return unless ref.is_a?(String)
  return unless ref.match?(/\A#{HOMEBREW_TAP_FORMULA_NAME_REGEX}\Z/o)

  name = ref.downcase

  # If it exists in the default tap, never treat it as ambiguous with another tap.
  if (core_tap = CoreTap.instance).installed? && (name_tap_type = Formulary.tap_formula_name_type(
    "#{core_tap}/#{name}", warn: false
  ))
    migrated_name, migrated_tap, type = name_tap_type

    if warn && [:rename, :migration].include?(type) &&
       !(type == :migration && migrated_tap.core_cask_tap?)
      opoo "Formula #{name} was renamed to " \
           "#{migrated_tap.core_tap? ? migrated_name : "#{migrated_tap}/#{migrated_name}"}."
    end

    if (core_loader = loader_from_name_tap_type("#{core_tap}/#{name}", name_tap_type))&.path&.exist?
      return core_loader
    end
  end

  loaders = Tap.select { |tap| tap.installed? && !tap.core_tap? }
               .filter_map { |tap| super("#{tap}/#{name}", warn:) }
               .uniq(&:path)
               .select { |loader| loader.is_a?(FromAPILoader) || loader.path.exist? }

  case loaders.count
  when 1
    loaders.first
  when 2..Float::INFINITY
    raise TapFormulaAmbiguityError.new(name, loaders)
  end
end