mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

Co-authored-by: Sam Ford <1584702+samford@users.noreply.github.com> Co-authored-by: Thierry Moisan <thierry.moisan@gmail.com> Co-authored-by: Dawid Dziurla <dawidd0811@gmail.com> Co-authored-by: Maxim Belkin <maxim.belkin@gmail.com> Co-authored-by: Issy Long <me@issyl0.co.uk> Co-authored-by: Mike McQuaid <mike@mikemcquaid.com> Co-authored-by: Seeker <meaningseeking@protonmail.com>
87 lines
3.2 KiB
Ruby
87 lines
3.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Homebrew
|
|
module Livecheck
|
|
# The `Livecheck::Strategy` module contains the various strategies as well
|
|
# as some general-purpose methods for working with them. Within the context
|
|
# of the `brew livecheck` command, strategies are established procedures
|
|
# for finding new software versions at a given source.
|
|
#
|
|
# @api private
|
|
module Strategy
|
|
module_function
|
|
|
|
# Strategy priorities informally range from 1 to 10, where 10 is the
|
|
# highest priority. 5 is the default priority because it's roughly in
|
|
# the middle of this range. Strategies with a priority of 0 (or lower)
|
|
# are ignored.
|
|
DEFAULT_PRIORITY = 5
|
|
private_constant :DEFAULT_PRIORITY
|
|
|
|
# Creates and/or returns a `@strategies` `Hash` ,which maps a snake
|
|
# case strategy name symbol (e.g., `:page_match`) to the associated
|
|
# `Strategy`.
|
|
#
|
|
# At present, this should only be called after tap strategies have been
|
|
# loaded, otherwise livecheck won't be able to use them.
|
|
# @return [Hash]
|
|
def strategies
|
|
return @strategies if defined? @strategies
|
|
|
|
@strategies = {}
|
|
constants.sort.each do |strategy_symbol|
|
|
key = strategy_symbol.to_s.underscore.to_sym
|
|
strategy = const_get(strategy_symbol)
|
|
@strategies[key] = strategy
|
|
end
|
|
@strategies
|
|
end
|
|
private_class_method :strategies
|
|
|
|
# Returns the `Strategy` that corresponds to the provided `Symbol` (or
|
|
# `nil` if there is no matching `Strategy`).
|
|
# @param symbol [Symbol] the strategy name in snake case as a `Symbol`
|
|
# (e.g., `:page_match`)
|
|
# @return [Strategy, nil]
|
|
def from_symbol(symbol)
|
|
strategies[symbol]
|
|
end
|
|
|
|
# Returns an array of strategies that apply to the provided URL.
|
|
# @param url [String] the URL to check for matching strategies
|
|
# @param regex_provided [Boolean] whether a regex is provided in a
|
|
# `livecheck` block
|
|
# @return [Array]
|
|
def from_url(url, regex_provided = nil)
|
|
usable_strategies = strategies.values.select do |strategy|
|
|
# Ignore strategies with a priority of 0 or lower
|
|
next if strategy.const_defined?(:PRIORITY) && !strategy::PRIORITY.positive?
|
|
|
|
strategy.respond_to?(:match?) && strategy.match?(url)
|
|
end
|
|
|
|
usable_strategies << strategies[:page_match] if strategies.key?(:page_match) && regex_provided
|
|
|
|
# Sort usable strategies in descending order by priority, using the
|
|
# DEFAULT_PRIORITY when a strategy doesn't contain a PRIORITY constant
|
|
usable_strategies.sort_by do |strategy|
|
|
(strategy.const_defined?(:PRIORITY) ? -strategy::PRIORITY : -DEFAULT_PRIORITY)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
require_relative "strategy/apache"
|
|
require_relative "strategy/bitbucket"
|
|
require_relative "strategy/git"
|
|
require_relative "strategy/gnome"
|
|
require_relative "strategy/gnu"
|
|
require_relative "strategy/hackage"
|
|
require_relative "strategy/launchpad"
|
|
require_relative "strategy/npm"
|
|
require_relative "strategy/page_match"
|
|
require_relative "strategy/pypi"
|
|
require_relative "strategy/sourceforge"
|
|
require_relative "strategy/xorg"
|