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, opoo_without_github_actions_annotation, 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)


779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
# File 'formulary.rb', line 779

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