Port Homebrew::DevCmd::Bump

This commit is contained in:
Douglas Eichelberger 2024-03-18 16:59:34 -07:00
parent c70dc040c6
commit df42e9cfb3
2 changed files with 500 additions and 500 deletions

View File

@ -1,13 +1,14 @@
# typed: strict
# frozen_string_literal: true
require "abstract_command"
require "bump_version_parser"
require "cli/parser"
require "livecheck/livecheck"
module Homebrew
module_function
module DevCmd
class Bump < AbstractCommand
class VersionBumpInfo < T::Struct
const :type, Symbol
const :multiple_versions, T::Boolean
@ -19,9 +20,7 @@ module Homebrew
const :closed_pull_requests, T.nilable(T.any(T::Array[String], String))
end
sig { returns(CLI::Parser) }
def bump_args
CLI::Parser.new do
cmd_args do
description <<~EOS
Display out-of-date brew formulae and the latest version available. If the
returned current and livecheck versions differ or when querying specific
@ -56,12 +55,9 @@ module Homebrew
named_args [:formula, :cask], without_api: true
end
end
sig { void }
def bump
args = bump_args.parse
sig { override.void }
def run
Homebrew.install_bundler_gems!(groups: ["livecheck"])
if args.limit.present? && !args.formula? && !args.cask?
@ -72,7 +68,7 @@ module Homebrew
Homebrew.with_no_api_env do
formulae_and_casks = if args.tap
tap = Tap.fetch(args.tap)
tap = Tap.fetch(T.must(args.tap))
raise UsageError, "`--tap` cannot be used with official taps." if tap.official?
formulae = args.cask? ? [] : tap.formula_files.map { |path| Formulary.factory(path) }
@ -105,21 +101,23 @@ module Homebrew
end
if formulae_and_casks.present?
handle_formula_and_casks(formulae_and_casks, args)
handle_formula_and_casks(formulae_and_casks)
else
handle_api_response(args)
handle_api_response
end
end
end
sig { params(formula_or_cask: T.any(Formula, Cask::Cask), args: CLI::Args).returns(T::Boolean) }
def skip_repology?(formula_or_cask, args:)
private
sig { params(formula_or_cask: T.any(Formula, Cask::Cask)).returns(T::Boolean) }
def skip_repology?(formula_or_cask)
(ENV["CI"].present? && args.open_pr? && formula_or_cask.livecheckable?) ||
(formula_or_cask.is_a?(Formula) && formula_or_cask.versioned_formula?)
end
sig { params(formulae_and_casks: T::Array[T.any(Formula, Cask::Cask)], args: CLI::Args).void }
def handle_formula_and_casks(formulae_and_casks, args)
sig { params(formulae_and_casks: T::Array[T.any(Formula, Cask::Cask)]).void }
def handle_formula_and_casks(formulae_and_casks)
Livecheck.load_other_tap_strategies(formulae_and_casks)
ambiguous_casks = []
@ -153,20 +151,19 @@ module Homebrew
Repology::HOMEBREW_CASK
end
package_data = Repology.single_package_query(name, repository:) unless skip_repology?(formula_or_cask, args:)
package_data = Repology.single_package_query(name, repository:) unless skip_repology?(formula_or_cask)
retrieve_and_display_info_and_open_pr(
formula_or_cask,
name,
package_data&.values&.first,
args:,
ambiguous_cask: ambiguous_casks.include?(formula_or_cask),
)
end
end
sig { params(args: CLI::Args).void }
def handle_api_response(args)
sig { void }
def handle_api_response
limit = args.limit.to_i if args.limit.present?
api_response = {}
@ -220,7 +217,6 @@ module Homebrew
formula_or_cask,
name,
repositories,
args:,
ambiguous_cask:,
)
end
@ -321,13 +317,16 @@ module Homebrew
params(
formula_or_cask: T.any(Formula, Cask::Cask),
repositories: T::Array[T.untyped],
args: CLI::Args,
name: String,
).returns(VersionBumpInfo)
}
def retrieve_versions_by_arch(formula_or_cask:, repositories:, args:, name:)
def retrieve_versions_by_arch(formula_or_cask:, repositories:, name:)
is_cask_with_blocks = formula_or_cask.is_a?(Cask::Cask) && formula_or_cask.on_system_blocks_exist?
type, version_name = formula_or_cask.is_a?(Formula) ? [:formula, "formula version:"] : [:cask, "cask version: "]
type, version_name = if formula_or_cask.is_a?(Formula)
[:formula, "formula version:"]
else
[:cask, "cask version: "]
end
old_versions = {}
new_versions = {}
@ -429,14 +428,12 @@ module Homebrew
formula_or_cask: T.any(Formula, Cask::Cask),
name: String,
repositories: T::Array[T.untyped],
args: CLI::Args,
ambiguous_cask: T::Boolean,
).void
}
def retrieve_and_display_info_and_open_pr(formula_or_cask, name, repositories, args:, ambiguous_cask: false)
def retrieve_and_display_info_and_open_pr(formula_or_cask, name, repositories, ambiguous_cask: false)
version_info = retrieve_versions_by_arch(formula_or_cask:,
repositories:,
args:,
name:)
current_version = version_info.current_version
@ -480,7 +477,7 @@ module Homebrew
Current #{version_label} #{current_versions}
Latest livecheck version: #{new_versions}
EOS
puts <<~EOS unless skip_repology?(formula_or_cask, args:)
puts <<~EOS unless skip_repology?(formula_or_cask)
Latest Repology version: #{repology_latest}
EOS
if formula_or_cask.is_a?(Formula) && formula_or_cask.synced_with_other_formulae?
@ -551,4 +548,6 @@ module Homebrew
synced_with
end
end
end
end

View File

@ -1,8 +1,9 @@
# frozen_string_literal: true
require "cmd/shared_examples/args_parse"
require "dev-cmd/bump"
RSpec.describe "brew bump" do
RSpec.describe Homebrew::DevCmd::Bump do
it_behaves_like "parseable arguments"
describe "formula", :integration_test, :needs_homebrew_curl, :needs_network do