Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

completions formula_pin: typed: strict, cxxstdlib: typed: strong #18430

Merged
merged 3 commits into from
Sep 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions Library/Homebrew/completions.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# typed: strict
# frozen_string_literal: true

require "utils/link"
Expand All @@ -16,8 +16,8 @@ module Completions
keyword_init: true,
)

COMPLETIONS_DIR = (HOMEBREW_REPOSITORY/"completions").freeze
TEMPLATE_DIR = (HOMEBREW_LIBRARY_PATH/"completions").freeze
COMPLETIONS_DIR = T.let((HOMEBREW_REPOSITORY/"completions").freeze, Pathname)
TEMPLATE_DIR = T.let((HOMEBREW_LIBRARY_PATH/"completions").freeze, Pathname)

SHELLS = %w[bash fish zsh].freeze
COMPLETIONS_EXCLUSION_LIST = %w[
Expand All @@ -26,7 +26,7 @@ module Completions
update-report
].freeze

BASH_NAMED_ARGS_COMPLETION_FUNCTION_MAPPING = {
BASH_NAMED_ARGS_COMPLETION_FUNCTION_MAPPING = T.let({
formula: "__brew_complete_formulae",
installed_formula: "__brew_complete_installed_formulae",
outdated_formula: "__brew_complete_outdated_formulae",
Expand All @@ -38,9 +38,9 @@ module Completions
command: "__brew_complete_commands",
diagnostic_check: '__brewcomp "${__HOMEBREW_DOCTOR_CHECKS=$(brew doctor --list-checks)}"',
file: "__brew_complete_files",
}.freeze
}.freeze, T::Hash[Symbol, String])

ZSH_NAMED_ARGS_COMPLETION_FUNCTION_MAPPING = {
ZSH_NAMED_ARGS_COMPLETION_FUNCTION_MAPPING = T.let({
formula: "__brew_formulae",
installed_formula: "__brew_installed_formulae",
outdated_formula: "__brew_outdated_formulae",
Expand All @@ -52,9 +52,9 @@ module Completions
command: "__brew_commands",
diagnostic_check: "__brew_diagnostic_checks",
file: "__brew_formulae_or_ruby_files",
}.freeze
}.freeze, T::Hash[Symbol, String])

FISH_NAMED_ARGS_COMPLETION_FUNCTION_MAPPING = {
FISH_NAMED_ARGS_COMPLETION_FUNCTION_MAPPING = T.let({
formula: "__fish_brew_suggest_formulae_all",
installed_formula: "__fish_brew_suggest_formulae_installed",
outdated_formula: "__fish_brew_suggest_formulae_outdated",
Expand All @@ -65,7 +65,7 @@ module Completions
installed_tap: "__fish_brew_suggest_taps_installed",
command: "__fish_brew_suggest_commands",
diagnostic_check: "__fish_brew_suggest_diagnostic_checks",
}.freeze
}.freeze, T::Hash[Symbol, String])

sig { void }
def self.link!
Expand Down Expand Up @@ -264,6 +264,7 @@ def self.generate_zsh_subcommand_completion(command)
COMPLETION
end

sig { params(command: String, option: String).returns(String) }
def self.generate_zsh_option_exclusions(command, option)
conflicts = Commands.option_conflicts(command, option.gsub(/^--/, ""))
return "" unless conflicts.presence
Expand Down
13 changes: 10 additions & 3 deletions Library/Homebrew/cxxstdlib.rb
Original file line number Diff line number Diff line change
@@ -1,23 +1,30 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# typed: strong
MikeMcQuaid marked this conversation as resolved.
Show resolved Hide resolved
# frozen_string_literal: true

require "compilers"

# Combination of C++ standard library and compiler.
class CxxStdlib
sig { params(type: T.nilable(Symbol), compiler: T.any(Symbol, String)).returns(CxxStdlib) }
cho-m marked this conversation as resolved.
Show resolved Hide resolved
def self.create(type, compiler)
raise ArgumentError, "Invalid C++ stdlib type: #{type}" if type && [:libstdcxx, :libcxx].exclude?(type)

CxxStdlib.new(type, compiler)
end

attr_reader :type, :compiler
sig { returns(T.nilable(Symbol)) }
attr_reader :type

sig { returns(Symbol) }
attr_reader :compiler

sig { params(type: T.nilable(Symbol), compiler: T.any(Symbol, String)).void }
def initialize(type, compiler)
@type = type
@compiler = compiler.to_sym
@compiler = T.let(compiler.to_sym, Symbol)
end

sig { returns(String) }
def type_string
type.to_s.gsub(/cxx$/, "c++")
end
Expand Down
12 changes: 10 additions & 2 deletions Library/Homebrew/formula_pin.rb
Original file line number Diff line number Diff line change
@@ -1,44 +1,52 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# typed: strict
# frozen_string_literal: true

require "keg"

# Helper functions for pinning a formula.
class FormulaPin
sig { params(formula: Formula).void }
def initialize(formula)
@formula = formula
end

sig { returns(Pathname) }
def path
HOMEBREW_PINNED_KEGS/@formula.name
end

sig { params(version: PkgVersion).void }
def pin_at(version)
HOMEBREW_PINNED_KEGS.mkpath
version_path = @formula.rack/version
version_path = @formula.rack/version.to_s
path.make_relative_symlink(version_path) if !pinned? && version_path.exist?
end

sig { void }
def pin
latest_keg = @formula.installed_kegs.max_by(&:scheme_and_version)
return if latest_keg.nil?

pin_at(latest_keg.version)
end

sig { void }
def unpin
path.unlink if pinned?
HOMEBREW_PINNED_KEGS.rmdir_if_possible
end

sig { returns(T::Boolean) }
def pinned?
path.symlink?
end

sig { returns(T::Boolean) }
def pinnable?
!@formula.installed_prefixes.empty?
end

sig { returns(T.nilable(PkgVersion)) }
def pinned_version
Keg.new(path.resolved_path).version if pinned?
end
Expand Down