diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 725bc3c373..e28c5eb3df 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -5,68 +5,86 @@ updates:
directory: /
schedule:
interval: weekly
+ day: "friday"
+ time: "08:00"
+ timezone: "Etc/UTC"
allow:
- dependency-type: all
- # The actions in triage-issues.yml are updated in the Homebrew/.github repo
- ignore:
- - dependency-name: actions/stale
groups:
- artifacts:
+ github-actions:
patterns:
- - actions/*-artifact
- open-pull-requests-limit: 10
+ - "*"
- package-ecosystem: bundler
- directory: /Library/Homebrew
+ directories:
+ - /
+ - /Library/Homebrew
schedule:
- interval: daily
+ interval: weekly
+ day: "friday"
+ time: "08:00"
+ timezone: "Etc/UTC"
allow:
- dependency-type: all
groups:
- rspec:
+ bundler:
patterns:
- - "rspec*"
- sorbet:
- patterns:
- - "sorbet*"
- open-pull-requests-limit: 10
+ - "*"
- package-ecosystem: npm
directory: /
schedule:
- interval: daily
+ interval: weekly
+ day: "friday"
+ time: "08:00"
+ timezone: "Etc/UTC"
allow:
- dependency-type: all
- open-pull-requests-limit: 10
+ groups:
+ npm:
+ patterns:
+ - "*"
- package-ecosystem: docker
directory: /
schedule:
- interval: daily
+ interval: weekly
+ day: "friday"
+ time: "08:00"
+ timezone: "Etc/UTC"
allow:
- dependency-type: all
- open-pull-requests-limit: 10
+ groups:
+ docker:
+ patterns:
+ - "*"
- package-ecosystem: devcontainers
directory: /
schedule:
- interval: daily
+ interval: weekly
+ day: "friday"
+ time: "08:00"
+ timezone: "Etc/UTC"
allow:
- dependency-type: all
- open-pull-requests-limit: 10
+ groups:
+ devcontainers:
+ patterns:
+ - "*"
- package-ecosystem: pip
- directory: /
+ directories:
+ - /
+ - /Library/Homebrew/formula-analytics/
schedule:
- interval: daily
+ interval: weekly
+ day: "friday"
+ time: "08:00"
+ timezone: "Etc/UTC"
allow:
- dependency-type: all
- open-pull-requests-limit: 10
-
- - package-ecosystem: pip
- directory: /Library/Homebrew/formula-analytics/
- schedule:
- interval: daily
- allow:
- - dependency-type: all
- open-pull-requests-limit: 10
+ groups:
+ pip:
+ patterns:
+ - "*"
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 3c12115161..5d88cf7e65 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -52,7 +52,7 @@ jobs:
run: vale docs/
- name: Install Ruby
- uses: ruby/setup-ruby@1a0ff446f5856bdfec298b61a09727c860d9d480 # v1.240.0
+ uses: ruby/setup-ruby@13e7a03dc3ac6c3798f4570bfead2aed4d96abfb # v1.244.0
with:
bundler-cache: true
working-directory: docs
diff --git a/.github/workflows/pkg-installer.yml b/.github/workflows/pkg-installer.yml
index 2b23ea501a..adb7f99c4c 100644
--- a/.github/workflows/pkg-installer.yml
+++ b/.github/workflows/pkg-installer.yml
@@ -230,17 +230,15 @@ jobs:
--password "${PKG_APPLE_ID_APP_SPECIFIC_PASSWORD}"
--wait
- - name: Install gh
- run: brew install gh
-
- name: Upload installer to GitHub release
if: github.event_name == 'release'
env:
GH_TOKEN: ${{ github.token }}
INSTALLER_PATH: ${{ needs.build.outputs.installer_path }}
- run: gh release upload --repo Homebrew/brew
- "${GITHUB_REF//refs\/tags\//}"
- "${INSTALLER_PATH}"
+ run: |
+ VERSION="${INSTALLER_PATH#Homebrew-}"
+ VERSION="${VERSION%.pkg}"
+ gh release upload --repo Homebrew/brew "${VERSION}" "${INSTALLER_PATH}"
issue:
needs: [build, test, upload]
diff --git a/.github/workflows/rubydoc.yml b/.github/workflows/rubydoc.yml
index 7c7cffe3a3..2c0399ed56 100644
--- a/.github/workflows/rubydoc.yml
+++ b/.github/workflows/rubydoc.yml
@@ -42,7 +42,7 @@ jobs:
persist-credentials: false
- name: Install Ruby
- uses: ruby/setup-ruby@1a0ff446f5856bdfec298b61a09727c860d9d480 # v1.240.0
+ uses: ruby/setup-ruby@13e7a03dc3ac6c3798f4570bfead2aed4d96abfb # v1.244.0
with:
bundler-cache: true
working-directory: rubydoc
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 1a0275205a..5742f294cb 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -335,7 +335,7 @@ jobs:
filenames=$(find Library/Homebrew/test/junit -name 'rspec*.xml' -print | tr '\n' ',')
echo "filenames=${filenames%,}" >> "$GITHUB_OUTPUT"
- - uses: codecov/test-results-action@f2dba722c67b86c6caa034178c6e4d35335f6706 # v1.1.0
+ - uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1
with:
working-directory: ${{ steps.set-up-homebrew.outputs.repository-path }}
files: ${{ steps.junit_xml.outputs.filenames }}
diff --git a/.gitignore b/.gitignore
index bb824a889e..ca100463a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -164,6 +164,7 @@
!/completions
!/docs
!/manpages
+!/CODEOWNERS
# Unignore our packaging files
!/package
@@ -172,6 +173,7 @@
# Ignore generated documentation site
/docs/_site
/docs/.jekyll-metadata
+/docs/tmp/.htmlproofer
/docs/vendor
/docs/Gemfile.lock
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 0000000000..b76c645caf
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,11 @@
+# Note that the naming of this file is incorrect for our case: these people do not "own" the provided files but are
+# people with write-access to this repository who wish to approve changes to these files.
+#
+# Their review is required to merge PRs that change these files.
+#
+# To be explicit: we will never accept changes to this file adding people from outside the Homebrew GitHub
+# organisation. If you are not a Homebrew maintainer: you do not personally "own" or "maintain" any files.
+#
+# Note: @Homebrew/plc does not have write-access to this repository, and therefore cannot be listed in this file.
+
+docs/Support-Tiers.md @Homebrew/tsc @MikeMcQuaid
diff --git a/Library/.rubocop.yml b/Library/.rubocop.yml
index a5362c95d6..a206ed6e33 100644
--- a/Library/.rubocop.yml
+++ b/Library/.rubocop.yml
@@ -26,7 +26,7 @@ AllCops:
Include:
- "**/*.rbi"
Exclude:
- - "Homebrew/sorbet/rbi/{dsl,gems}/**/*.rbi"
+ - "Homebrew/sorbet/rbi/{annotations,dsl,gems}/**/*.rbi"
- "Homebrew/sorbet/rbi/parser*.rbi"
- "Homebrew/bin/*"
- "Homebrew/vendor/**/*"
diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock
index 82db95d091..8053d3bb79 100644
--- a/Library/Homebrew/Gemfile.lock
+++ b/Library/Homebrew/Gemfile.lock
@@ -104,7 +104,7 @@ GEM
rubocop (~> 1.72, >= 1.72.1)
rubocop-sorbet (0.10.0)
rubocop (>= 1)
- ruby-lsp (0.23.20)
+ ruby-lsp (0.23.21)
language_server-protocol (~> 3.17.0)
prism (>= 1.2, < 2.0)
rbs (>= 3, < 4)
@@ -122,15 +122,15 @@ GEM
simplecov-html (0.13.1)
simplecov_json_formatter (0.1.4)
simpleidn (0.2.3)
- sorbet (0.5.12109)
- sorbet-static (= 0.5.12109)
- sorbet-runtime (0.5.12109)
- sorbet-static (0.5.12109-aarch64-linux)
- sorbet-static (0.5.12109-universal-darwin)
- sorbet-static (0.5.12109-x86_64-linux)
- sorbet-static-and-runtime (0.5.12109)
- sorbet (= 0.5.12109)
- sorbet-runtime (= 0.5.12109)
+ sorbet (0.5.12117)
+ sorbet-static (= 0.5.12117)
+ sorbet-runtime (0.5.12117)
+ sorbet-static (0.5.12117-aarch64-linux)
+ sorbet-static (0.5.12117-universal-darwin)
+ sorbet-static (0.5.12117-x86_64-linux)
+ sorbet-static-and-runtime (0.5.12117)
+ sorbet (= 0.5.12117)
+ sorbet-runtime (= 0.5.12117)
spoom (1.6.3)
erubi (>= 1.10.0)
prism (>= 0.28.0)
diff --git a/Library/Homebrew/autobump_constants.rb b/Library/Homebrew/autobump_constants.rb
index 15f6ed8ea5..6dfab8de22 100644
--- a/Library/Homebrew/autobump_constants.rb
+++ b/Library/Homebrew/autobump_constants.rb
@@ -5,4 +5,7 @@
NO_AUTOBUMP_REASONS_LIST = T.let({
incompatible_version_format: "incompatible version format",
bumped_by_upstream: "bumped by upstream",
+ extract_plist: "livecheck uses `:extract_plist` strategy",
+ latest_version: "`version` is set to `:latest`",
+ requires_manual_review: "a manual review of this package is required for inclusion in autobump",
}.freeze, T::Hash[Symbol, String])
diff --git a/Library/Homebrew/bundle/commands/cleanup.rb b/Library/Homebrew/bundle/commands/cleanup.rb
index a42f07d980..7a6da0c6c3 100644
--- a/Library/Homebrew/bundle/commands/cleanup.rb
+++ b/Library/Homebrew/bundle/commands/cleanup.rb
@@ -25,13 +25,14 @@ module Homebrew
Homebrew::Bundle::BrewServices.reset!
end
- def self.run(global: false, file: nil, force: false, zap: false, dsl: nil)
+ def self.run(global: false, file: nil, force: false, zap: false, dsl: nil,
+ brews: true, casks: true, taps: true, vscode: true)
@dsl ||= dsl
- casks = casks_to_uninstall(global:, file:)
- formulae = formulae_to_uninstall(global:, file:)
- taps = taps_to_untap(global:, file:)
- vscode_extensions = vscode_extensions_to_uninstall(global:, file:)
+ casks = casks ? casks_to_uninstall(global:, file:) : []
+ formulae = brews ? formulae_to_uninstall(global:, file:) : []
+ taps = taps ? taps_to_untap(global:, file:) : []
+ vscode_extensions = vscode ? vscode_extensions_to_uninstall(global:, file:) : []
if force
if casks.any?
args = zap ? ["--zap"] : []
diff --git a/Library/Homebrew/bundle/commands/exec.rb b/Library/Homebrew/bundle/commands/exec.rb
index 543d84114b..103706dd76 100644
--- a/Library/Homebrew/bundle/commands/exec.rb
+++ b/Library/Homebrew/bundle/commands/exec.rb
@@ -178,7 +178,9 @@ module Homebrew
exit_code = 0
run_services(@dsl.entries) do
Kernel.system(*args)
- exit_code = $CHILD_STATUS.exitstatus
+ if (system_exit_code = $CHILD_STATUS&.exitstatus)
+ exit_code = system_exit_code
+ end
end
exit!(exit_code)
else
diff --git a/Library/Homebrew/cask/audit.rb b/Library/Homebrew/cask/audit.rb
index 0dbd453b93..4f8bae5c14 100644
--- a/Library/Homebrew/cask/audit.rb
+++ b/Library/Homebrew/cask/audit.rb
@@ -606,7 +606,10 @@ module Cask
def audit_rosetta
return if (url = cask.url).nil?
return unless online?
+ # Rosetta 2 is only for ARM-capable macOS versions, which are Big Sur (11.x) and later
return if Homebrew::SimulateSystem.current_arch != :arm
+ return if MacOSVersion::SYMBOLS.fetch(Homebrew::SimulateSystem.current_os, "10") < "11"
+ return if cask.depends_on.macos&.maximum_version.to_s < "11"
odebug "Auditing Rosetta 2 requirement"
@@ -640,7 +643,7 @@ module Cask
# binary stanza can contain shell scripts, so we just continue if lipo fails.
next unless result.success?
- odebug result.merged_output
+ odebug "Architectures: #{result.merged_output}"
unless /arm64|x86_64/.match?(result.merged_output)
add_error "Artifacts architecture is no longer supported by macOS!",
@@ -652,7 +655,7 @@ module Cask
mentions_rosetta = cask.caveats.include?("requires Rosetta 2")
if supports_arm && mentions_rosetta
- add_error "Artifacts does not require Rosetta 2 but the caveats say otherwise!",
+ add_error "Artifacts do not require Rosetta 2 but the caveats say otherwise!",
location: url.location
elsif !supports_arm && !mentions_rosetta
add_error "Artifacts require Rosetta 2 but this is not indicated by the caveats!",
diff --git a/Library/Homebrew/cask/dsl.rb b/Library/Homebrew/cask/dsl.rb
index 5363e58237..ca35eebe39 100644
--- a/Library/Homebrew/cask/dsl.rb
+++ b/Library/Homebrew/cask/dsl.rb
@@ -351,6 +351,8 @@ module Cask
raise CaskInvalidError.new(cask, "invalid 'version' value: #{arg.inspect}")
end
+ no_autobump! because: :latest_version if arg == :latest
+
DSL::Version.new(arg)
end
end
@@ -536,6 +538,8 @@ module Cask
@livecheck_defined = true
@livecheck.instance_eval(&block)
+ no_autobump! because: :extract_plist if @livecheck.strategy == :extract_plist
+ @livecheck
end
# Whether the cask contains a `livecheck` block. This is a legacy alias
diff --git a/Library/Homebrew/cmd/bundle.rb b/Library/Homebrew/cmd/bundle.rb
index 84e6b3ab23..4dfb7a60f0 100755
--- a/Library/Homebrew/cmd/bundle.rb
+++ b/Library/Homebrew/cmd/bundle.rb
@@ -102,17 +102,17 @@ module Homebrew
switch "--all",
description: "`list` all dependencies."
switch "--formula", "--brews",
- description: "`list` or `dump` Homebrew formula dependencies."
+ description: "`list`, `dump` or `cleanup` Homebrew formula dependencies."
switch "--cask", "--casks",
- description: "`list` or `dump` Homebrew cask dependencies."
+ description: "`list`, `dump` or `cleanup` Homebrew cask dependencies."
switch "--tap", "--taps",
- description: "`list` or `dump` Homebrew tap dependencies."
+ description: "`list`, `dump` or `cleanup` Homebrew tap dependencies."
switch "--mas",
description: "`list` or `dump` Mac App Store dependencies."
switch "--whalebrew",
description: "`list` or `dump` Whalebrew dependencies."
switch "--vscode",
- description: "`list` or `dump` VSCode (and forks/variants) extensions."
+ description: "`list`, `dump` or `cleanup` VSCode (and forks/variants) extensions."
switch "--no-vscode",
env: :bundle_dump_no_vscode,
description: "`dump` without VSCode (and forks/variants) extensions. " \
@@ -226,7 +226,13 @@ module Homebrew
exec_editor(Homebrew::Bundle::Brewfile.path(global:, file:))
when "cleanup"
require "bundle/commands/cleanup"
- Homebrew::Bundle::Commands::Cleanup.run(global:, file:, force:, zap:)
+ Homebrew::Bundle::Commands::Cleanup.run(
+ global:, file:, force:, zap:,
+ brews: args.brews? || no_type_args,
+ casks: args.casks? || no_type_args,
+ taps: args.taps? || no_type_args,
+ vscode: args.vscode? || no_type_args
+ )
when "check"
require "bundle/commands/check"
Homebrew::Bundle::Commands::Check.run(global:, file:, no_upgrade:, verbose:)
diff --git a/Library/Homebrew/dev-cmd/bump-cask-pr.rb b/Library/Homebrew/dev-cmd/bump-cask-pr.rb
index bcf3cb866a..72e20c132e 100644
--- a/Library/Homebrew/dev-cmd/bump-cask-pr.rb
+++ b/Library/Homebrew/dev-cmd/bump-cask-pr.rb
@@ -49,7 +49,6 @@ module Homebrew
description: "Use the specified GitHub organization for forking."
conflicts "--dry-run", "--write"
- conflicts "--no-audit", "--online"
conflicts "--version=", "--version-arm="
conflicts "--version=", "--version-intel="
@@ -85,7 +84,9 @@ module Homebrew
method or 'livecheck' block with 'skip'.)
EOS
- odie "You have too many PRs open: close or merge some first!" if GitHub.too_many_open_prs?(cask.tap)
+ if !args.write_only? && GitHub.too_many_open_prs?(cask.tap)
+ odie "You have too many PRs open: close or merge some first!"
+ end
new_version = BumpVersionParser.new(
general: args.version,
@@ -113,7 +114,7 @@ module Homebrew
raise UsageError, "No `--version`, `--url` or `--sha256` argument specified!"
end
- check_pull_requests(cask, new_version:)
+ check_pull_requests(cask, new_version:) unless args.write_only?
replacement_pairs ||= []
branch_name = "bump-#{cask.token}"
@@ -136,7 +137,7 @@ module Homebrew
end
if new_version.present?
- # For simplicity, our naming defers to the arm version if we multiple architectures are specified
+ # For simplicity, our naming defers to the arm version if multiple architectures are specified
branch_version = new_version.arm || new_version.general
if branch_version.is_a?(Cask::DSL::Version)
commit_version = shortened_version(branch_version, cask:)
@@ -171,7 +172,7 @@ module Homebrew
pr_title: commit_message,
}
- GitHub.create_bump_pr(pr_info, args:)
+ GitHub.create_bump_pr(pr_info, args:) unless args.write_only?
end
private
diff --git a/Library/Homebrew/dev-cmd/bump-formula-pr.rb b/Library/Homebrew/dev-cmd/bump-formula-pr.rb
index e585f75d8c..8c417a4f63 100644
--- a/Library/Homebrew/dev-cmd/bump-formula-pr.rb
+++ b/Library/Homebrew/dev-cmd/bump-formula-pr.rb
@@ -121,7 +121,9 @@ module Homebrew
method or 'livecheck' block with 'skip'.)
EOS
- odie "You have too many PRs open: close or merge some first!" if GitHub.too_many_open_prs?(tap)
+ if !args.write_only? && GitHub.too_many_open_prs?(tap)
+ odie "You have too many PRs open: close or merge some first!"
+ end
formula_spec = formula.stable
odie "#{formula}: no stable specification found!" if formula_spec.blank?
@@ -135,7 +137,7 @@ module Homebrew
remote_branch = tap.git_repository.origin_branch_name
previous_branch = "-"
- check_pull_requests(formula, tap_remote_repo, state: "open")
+ check_pull_requests(formula, tap_remote_repo, state: "open") unless args.write_only?
all_formulae = []
if args.bump_synced.present?
@@ -159,6 +161,7 @@ module Homebrew
new_url = args.url
new_version = args.version
+
check_new_version(commit_formula, tap_remote_repo, version: new_version) if new_version.present?
opoo "This formula has patches that may be resolved upstream." if commit_formula.patchlist.present?
@@ -174,6 +177,7 @@ module Homebrew
end
old_hash = commit_formula_spec.checksum&.hexdigest
+
new_hash = args.sha256
new_tag = args.tag
new_revision = args.revision
@@ -213,10 +217,9 @@ module Homebrew
elsif new_url.blank? && new_version.blank?
raise UsageError, "#{commit_formula}: no `--url` or `--version` argument specified!"
else
- next unless new_version.present?
+ new_url ||= PyPI.update_pypi_url(old_url, new_version) if new_version.present?
- new_url ||= PyPI.update_pypi_url(old_url, new_version)
- if new_url.blank?
+ if new_url.blank? && new_version.present?
new_url = update_url(old_url, old_version, new_version)
if new_mirrors.blank? && old_mirrors.present?
new_mirrors = old_mirrors.map do |old_mirror|
@@ -231,6 +234,9 @@ module Homebrew
#{new_url}
EOS
end
+ if new_url.blank?
+ odie "There was an issue generating the updated url, you may need to create the PR manually"
+ end
check_new_version(commit_formula, tap_remote_repo, url: new_url) if new_version.blank?
resource_path, forced_version = fetch_resource_and_forced_version(commit_formula, new_version, new_url)
Utils::Tar.validate_file(resource_path)
@@ -395,10 +401,14 @@ module Homebrew
if github_release_data.present?
pre = "pre" if github_release_data["prerelease"].present?
+ # maximum length of PR body is 65,536 characters so let's truncate release notes to half of that.
+ body = Formatter.truncate(github_release_data["body"], max: 32_768)
+
formula_pr_message += <<~XML
#{pre}release notes
- #{github_release_data["body"]}
+ #{body}
+ View the full release notes at #{github_release_data["html_url"]}.
XML
end
@@ -407,7 +417,7 @@ module Homebrew
{
sourcefile_path: commit_formula.path,
old_contents:,
- commit_message: "#{commit_formula.name} #{args.version}",
+ commit_message: "#{commit_formula.name} #{new_formula_version}",
additional_files: alias_rename,
formula_pr_message:,
formula_name: commit_formula.name,
@@ -426,7 +436,7 @@ module Homebrew
# If `brew audit` fails, revert the changes made to any formula.
commits.each do |revert|
revert_formula = Formula[revert[:formula_name]]
- revert_formula.path.atomic_write(revert[:old_contents]) unless args.dry_run?
+ revert_formula.path.atomic_write(revert[:old_contents]) if !args.dry_run? && !args.write_only?
revert_alias_rename = revert[:additional_files]
if revert_alias_rename && (source = revert_alias_rename.first) && (destination = revert_alias_rename.last)
FileUtils.mv source, destination
@@ -437,6 +447,7 @@ module Homebrew
end
new_formula_version = T.must(commits.first)[:new_version]
+
pr_title = if args.bump_synced.nil?
"#{formula.name} #{new_formula_version}"
else
@@ -462,7 +473,7 @@ module Homebrew
tap_remote_repo:,
pr_message:,
}
- GitHub.create_bump_pr(pr_info, args:)
+ GitHub.create_bump_pr(pr_info, args:) unless args.write_only?
end
private
diff --git a/Library/Homebrew/dev-cmd/tap-new.rb b/Library/Homebrew/dev-cmd/tap-new.rb
index 5d04a15c6c..b1b7e5278f 100644
--- a/Library/Homebrew/dev-cmd/tap-new.rb
+++ b/Library/Homebrew/dev-cmd/tap-new.rb
@@ -126,7 +126,7 @@ module Homebrew
echo "::add-mask::${base64_token}"
echo "token=${base64_token}" >> "${GITHUB_OUTPUT}"
<% end -%>
- - run: brew test-bot --only-formulae<% if root_url %> --root-url='<%= root_url %>'<% end %>
+ - run: brew test-bot --only-formulae#{" --root-url=#{root_url}" if root_url}
if: github.event_name == 'pull_request'
<% if args.github_packages? -%>
env:
diff --git a/Library/Homebrew/dev-cmd/typecheck.rb b/Library/Homebrew/dev-cmd/typecheck.rb
index 3f16dae317..9cf201b8bc 100644
--- a/Library/Homebrew/dev-cmd/typecheck.rb
+++ b/Library/Homebrew/dev-cmd/typecheck.rb
@@ -60,6 +60,7 @@ module Homebrew
HOMEBREW_LIBRARY_PATH.cd do
if update
workers = args.debug? ? ["--workers=1"] : []
+ safe_system "bundle", "exec", "tapioca", "annotations"
safe_system "bundle", "exec", "tapioca", "dsl", *workers
# Prefer adding args here: Library/Homebrew/sorbet/tapioca/config.yml
tapioca_args = args.update_all? ? ["--all"] : []
diff --git a/Library/Homebrew/dev-cmd/update-maintainers.rb b/Library/Homebrew/dev-cmd/update-maintainers.rb
index 0b5dd62980..e1ca6a550f 100644
--- a/Library/Homebrew/dev-cmd/update-maintainers.rb
+++ b/Library/Homebrew/dev-cmd/update-maintainers.rb
@@ -21,12 +21,22 @@ module Homebrew
sig { override.void }
def run
+ # Needed for Manpages.regenerate_man_pages below
+ Homebrew.install_bundler_gems!(groups: ["man"])
+
# We assume that only public members wish to be included in the README
public_members = GitHub.public_member_usernames("Homebrew")
maintainers = GitHub.members_by_team("Homebrew", "maintainers")
+ # Not all PLC members are Homebrew GitHub organisation members any more
+ non_maintainer_plc_members = {
+ colindean: "Colin Dean",
+ mozzadrella: "Vanessa Gennarelli",
+ }.transform_keys(&:to_s)
+ public_members += non_maintainer_plc_members.keys
+
members = {
- plc: GitHub.members_by_team("Homebrew", "plc"),
+ plc: GitHub.members_by_team("Homebrew", "plc").merge(non_maintainer_plc_members),
tsc: GitHub.members_by_team("Homebrew", "tsc"),
maintainers:,
}
diff --git a/Library/Homebrew/download_strategy.rb b/Library/Homebrew/download_strategy.rb
index 103b3a314c..d9a6e86290 100644
--- a/Library/Homebrew/download_strategy.rb
+++ b/Library/Homebrew/download_strategy.rb
@@ -703,7 +703,12 @@ class CurlGitHubPackagesDownloadStrategy < CurlDownloadStrategy
meta[:headers] ||= []
# GitHub Packages authorization header.
# HOMEBREW_GITHUB_PACKAGES_AUTH set in brew.sh
- meta[:headers] << "Authorization: #{HOMEBREW_GITHUB_PACKAGES_AUTH}"
+ # If using a private GHCR mirror with no Authentication set then do not add the header. In all other cases add it.
+ if !Homebrew::EnvConfig.artifact_domain.presence ||
+ Homebrew::EnvConfig.docker_registry_basic_auth_token.presence ||
+ Homebrew::EnvConfig.docker_registry_token.presence
+ meta[:headers] << "Authorization: #{HOMEBREW_GITHUB_PACKAGES_AUTH}"
+ end
super
end
diff --git a/Library/Homebrew/formula-analytics/requirements.txt b/Library/Homebrew/formula-analytics/requirements.txt
index 8bbb4e8a5a..ea19e51c7e 100644
--- a/Library/Homebrew/formula-analytics/requirements.txt
+++ b/Library/Homebrew/formula-analytics/requirements.txt
@@ -8,9 +8,9 @@ certifi==2025.4.26 \
--hash=sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6 \
--hash=sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3
# via influxdb3-python
-influxdb3-python==0.12.0 \
- --hash=sha256:991f756528280b376db162e26ad80096168917f294d62f449a70257e65014c03 \
- --hash=sha256:d82ec4193257e49ba7fee1dee940c951c949a8557d0cf2f7b9f817f940ebcf34
+influxdb3-python==0.13.0 \
+ --hash=sha256:616ee767286a81b6f575ea3de097bc095db724262586231ca8d7567dd2377a30 \
+ --hash=sha256:c039638fcb44dd7c9433ab19e8f05bb782fa13989cb8c74d90e1291ebcc67b3b
# via -r requirements.in
pyarrow==20.0.0 \
--hash=sha256:00138f79ee1b5aca81e2bdedb91e3739b987245e11fa3c826f9e57c5d102fb75 \
@@ -91,7 +91,7 @@ urllib3==2.4.0 \
# via influxdb3-python
# The following packages are considered to be unsafe in a requirements file:
-setuptools==80.7.1 \
- --hash=sha256:ca5cc1069b85dc23070a6628e6bcecb3292acac802399c7f8edc0100619f9009 \
- --hash=sha256:f6ffc5f0142b1bd8d0ca94ee91b30c0ca862ffd50826da1ea85258a06fd94552
+setuptools==80.8.0 \
+ --hash=sha256:49f7af965996f26d43c8ae34539c8d99c5042fbff34302ea151eaa9c207cd257 \
+ --hash=sha256:95a60484590d24103af13b686121328cc2736bee85de8936383111e421b9edc0
# via influxdb3-python
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb
index f1fc47661e..c07a6f6292 100644
--- a/Library/Homebrew/formula.rb
+++ b/Library/Homebrew/formula.rb
@@ -2126,7 +2126,7 @@ class Formula
bash: bash_completion/base_name,
zsh: zsh_completion/"_#{base_name}",
fish: fish_completion/"#{base_name}.fish",
- pwsh: pwsh_completion/"#{base_name}.ps1",
+ pwsh: pwsh_completion/"_#{base_name}.ps1",
}
shells.each do |shell|
diff --git a/Library/Homebrew/formula_creator.rb b/Library/Homebrew/formula_creator.rb
index 14096158ff..8ce26fb847 100644
--- a/Library/Homebrew/formula_creator.rb
+++ b/Library/Homebrew/formula_creator.rb
@@ -222,11 +222,14 @@ module Homebrew
<% elsif @mode == :python %>
virtualenv_install_with_resources
<% elsif @mode == :ruby %>
+ ENV["BUNDLE_VERSION"] = "system" # Avoid installing Bundler into the keg
ENV["GEM_HOME"] = libexec
- system "bundle", "install", "-without", "development", "test"
+ system "bundle", "config", "set", "without", "development", "test"
+ system "bundle", "install"
system "gem", "build", "\#{name}.gemspec"
system "gem", "install", "\#{name}-\#{version}.gem"
+
bin.install libexec/"bin/\#{name}"
bin.env_script_all_files(libexec/"bin", GEM_HOME: ENV["GEM_HOME"])
<% elsif @mode == :rust %>
diff --git a/Library/Homebrew/livecheck/strategy/bitbucket.rb b/Library/Homebrew/livecheck/strategy/bitbucket.rb
index 6624e07490..23ad1f7ec5 100644
--- a/Library/Homebrew/livecheck/strategy/bitbucket.rb
+++ b/Library/Homebrew/livecheck/strategy/bitbucket.rb
@@ -68,14 +68,14 @@ module Homebrew
# `/get/` archives are Git tag snapshots, so we need to check that tab
# instead of the main `/downloads/` page
if match[:dl_type] == "get"
- values[:url] = "https://bitbucket.org/#{match[:path]}/downloads/?tab=tags"
+ values[:url] = "https://bitbucket.org/#{match[:path]}/downloads/?tab=tags&iframe=true&spa=0"
# Example tag regexes:
# * `/
]*?class="name"[^>]*?>\s*v?(\d+(?:\.\d+)+)\s*?]*?class="name"[^>]*?>\s*abc-v?(\d+(?:\.\d+)+)\s*?]*?class="name"[^>]*?>\s*#{regex_prefix}v?(\d+(?:\.\d+)+)\s*?=" || !version_specified?
+ return @version.max if @version.respond_to?(:to_ary)
+
+ @version
+ end
+
def allows?(other)
return true unless version_specified?
diff --git a/Library/Homebrew/rubocops/shared/url_helper.rb b/Library/Homebrew/rubocops/shared/url_helper.rb
index 1d5e6a32ff..0a49816f13 100644
--- a/Library/Homebrew/rubocops/shared/url_helper.rb
+++ b/Library/Homebrew/rubocops/shared/url_helper.rb
@@ -35,6 +35,12 @@ module RuboCop
def audit_url(type, urls, mirrors, livecheck_url: false)
@type = type
+ # URLs must be ASCII; IDNs must be punycode
+ ascii_pattern = /[^\p{ASCII}]+/
+ audit_urls(urls, ascii_pattern) do |_, url|
+ problem "Please use the ASCII (Punycode encoded host, URL-encoded path and query) version of #{url}."
+ end
+
# GNU URLs; doesn't apply to mirrors
gnu_pattern = %r{^(?:https?|ftp)://ftpmirror\.gnu\.org/(.*)}
audit_urls(urls, gnu_pattern) do |match, url|
diff --git a/Library/Homebrew/sorbet/rbi/annotations/.gitattributes b/Library/Homebrew/sorbet/rbi/annotations/.gitattributes
new file mode 100644
index 0000000000..d2eacd2c61
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/annotations/.gitattributes
@@ -0,0 +1 @@
+**/*.rbi linguist-vendored=true
diff --git a/Library/Homebrew/sorbet/rbi/annotations/minitest.rbi b/Library/Homebrew/sorbet/rbi/annotations/minitest.rbi
new file mode 100644
index 0000000000..64a89286ee
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/annotations/minitest.rbi
@@ -0,0 +1,119 @@
+# typed: true
+
+# DO NOT EDIT MANUALLY
+# This file was pulled from a central RBI files repository.
+# Please run `bin/tapioca annotations` to update it.
+
+module Minitest::Assertions
+ sig { params(test: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert(test, msg = nil); end
+
+ sig { params(obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert_empty(obj, msg = nil); end
+
+ sig { params(exp: T.anything, act: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert_equal(exp, act, msg = nil); end
+
+ sig { params(exp: T.anything, act: T.anything, delta: Numeric, msg: T.anything).returns(TrueClass) }
+ def assert_in_delta(exp, act, delta = T.unsafe(nil), msg = nil); end
+
+ sig { params(a: T.anything, b: T.anything, epsilon: Numeric, msg: T.anything).returns(TrueClass) }
+ def assert_in_epsilon(a, b, epsilon = T.unsafe(nil), msg = nil); end
+
+ sig { params(collection: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert_includes(collection, obj, msg = nil); end
+
+ sig { params(cls: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert_instance_of(cls, obj, msg = nil); end
+
+ sig { params(cls: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert_kind_of(cls, obj, msg = nil); end
+
+ sig { params(matcher: T.any(String, Regexp), obj: T.anything, msg: T.anything).returns(MatchData) }
+ def assert_match(matcher, obj, msg = nil); end
+
+ sig { params(obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert_nil(obj, msg = nil); end
+
+ sig { params(o1: T.anything, op: T.any(Symbol, String), o2: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert_operator(o1, op, o2 = T.unsafe(nil), msg = nil); end
+
+ sig { params(stdout: T.nilable(T.any(String, Regexp)), stderr: T.nilable(T.any(String, Regexp)), block: T.proc.void).returns(T::Boolean) }
+ def assert_output(stdout = nil, stderr = nil, &block); end
+
+ sig { params(path: T.any(String, Pathname), msg: T.anything).returns(TrueClass) }
+ def assert_path_exists(path, msg = nil); end
+
+ sig { params(block: T.proc.void).returns(TrueClass) }
+ def assert_pattern(&block); end
+
+ sig { params(o1: T.anything, op: T.any(String, Symbol), msg: T.anything).returns(TrueClass) }
+ def assert_predicate(o1, op, msg = nil); end
+
+ sig { params(exp: NilClass, block: T.proc.void).returns(StandardError) }
+ sig { type_parameters(:T).params(exp: T.any(T::Class[T.type_parameter(:T)], Regexp, String), block: T.proc.void).returns(T.type_parameter(:T)) }
+ def assert_raises(*exp, &block); end
+
+ sig { params(obj: T.anything, meth: T.any(String, Symbol), msg: T.anything, include_all: T::Boolean).returns(TrueClass) }
+ def assert_respond_to(obj, meth, msg = nil, include_all: false); end
+
+ sig { params(exp: T.anything, act: T.anything, msg: T.anything).returns(TrueClass) }
+ def assert_same(exp, act, msg = nil); end
+
+ sig { params(send_ary: T::Array[T.anything], m: T.anything).returns(T::Boolean) }
+ def assert_send(send_ary, m = nil); end
+
+ sig { params(block: T.proc.void).returns(T::Boolean) }
+ def assert_silent(&block); end
+
+ sig { params(sym: Symbol, msg: T.anything, block: T.proc.void).returns(T.anything) }
+ def assert_throws(sym, msg = nil, &block); end
+
+ sig { params(test: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute(test, msg = nil); end
+
+ sig { params(obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_empty(obj, msg = nil); end
+
+ sig { params(exp: T.anything, act: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_equal(exp, act, msg = nil); end
+
+ sig { params(exp: T.anything, act: T.anything, delta: Numeric, msg: T.anything).returns(TrueClass) }
+ def refute_in_delta(exp, act, delta = T.unsafe(nil), msg = nil); end
+
+ sig { params(a: T.anything, b: T.anything, epsilon: Numeric, msg: T.anything).returns(TrueClass) }
+ def refute_in_epsilon(a, b, epsilon = T.unsafe(nil), msg = nil); end
+
+ sig { params(collection: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_includes(collection, obj, msg = nil); end
+
+ sig { params(cls: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_instance_of(cls, obj, msg = nil); end
+
+ sig { params(cls: T.anything, obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_kind_of(cls, obj, msg = nil); end
+
+ sig { params(matcher: T.any(String, Regexp), obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_match(matcher, obj, msg = nil); end
+
+ sig { params(obj: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_nil(obj, msg = nil); end
+
+ sig { params(block: T.proc.void).returns(TrueClass) }
+ def refute_pattern(&block); end
+
+ sig { params(o1: T.anything, op: T.any(Symbol, String), o2: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_operator(o1, op, o2 = T.unsafe(nil), msg = nil); end
+
+ sig { params(path: T.any(String, Pathname), msg: T.anything).returns(TrueClass) }
+ def refute_path_exists(path, msg = nil); end
+
+ sig { params(o1: T.anything, op: T.any(String, Symbol), msg: T.anything).returns(TrueClass) }
+ def refute_predicate(o1, op, msg = nil); end
+
+ sig { params(obj: T.anything, meth: T.any(String, Symbol), msg: T.anything, include_all: T::Boolean).returns(TrueClass) }
+ def refute_respond_to(obj, meth, msg = nil, include_all: false); end
+
+ sig { params(exp: T.anything, act: T.anything, msg: T.anything).returns(TrueClass) }
+ def refute_same(exp, act, msg = nil); end
+end
diff --git a/Library/Homebrew/sorbet/rbi/annotations/rainbow.rbi b/Library/Homebrew/sorbet/rbi/annotations/rainbow.rbi
new file mode 100644
index 0000000000..0d2cb4e48a
--- /dev/null
+++ b/Library/Homebrew/sorbet/rbi/annotations/rainbow.rbi
@@ -0,0 +1,269 @@
+# typed: true
+
+# DO NOT EDIT MANUALLY
+# This file was pulled from a central RBI files repository.
+# Please run `bin/tapioca annotations` to update it.
+
+module Rainbow
+ # @shim: https://github.com/sickill/rainbow/blob/master/lib/rainbow.rb#L10-L12
+ sig { returns(T::Boolean) }
+ attr_accessor :enabled
+
+ class Color
+ sig { returns(Symbol) }
+ attr_reader :ground
+
+ sig { params(ground: Symbol, values: T.any([Integer], [Integer, Integer, Integer])).returns(Color) }
+ def self.build(ground, values); end
+
+ sig { params(hex: String).returns([Integer, Integer, Integer]) }
+ def self.parse_hex_color(hex); end
+
+ class Indexed < Rainbow::Color
+ sig { returns(Integer) }
+ attr_reader :num
+
+ sig { params(ground: Symbol, num: Integer).void }
+ def initialize(ground, num); end
+
+ sig { returns(T::Array[Integer]) }
+ def codes; end
+ end
+
+ class Named < Rainbow::Color::Indexed
+ NAMES = T.let(nil, T::Hash[Symbol, Integer])
+
+ sig { params(ground: Symbol, name: Symbol).void }
+ def initialize(ground, name); end
+
+ sig { returns(T::Array[Symbol]) }
+ def self.color_names; end
+
+ sig { returns(String) }
+ def self.valid_names; end
+ end
+
+ class RGB < Rainbow::Color::Indexed
+ sig { returns(Integer) }
+ attr_reader :r, :g, :b
+
+ sig { params(ground: Symbol, values: Integer).void }
+ def initialize(ground, *values); end
+
+ sig { returns(T::Array[Integer]) }
+ def codes; end
+
+ sig { params(value: Numeric).returns(Integer) }
+ def self.to_ansi_domain(value); end
+ end
+
+ class X11Named < Rainbow::Color::RGB
+ include Rainbow::X11ColorNames
+
+ sig { params(ground: Symbol, name: Symbol).void }
+ def initialize(ground, name); end
+
+ sig { returns(T::Array[Symbol]) }
+ def self.color_names; end
+
+ sig { returns(String) }
+ def self.valid_names; end
+ end
+ end
+
+ sig { returns(Wrapper) }
+ def self.global; end
+
+ sig { returns(T::Boolean) }
+ def self.enabled; end
+
+ sig { params(value: T::Boolean).returns(T::Boolean) }
+ def self.enabled=(value); end
+
+ sig { params(string: String).returns(String) }
+ def self.uncolor(string); end
+
+ class NullPresenter < String
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+ def color(*values); end
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+ def foreground(*values); end
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+ def fg(*values); end
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+ def background(*values); end
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
+ def bg(*values); end
+
+ sig { returns(NullPresenter) }
+ def reset; end
+
+ sig { returns(NullPresenter) }
+ def bright; end
+
+ sig { returns(NullPresenter) }
+ def faint; end
+
+ sig { returns(NullPresenter) }
+ def italic; end
+
+ sig { returns(NullPresenter) }
+ def underline; end
+
+ sig { returns(NullPresenter) }
+ def blink; end
+
+ sig { returns(NullPresenter) }
+ def inverse; end
+
+ sig { returns(NullPresenter) }
+ def hide; end
+
+ sig { returns(NullPresenter) }
+ def cross_out; end
+
+ sig { returns(NullPresenter) }
+ def black; end
+
+ sig { returns(NullPresenter) }
+ def red; end
+
+ sig { returns(NullPresenter) }
+ def green; end
+
+ sig { returns(NullPresenter) }
+ def yellow; end
+
+ sig { returns(NullPresenter) }
+ def blue; end
+
+ sig { returns(NullPresenter) }
+ def magenta; end
+
+ sig { returns(NullPresenter) }
+ def cyan; end
+
+ sig { returns(NullPresenter) }
+ def white; end
+
+ sig { returns(NullPresenter) }
+ def bold; end
+
+ sig { returns(NullPresenter) }
+ def dark; end
+
+ sig { returns(NullPresenter) }
+ def strike; end
+ end
+
+ class Presenter < String
+ TERM_EFFECTS = T.let(nil, T::Hash[Symbol, Integer])
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+ def color(*values); end
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+ def foreground(*values); end
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+ def fg(*values); end
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+ def background(*values); end
+
+ sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
+ def bg(*values); end
+
+ sig { returns(Presenter) }
+ def reset; end
+
+ sig { returns(Presenter) }
+ def bright; end
+
+ sig { returns(Presenter) }
+ def faint; end
+
+ sig { returns(Presenter) }
+ def italic; end
+
+ sig { returns(Presenter) }
+ def underline; end
+
+ sig { returns(Presenter) }
+ def blink; end
+
+ sig { returns(Presenter) }
+ def inverse; end
+
+ sig { returns(Presenter) }
+ def hide; end
+
+ sig { returns(Presenter) }
+ def cross_out; end
+
+ sig { returns(Presenter) }
+ def black; end
+
+ sig { returns(Presenter) }
+ def red; end
+
+ sig { returns(Presenter) }
+ def green; end
+
+ sig { returns(Presenter) }
+ def yellow; end
+
+ sig { returns(Presenter) }
+ def blue; end
+
+ sig { returns(Presenter) }
+ def magenta; end
+
+ sig { returns(Presenter) }
+ def cyan; end
+
+ sig { returns(Presenter) }
+ def white; end
+
+ sig { returns(Presenter) }
+ def bold; end
+
+ sig { returns(Presenter) }
+ def dark; end
+
+ sig { returns(Presenter) }
+ def strike; end
+ end
+
+ class StringUtils
+ sig { params(string: String, codes: T::Array[Integer]).returns(String) }
+ def self.wrap_with_sgr(string, codes); end
+
+ sig { params(string: String).returns(String) }
+ def self.uncolor(string); end
+ end
+
+ VERSION = T.let(nil, String)
+
+ class Wrapper
+ sig { returns(T::Boolean) }
+ attr_accessor :enabled
+
+ sig { params(enabled: T::Boolean).void }
+ def initialize(enabled = true); end
+
+ sig { params(string: String).returns(T.any(Rainbow::Presenter, Rainbow::NullPresenter)) }
+ def wrap(string); end
+ end
+
+ module X11ColorNames
+ NAMES = T.let(nil, T::Hash[Symbol, [Integer, Integer, Integer]])
+ end
+end
+
+sig { params(string: String).returns(Rainbow::Presenter) }
+def Rainbow(string); end
diff --git a/Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.20.rbi b/Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.21.rbi
similarity index 100%
rename from Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.20.rbi
rename to Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.21.rbi
diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb
index 1b487f52fa..bf83e7ee29 100644
--- a/Library/Homebrew/tap.rb
+++ b/Library/Homebrew/tap.rb
@@ -590,8 +590,9 @@ class Tap
end
return unless remote
- current_upstream_head = T.must(git_repository.origin_branch_name)
- return if requested_remote.blank? && git_repository.origin_has_branch?(current_upstream_head)
+ current_upstream_head = git_repository.origin_branch_name
+ return if current_upstream_head.present? && requested_remote.blank? &&
+ git_repository.origin_has_branch?(current_upstream_head)
args = %w[fetch]
args << "--quiet" if quiet
@@ -600,6 +601,8 @@ class Tap
safe_system "git", "-C", path, *args
git_repository.set_head_origin_auto
+ current_upstream_head ||= T.must(git_repository.origin_branch_name)
+
new_upstream_head = T.must(git_repository.origin_branch_name)
return if new_upstream_head == current_upstream_head
diff --git a/Library/Homebrew/test/bundle/commands/cleanup_spec.rb b/Library/Homebrew/test/bundle/commands/cleanup_spec.rb
index d234f07b1e..e85f78ddc7 100644
--- a/Library/Homebrew/test/bundle/commands/cleanup_spec.rb
+++ b/Library/Homebrew/test/bundle/commands/cleanup_spec.rb
@@ -158,6 +158,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
expect(described_class).to receive(:system_output_no_stderr).and_return("")
expect { described_class.run(force: true) }.to output(/Uninstalled 2 casks/).to_stdout
end
+
+ it "does not uninstall casks if --brews is disabled" do
+ expect(Kernel).not_to receive(:system)
+ expect(described_class).to receive(:system_output_no_stderr).and_return("")
+ expect { described_class.run(force: true, casks: false) }.not_to output.to_stdout
+ end
end
context "when there are casks to zap" do
@@ -174,6 +180,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
expect(described_class).to receive(:system_output_no_stderr).and_return("")
expect { described_class.run(force: true, zap: true) }.to output(/Uninstalled 2 casks/).to_stdout
end
+
+ it "does not uninstall casks if --casks is disabled" do
+ expect(Kernel).not_to receive(:system)
+ expect(described_class).to receive(:system_output_no_stderr).and_return("")
+ expect { described_class.run(force: true, zap: true, casks: false) }.not_to output.to_stdout
+ end
end
context "when there are formulae to uninstall" do
@@ -190,6 +202,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
expect(described_class).to receive(:system_output_no_stderr).and_return("")
expect { described_class.run(force: true) }.to output(/Uninstalled 2 formulae/).to_stdout
end
+
+ it "does not uninstall formulae if --casks is disabled" do
+ expect(Kernel).not_to receive(:system)
+ expect(described_class).to receive(:system_output_no_stderr).and_return("")
+ expect { described_class.run(force: true, brews: false) }.not_to output.to_stdout
+ end
end
context "when there are taps to untap" do
@@ -206,6 +224,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
expect(described_class).to receive(:system_output_no_stderr).and_return("")
described_class.run(force: true)
end
+
+ it "does not untap taps if --taps is disabled" do
+ expect(Kernel).not_to receive(:system)
+ expect(described_class).to receive(:system_output_no_stderr).and_return("")
+ described_class.run(force: true, taps: false)
+ end
end
context "when there are VSCode extensions to uninstall" do
@@ -223,6 +247,12 @@ RSpec.describe Homebrew::Bundle::Commands::Cleanup do
expect(described_class).to receive(:system_output_no_stderr).and_return("")
described_class.run(force: true)
end
+
+ it "does not uninstall extensions if --vscode is disabled" do
+ expect(Kernel).not_to receive(:system)
+ expect(described_class).to receive(:system_output_no_stderr).and_return("")
+ described_class.run(force: true, vscode: false)
+ end
end
context "when there are casks and formulae to uninstall and taps to untap but without passing `--force`" do
diff --git a/Library/Homebrew/test/formatter_spec.rb b/Library/Homebrew/test/formatter_spec.rb
index e02451a594..ba866ee8f5 100644
--- a/Library/Homebrew/test/formatter_spec.rb
+++ b/Library/Homebrew/test/formatter_spec.rb
@@ -110,4 +110,18 @@ RSpec.describe Formatter do
expect(described_class.format_help_text(text, width: 80)).to eq expected
end
end
+
+ describe "::truncate" do
+ it "returns the original string if it's shorter than max length" do
+ expect(described_class.truncate("short", max: 10)).to eq("short")
+ end
+
+ it "truncates strings longer than max length" do
+ expect(described_class.truncate("this is a long string", max: 10)).to eq("this is...")
+ end
+
+ it "uses custom omission string" do
+ expect(described_class.truncate("this is a long string", max: 10, omission: " [...]")).to eq("this [...]")
+ end
+ end
end
diff --git a/Library/Homebrew/test/livecheck/strategy/bitbucket_spec.rb b/Library/Homebrew/test/livecheck/strategy/bitbucket_spec.rb
index a0a9c3eb47..3e3e0070bc 100644
--- a/Library/Homebrew/test/livecheck/strategy/bitbucket_spec.rb
+++ b/Library/Homebrew/test/livecheck/strategy/bitbucket_spec.rb
@@ -16,11 +16,11 @@ RSpec.describe Homebrew::Livecheck::Strategy::Bitbucket do
let(:generated) do
{
get: {
- url: "https://bitbucket.org/abc/def/downloads/?tab=tags",
+ url: "https://bitbucket.org/abc/def/downloads/?tab=tags&iframe=true&spa=0",
regex: / | ]*?class="name"[^>]*?>\s*v?(\d+(?:\.\d+)+)\s*?=")
+ exact_requirement = described_class.new([:big_sur], comparator: "==")
+ range_requirement = described_class.new([[:catalina, :big_sur]], comparator: "==")
+ expect(no_requirement.maximum_version).to eq macos_newest_allowed
+ expect(max_requirement.maximum_version).to eq big_sur_major
+ expect(min_requirement.maximum_version).to eq macos_newest_allowed
+ expect(exact_requirement.maximum_version).to eq big_sur_major
+ expect(range_requirement.maximum_version).to eq big_sur_major
+ end
+
specify "#allows?" do
no_requirement = described_class.new
max_requirement = described_class.new([:mojave], comparator: "<=")
diff --git a/Library/Homebrew/test/rubocops/urls_spec.rb b/Library/Homebrew/test/rubocops/urls_spec.rb
index 80bf49199a..fab6d84ada 100644
--- a/Library/Homebrew/test/rubocops/urls_spec.rb
+++ b/Library/Homebrew/test/rubocops/urls_spec.rb
@@ -177,6 +177,14 @@ RSpec.describe RuboCop::Cop::FormulaAudit::Urls do
"url" => "svn+http://brew.sh/foo/bar",
"msg" => "Use of the svn+http:// scheme is deprecated, pass `:using => :svn` instead",
"col" => 2,
+ }, {
+ "url" => "https://đź« .sh/foo/bar",
+ "msg" => "Please use the ASCII (Punycode encoded host, URL-encoded path and query) version of https://đź« .sh/foo/bar.",
+ "col" => 2,
+ }, {
+ "url" => "https://Ăźreď˝—.sh/foo/bar",
+ "msg" => "Please use the ASCII (Punycode encoded host, URL-encoded path and query) version of https://Ăźreď˝—.sh/foo/bar.",
+ "col" => 2,
}]
end
diff --git a/Library/Homebrew/test/utils/github_spec.rb b/Library/Homebrew/test/utils/github_spec.rb
index e07f093e7c..d4b6ca2ac6 100644
--- a/Library/Homebrew/test/utils/github_spec.rb
+++ b/Library/Homebrew/test/utils/github_spec.rb
@@ -71,14 +71,6 @@ RSpec.describe GitHub do
)
expect(urls).to eq(["https://api.github.com/repos/Homebrew/homebrew-core/actions/artifacts/1969725476/zip"])
end
-
- it "supports pattern matching" do
- urls = described_class.get_artifact_urls(
- described_class.get_workflow_run("Homebrew", "brew", "17068",
- workflow_id: "pkg-installer.yml", artifact_pattern: "Homebrew-*.pkg"),
- )
- expect(urls).to eq(["https://api.github.com/repos/Homebrew/brew/actions/artifacts/1405050842/zip"])
- end
end
describe "::pull_request_commits", :needs_network do
diff --git a/Library/Homebrew/uninstall.rb b/Library/Homebrew/uninstall.rb
index ba03abc04f..c8d0e59ae8 100644
--- a/Library/Homebrew/uninstall.rb
+++ b/Library/Homebrew/uninstall.rb
@@ -67,7 +67,18 @@ module Homebrew
end
unversioned_name = f.name.gsub(/@.+$/, "")
- maybe_paths = Dir.glob("#{f.etc}/*#{unversioned_name}*")
+ maybe_paths = Dir.glob("#{f.etc}/#{unversioned_name}*")
+ excluded_names = Homebrew::API::Formula.all_formulae.keys
+ maybe_paths = maybe_paths.reject do |path|
+ # Remove extension only if a file
+ # (f.e. directory with name "openssl@1.1" will be trimmed to "openssl@1")
+ basename = if File.directory?(path)
+ File.basename(path)
+ else
+ File.basename(path, ".*")
+ end
+ excluded_names.include?(basename)
+ end
maybe_paths -= paths if paths.present?
if maybe_paths.present?
puts
diff --git a/Library/Homebrew/utils/formatter.rb b/Library/Homebrew/utils/formatter.rb
index 9815425204..3e7428c80e 100644
--- a/Library/Homebrew/utils/formatter.rb
+++ b/Library/Homebrew/utils/formatter.rb
@@ -54,6 +54,19 @@ module Formatter
label(label, string, :red)
end
+ # Truncate a string to a specific length.
+ #
+ # @api internal
+ sig { params(string: String, max: Integer, omission: String).returns(String) }
+ def self.truncate(string, max: 30, omission: "...")
+ return string if string.length <= max
+
+ length_with_room_for_omission = max - omission.length
+ truncated = string[0, length_with_room_for_omission]
+
+ "#{truncated}#{omission}"
+ end
+
# Wraps text to fit within a given number of columns using regular expressions that:
#
# 1. convert hard-wrapped paragraphs to a single line
diff --git a/Library/Homebrew/utils/spdx.rb b/Library/Homebrew/utils/spdx.rb
index bf45bf377c..7b8e69e865 100644
--- a/Library/Homebrew/utils/spdx.rb
+++ b/Library/Homebrew/utils/spdx.rb
@@ -87,7 +87,7 @@ module SPDX
return ALLOWED_LICENSE_SYMBOLS.include? license if license.is_a? Symbol
license = license.delete_suffix "+"
- license_data["licenses"].any? { |spdx_license| spdx_license["licenseId"] == license }
+ license_data["licenses"].any? { |spdx_license| spdx_license["licenseId"].downcase == license.downcase }
end
sig { params(license: T.any(String, Symbol)).returns(T::Boolean) }
@@ -97,14 +97,14 @@ module SPDX
license = license.to_s.delete_suffix "+"
license_data["licenses"].none? do |spdx_license|
- spdx_license["licenseId"] == license && !spdx_license["isDeprecatedLicenseId"]
+ spdx_license["licenseId"].downcase == license.downcase && !spdx_license["isDeprecatedLicenseId"]
end
end
sig { params(exception: String).returns(T::Boolean) }
def valid_license_exception?(exception)
exception_data["exceptions"].any? do |spdx_exception|
- spdx_exception["licenseExceptionId"] == exception && !spdx_exception["isDeprecatedLicenseId"]
+ spdx_exception["licenseExceptionId"].downcase == exception.downcase && !spdx_exception["isDeprecatedLicenseId"]
end
end
diff --git a/Library/Homebrew/vendor/bundle/bundler/setup.rb b/Library/Homebrew/vendor/bundle/bundler/setup.rb
index baaccd42e7..f58f1245dc 100644
--- a/Library/Homebrew/vendor/bundle/bundler/setup.rb
+++ b/Library/Homebrew/vendor/bundle/bundler/setup.rb
@@ -78,7 +78,7 @@ $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rainbow-3.1.1/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/rbs-3.9.4")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rbs-3.9.4/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-runtime-0.5.12109/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-runtime-0.5.12117/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rbi-0.3.3/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/redcarpet-3.6.1")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/redcarpet-3.6.1/lib")
@@ -100,7 +100,7 @@ $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-performance-1.25.0/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-rspec-3.6.0/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-sorbet-0.10.0/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-lsp-0.23.20/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-lsp-0.23.21/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-macho-4.1.0/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/ruby-prof-1.7.1")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-prof-1.7.1/lib")
@@ -108,9 +108,9 @@ $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/simplecov_json_formatter-0.1.4/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/simplecov-0.22.0/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/simplecov-cobertura-2.1.0/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-0.5.12109-universal-darwin/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-0.5.12109/lib")
-$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-and-runtime-0.5.12109/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-0.5.12117-universal-darwin/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-0.5.12117/lib")
+$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-and-runtime-0.5.12117/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/thor-1.3.2/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/spoom-1.6.3/lib")
$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/stackprof-0.2.27")
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/sorbet-runtime.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/sorbet-runtime.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/sorbet-runtime.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/sorbet-runtime.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/_types.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/_types.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/_types.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/_types.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/abstract_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/abstract_utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/abstract_utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/abstract_utils.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/boolean.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/boolean.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/boolean.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/boolean.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/compatibility_patches.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/compatibility_patches.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/compatibility_patches.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/compatibility_patches.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/configuration.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/configuration.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/configuration.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/configuration.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/enum.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/enum.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/enum.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/generic.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/generic.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/generic.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/generic.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/helpers.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/helpers.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/helpers.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/helpers.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/non_forcing_constants.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/non_forcing_constants.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/non_forcing_constants.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/non_forcing_constants.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/abstract/data.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/data.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/abstract/data.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/data.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/abstract/declare.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/declare.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/abstract/declare.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/declare.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/abstract/hooks.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/hooks.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/abstract/hooks.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/hooks.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/abstract/validate.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/validate.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/abstract/validate.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/abstract/validate.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/caller_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/caller_utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/caller_utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/caller_utils.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/casts.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/casts.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/casts.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/casts.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/class_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/class_utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/class_utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/class_utils.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/decl_state.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/decl_state.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/decl_state.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/decl_state.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/final.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/final.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/final.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/final.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/_methods.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/_methods.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/_methods.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/_methods.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/call_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/call_validation.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/call_validation_2_6.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation_2_6.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/call_validation_2_6.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation_2_6.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/call_validation_2_7.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation_2_7.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/call_validation_2_7.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/call_validation_2_7.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/decl_builder.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/decl_builder.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/decl_builder.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/decl_builder.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/modes.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/modes.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/modes.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/modes.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/signature.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/signature.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/signature.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/signature.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/signature_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/signature_validation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/methods/signature_validation.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/methods/signature_validation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/mixins/mixins.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/mixins/mixins.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/mixins/mixins.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/mixins/mixins.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/retry.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/retry.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/retry.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/retry.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/runtime_levels.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/runtime_levels.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/runtime_levels.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/runtime_levels.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/sealed.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/sealed.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/sealed.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/sealed.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/not_typed.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/not_typed.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/not_typed.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/not_typed.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/simple_pair_union.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/simple_pair_union.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/simple_pair_union.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/simple_pair_union.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/string_holder.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/string_holder.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/string_holder.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/string_holder.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/type_alias.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/type_alias.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/type_alias.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/type_alias.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/void.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/void.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/private/types/void.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/private/types/void.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/_props.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/_props.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/_props.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/_props.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/constructor.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/constructor.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/constructor.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/constructor.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/custom_type.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/custom_type.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/custom_type.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/custom_type.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/decorator.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/decorator.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/decorator.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/decorator.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/errors.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/errors.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/errors.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/errors.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/generated_code_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/generated_code_validation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/generated_code_validation.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/generated_code_validation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/has_lazily_specialized_methods.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/has_lazily_specialized_methods.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/has_lazily_specialized_methods.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/has_lazily_specialized_methods.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/optional.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/optional.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/optional.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/optional.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/plugin.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/plugin.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/plugin.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/plugin.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/pretty_printable.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/pretty_printable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/pretty_printable.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/pretty_printable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/apply_default.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/apply_default.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/apply_default.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/apply_default.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/deserializer_generator.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/deserializer_generator.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/deserializer_generator.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/deserializer_generator.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/parser.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/parser.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/parser.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/parser.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/serde_transform.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/serde_transform.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/serde_transform.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/serde_transform.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/serializer_generator.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/serializer_generator.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/serializer_generator.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/serializer_generator.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/setter_factory.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/setter_factory.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/private/setter_factory.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/private/setter_factory.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/serializable.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/serializable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/serializable.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/serializable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/type_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/type_validation.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/type_validation.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/type_validation.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/utils.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/weak_constructor.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/weak_constructor.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/props/weak_constructor.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/props/weak_constructor.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/sig.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/sig.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/sig.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/sig.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/struct.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/struct.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/struct.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/struct.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/anything.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/anything.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/anything.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/anything.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/attached_class.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/attached_class.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/attached_class.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/attached_class.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/base.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/base.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/base.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/base.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/class_of.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/class_of.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/class_of.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/class_of.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/enum.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/enum.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/enum.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/fixed_array.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/fixed_array.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/fixed_array.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/fixed_array.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/fixed_hash.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/fixed_hash.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/fixed_hash.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/fixed_hash.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/intersection.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/intersection.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/intersection.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/intersection.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/noreturn.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/noreturn.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/noreturn.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/noreturn.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/proc.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/proc.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/proc.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/proc.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/self_type.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/self_type.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/self_type.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/self_type.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/simple.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/simple.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/simple.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/simple.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/t_enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/t_enum.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/t_enum.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/t_enum.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/type_member.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_member.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/type_member.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_member.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/type_parameter.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_parameter.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/type_parameter.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_parameter.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/type_template.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_template.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/type_template.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_template.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/type_variable.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_variable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/type_variable.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/type_variable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_array.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_array.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_array.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_array.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_class.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_class.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_class.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_class.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_enumerable.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerable.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_enumerable.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerable.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_enumerator.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_enumerator.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_enumerator_chain.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator_chain.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_enumerator_chain.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator_chain.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_enumerator_lazy.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator_lazy.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_enumerator_lazy.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_enumerator_lazy.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_hash.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_hash.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_hash.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_hash.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_range.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_range.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_range.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_range.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_set.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_set.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/typed_set.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/typed_set.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/union.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/union.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/union.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/union.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/untyped.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/untyped.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/types/untyped.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/types/untyped.rb
diff --git a/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/utils.rb
similarity index 100%
rename from Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12109/lib/types/utils.rb
rename to Library/Homebrew/vendor/bundle/ruby/3.4.0/gems/sorbet-runtime-0.5.12117/lib/types/utils.rb
diff --git a/README.md b/README.md
index b83f445de2..aafa616417 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,7 @@ Homebrew's [Project Leader](https://docs.brew.sh/Homebrew-Governance#6-project-l
Homebrew's [Project Leadership Committee](https://docs.brew.sh/Homebrew-Governance#4-project-leadership-committee) is [Colin Dean](https://github.com/colindean), [Michka Popoff](https://github.com/iMichka), [Mike McQuaid](https://github.com/MikeMcQuaid), [Patrick Linnane](https://github.com/p-linnane) and [Vanessa Gennarelli](https://github.com/mozzadrella).
-Homebrew's [Technical Steering Committee](https://docs.brew.sh/Homebrew-Governance#7-technical-steering-committee) is [Bo Anderson](https://github.com/Bo98), [FX Coudert](https://github.com/fxcoudert), [Mike McQuaid](https://github.com/MikeMcQuaid) and [Rylan Polster](https://github.com/Rylan12).
+Homebrew's [Technical Steering Committee](https://docs.brew.sh/Homebrew-Governance#7-technical-steering-committee) is [Bo Anderson](https://github.com/Bo98), [Issy Long](https://github.com/issyl0), [Michael Cho](https://github.com/cho-m), [Mike McQuaid](https://github.com/MikeMcQuaid) and [Ruoyu Zhong](https://github.com/ZhongRuoyu).
Homebrew's maintainers are [Alexander Bayandin](https://github.com/bayandin), [Bevan Kay](https://github.com/bevanjkay), [Bo Anderson](https://github.com/Bo98), [Branch Vincent](https://github.com/branchvincent), [Caleb Xu](https://github.com/alebcay), [Carlo Cabrera](https://github.com/carlocab), [Daeho Ro](https://github.com/daeho-ro), [Douglas Eichelberger](https://github.com/dduugg), [Dustin Rodrigues](https://github.com/dtrodrigues), [Eric Knibbe](https://github.com/EricFromCanada), [FX Coudert](https://github.com/fxcoudert), [Issy Long](https://github.com/issyl0), [Justin Krehel](https://github.com/krehel), [Klaus Hipp](https://github.com/khipp), [Markus Reiter](https://github.com/reitermarkus), [Michael Cho](https://github.com/cho-m), [Michka Popoff](https://github.com/iMichka), [Mike McQuaid](https://github.com/MikeMcQuaid), [Nanda H Krishna](https://github.com/nandahkrishna), [Patrick Linnane](https://github.com/p-linnane), [Rui Chen](https://github.com/chenrui333), [Ruoyu Zhong](https://github.com/ZhongRuoyu), [Rylan Polster](https://github.com/Rylan12), [Sam Ford](https://github.com/samford), [Sean Molenaar](https://github.com/SMillerDev), [Ĺ tefan Baebler](https://github.com/stefanb), [Thierry Moisan](https://github.com/Moisan), [Timothy Sutton](https://github.com/timsutton) and [William Woodruff](https://github.com/woodruffw).
diff --git a/completions/fish/brew.fish b/completions/fish/brew.fish
index e569c1be4f..ad49769c46 100644
--- a/completions/fish/brew.fish
+++ b/completions/fish/brew.fish
@@ -506,14 +506,14 @@ __fish_brew_complete_sub_cmd 'bundle' 'sh'
__fish_brew_complete_sub_cmd 'bundle' 'env'
__fish_brew_complete_sub_cmd 'bundle' 'edit'
__fish_brew_complete_arg 'bundle' -l all -d '`list` all dependencies'
-__fish_brew_complete_arg 'bundle' -l cask -d '`list` or `dump` Homebrew cask dependencies'
+__fish_brew_complete_arg 'bundle' -l cask -d '`list`, `dump` or `cleanup` Homebrew cask dependencies'
__fish_brew_complete_arg 'bundle' -l check -d 'Check that all dependencies in the Brewfile are installed before running `exec`, `sh`, or `env`'
__fish_brew_complete_arg 'bundle' -l cleanup -d '`install` performs cleanup operation, same as running `cleanup --force`. This is enabled by default if `$HOMEBREW_BUNDLE_INSTALL_CLEANUP` is set and `--global` is passed'
__fish_brew_complete_arg 'bundle' -l debug -d 'Display any debugging information'
__fish_brew_complete_arg 'bundle' -l describe -d '`dump` adds a description comment above each line, unless the dependency does not have a description. This is enabled by default if `$HOMEBREW_BUNDLE_DUMP_DESCRIBE` is set'
__fish_brew_complete_arg 'bundle' -l file -d 'Read from or write to the `Brewfile` from this location. Use `--file=-` to pipe to stdin/stdout'
__fish_brew_complete_arg 'bundle' -l force -d '`install` runs with `--force`/`--overwrite`. `dump` overwrites an existing `Brewfile`. `cleanup` actually performs its cleanup operations'
-__fish_brew_complete_arg 'bundle' -l formula -d '`list` or `dump` Homebrew formula dependencies'
+__fish_brew_complete_arg 'bundle' -l formula -d '`list`, `dump` or `cleanup` Homebrew formula dependencies'
__fish_brew_complete_arg 'bundle' -l global -d 'Read from or write to the `Brewfile` from `$HOMEBREW_BUNDLE_FILE_GLOBAL` (if set), `${XDG_CONFIG_HOME}/homebrew/Brewfile` (if `$XDG_CONFIG_HOME` is set), `~/.homebrew/Brewfile` or `~/.Brewfile` otherwise'
__fish_brew_complete_arg 'bundle' -l help -d 'Show this message'
__fish_brew_complete_arg 'bundle' -l install -d 'Run `install` before continuing to other operations e.g. `exec`'
@@ -523,11 +523,11 @@ __fish_brew_complete_arg 'bundle' -l no-upgrade -d '`install` does not run `brew
__fish_brew_complete_arg 'bundle' -l no-vscode -d '`dump` without VSCode (and forks/variants) extensions. This is enabled by default if `$HOMEBREW_BUNDLE_DUMP_NO_VSCODE` is set'
__fish_brew_complete_arg 'bundle' -l quiet -d 'Make some output more quiet'
__fish_brew_complete_arg 'bundle' -l services -d 'Temporarily start services while running the `exec` or `sh` command. This is enabled by default if `$HOMEBREW_BUNDLE_SERVICES` is set'
-__fish_brew_complete_arg 'bundle' -l tap -d '`list` or `dump` Homebrew tap dependencies'
+__fish_brew_complete_arg 'bundle' -l tap -d '`list`, `dump` or `cleanup` Homebrew tap dependencies'
__fish_brew_complete_arg 'bundle' -l upgrade -d '`install` runs `brew upgrade` on outdated dependencies, even if `$HOMEBREW_BUNDLE_NO_UPGRADE` is set'
__fish_brew_complete_arg 'bundle' -l upgrade-formulae -d '`install` runs `brew upgrade` on any of these comma-separated formulae, even if `$HOMEBREW_BUNDLE_NO_UPGRADE` is set'
__fish_brew_complete_arg 'bundle' -l verbose -d '`install` prints output from commands as they are run. `check` lists all missing dependencies'
-__fish_brew_complete_arg 'bundle' -l vscode -d '`list` or `dump` VSCode (and forks/variants) extensions'
+__fish_brew_complete_arg 'bundle' -l vscode -d '`list`, `dump` or `cleanup` VSCode (and forks/variants) extensions'
__fish_brew_complete_arg 'bundle' -l whalebrew -d '`list` or `dump` Whalebrew dependencies'
__fish_brew_complete_arg 'bundle' -l zap -d '`cleanup` casks using the `zap` command instead of `uninstall`'
diff --git a/completions/zsh/_brew b/completions/zsh/_brew
index bdba3d7058..a93a909464 100644
--- a/completions/zsh/_brew
+++ b/completions/zsh/_brew
@@ -566,7 +566,7 @@ _brew_bump_cask_pr() {
'--fork-org[Use the specified GitHub organization for forking]' \
'--help[Show this message]' \
'--message[Prepend message to the default pull request message]' \
- '(--online)--no-audit[Don'\''t run `brew audit` before opening the PR]' \
+ '--no-audit[Don'\''t run `brew audit` before opening the PR]' \
'--no-browse[Print the pull request URL instead of opening in a browser]' \
'--no-fork[Don'\''t try to fork the repository]' \
'--no-style[Don'\''t run `brew style --fix` before opening the PR]' \
@@ -649,14 +649,14 @@ _brew_bump_unversioned_casks() {
_brew_bundle() {
_arguments \
'(--no-vscode)--all[`list` all dependencies]' \
- '--cask[`list` or `dump` Homebrew cask dependencies]' \
+ '--cask[`list`, `dump` or `cleanup` Homebrew cask dependencies]' \
'--check[Check that all dependencies in the Brewfile are installed before running `exec`, `sh`, or `env`]' \
'--cleanup[`install` performs cleanup operation, same as running `cleanup --force`. This is enabled by default if `$HOMEBREW_BUNDLE_INSTALL_CLEANUP` is set and `--global` is passed]' \
'--debug[Display any debugging information]' \
'--describe[`dump` adds a description comment above each line, unless the dependency does not have a description. This is enabled by default if `$HOMEBREW_BUNDLE_DUMP_DESCRIBE` is set]' \
'--file[Read from or write to the `Brewfile` from this location. Use `--file=-` to pipe to stdin/stdout]' \
'--force[`install` runs with `--force`/`--overwrite`. `dump` overwrites an existing `Brewfile`. `cleanup` actually performs its cleanup operations]' \
- '--formula[`list` or `dump` Homebrew formula dependencies]' \
+ '--formula[`list`, `dump` or `cleanup` Homebrew formula dependencies]' \
'--global[Read from or write to the `Brewfile` from `$HOMEBREW_BUNDLE_FILE_GLOBAL` (if set), `${XDG_CONFIG_HOME}/homebrew/Brewfile` (if `$XDG_CONFIG_HOME` is set), `~/.homebrew/Brewfile` or `~/.Brewfile` otherwise]' \
'--help[Show this message]' \
'(--upgrade)--install[Run `install` before continuing to other operations e.g. `exec`]' \
@@ -666,11 +666,11 @@ _brew_bundle() {
'(--all --vscode)--no-vscode[`dump` without VSCode (and forks/variants) extensions. This is enabled by default if `$HOMEBREW_BUNDLE_DUMP_NO_VSCODE` is set]' \
'--quiet[Make some output more quiet]' \
'--services[Temporarily start services while running the `exec` or `sh` command. This is enabled by default if `$HOMEBREW_BUNDLE_SERVICES` is set]' \
- '--tap[`list` or `dump` Homebrew tap dependencies]' \
+ '--tap[`list`, `dump` or `cleanup` Homebrew tap dependencies]' \
'(--install)--upgrade[`install` runs `brew upgrade` on outdated dependencies, even if `$HOMEBREW_BUNDLE_NO_UPGRADE` is set]' \
'--upgrade-formulae[`install` runs `brew upgrade` on any of these comma-separated formulae, even if `$HOMEBREW_BUNDLE_NO_UPGRADE` is set]' \
'--verbose[`install` prints output from commands as they are run. `check` lists all missing dependencies]' \
- '(--no-vscode)--vscode[`list` or `dump` VSCode (and forks/variants) extensions]' \
+ '(--no-vscode)--vscode[`list`, `dump` or `cleanup` VSCode (and forks/variants) extensions]' \
'--whalebrew[`list` or `dump` Whalebrew dependencies]' \
'--zap[`cleanup` casks using the `zap` command instead of `uninstall`]' \
- subcommand \
diff --git a/docs/.mdl_ruleset.rb b/docs/.mdl_ruleset.rb
index 7cf80606d7..fab331a825 100644
--- a/docs/.mdl_ruleset.rb
+++ b/docs/.mdl_ruleset.rb
@@ -8,3 +8,17 @@ rule "HB034", "Bare unstyled URL used" do
doc.matching_text_element_lines(%r{(?<=\s)https?://})
end
end
+rule "HB100", "Full URL for internal link used" do
+ tags :links, :url
+ aliases "no-full-urls-for-internal-links"
+ check do |doc|
+ doc.matching_lines(%r{\]\(https://docs.brew.sh/.+?\)})
+ end
+end
+rule "HB101", "File extension missing from internal link" do
+ tags :links, :url
+ aliases "file-extension-required-for-internal-links"
+ check do |doc|
+ doc.matching_lines(/\]\((?!#|\w+:)(?>[^#.)]+)(?!\.\w+)/)
+ end
+end
diff --git a/docs/Acceptable-Casks.md b/docs/Acceptable-Casks.md
index 2146d0c2e3..5813f17c49 100644
--- a/docs/Acceptable-Casks.md
+++ b/docs/Acceptable-Casks.md
@@ -36,7 +36,7 @@ These versions also live in the main repository at [Homebrew/homebrew-cask](http
### Regional and Localized
-When an app exists in more than one language or has different regional editions, [the `language` stanza should be used to switch between languages or regions](https://docs.brew.sh/Cask-Cookbook#stanza-language).
+When an app exists in more than one language or has different regional editions, [the `language` stanza should be used to switch between languages or regions](Cask-Cookbook.md#stanza-language).
### Trial and Freemium versions
@@ -111,7 +111,7 @@ Common reasons to reject a cask entirely:
* An app from a code repository that is not notable enough (under 30 forks, 30 watchers, 75 stars).
* [Electronic Identification (eID) software](https://github.com/Homebrew/homebrew-cask/issues/59021).
* App requires [SIP to be disabled](https://github.com/Homebrew/homebrew-cask/pull/41890) to be installed and/or used.
-* App installer is a `pkg` that requires [`allow_untrusted: true`](https://docs.brew.sh/Cask-Cookbook#pkg-allow_untrusted).
+* App installer is a `pkg` that requires [`allow_untrusted: true`](Cask-Cookbook.md#pkg-allow_untrusted).
* App is a trial version, and the only way to acquire the full version is through the Mac App Store.
* Similarly (and trickier to spot), the app has moved to the Mac App Store but still provides old versions via direct download. We reject these in all official repositories so users don’t get stuck using an old version, wrongly thinking they’re using the most up-to-date one (which, amongst other things, might be a security risk).
* App is unmaintained, i.e. no releases in the last year, or [explicitly discontinued](https://github.com/Homebrew/homebrew-cask/pull/22699).
@@ -120,7 +120,7 @@ Common reasons to reject a cask entirely:
* Or if the Cask has a download URL that is both behind a login/registration form and from a host that differs from the homepage.
* Cask is unreasonably difficult to maintain. Examples have included [Audacity](https://github.com/Homebrew/homebrew-cask/pull/27517) and [older Java development casks](https://github.com/Homebrew/homebrew-cask/issues/57387).
* Cask has been rejected before due to an issue we cannot fix, and the new submission doesn’t fix that. An example would be the [first submission of `soapui`](https://github.com/Homebrew/homebrew-cask/pull/4939), whose installation problems were not fixed in the two [subsequent](https://github.com/Homebrew/homebrew-cask/pull/9969) [submissions](https://github.com/Homebrew/homebrew-cask/pull/10606).
-* Cask is a duplicate. These submissions mostly occur when the [token reference](https://docs.brew.sh/Cask-Cookbook#token-reference) was not followed.
+* Cask is a duplicate. These submissions mostly occur when the [token reference](Cask-Cookbook.md#token-reference) was not followed.
* The author has [specifically asked us not to include it](https://github.com/Homebrew/homebrew-cask/pull/5342).
* App is both open-source and CLI-only (i.e. it only uses the `binary` artifact). In that case, and [in the spirit of deduplication](https://github.com/Homebrew/homebrew-cask/issues/15603), submit it first to [homebrew/core](https://github.com/Homebrew/homebrew-core) as a formula that builds from source. If it is rejected, you may then try again as a cask (link to the issue from your pull request so we can see the discussion and reasoning for rejection).
* App is open-source and has a GUI but no compiled versions (or only old ones) are provided. It’s better to have them in [homebrew/core](https://github.com/Homebrew/homebrew-core) so users don’t get perpetually outdated versions. See [`gedit`](https://github.com/Homebrew/homebrew-cask/pull/23360) for example.
diff --git a/docs/Brew-Bundle-and-Brewfile.md b/docs/Brew-Bundle-and-Brewfile.md
index 27c7ead3fd..27894a7bcb 100644
--- a/docs/Brew-Bundle-and-Brewfile.md
+++ b/docs/Brew-Bundle-and-Brewfile.md
@@ -10,7 +10,7 @@ It uses `Brewfile`s to provide a declarative interface for installing/upgrading
Rather than specifying the `brew` commands you wish to run, you can specify the state you wish to reach.
-See also the [`brew bundle` section of `man brew`](https://docs.brew.sh/Manpage#bundle-subcommand) or `brew bundle --help`.
+See also the [`brew bundle` section of `man brew`](Manpage.md#bundle-subcommand) or `brew bundle --help`.
## Basic Usage
diff --git a/docs/Brew-Livecheck.md b/docs/Brew-Livecheck.md
index e186436ae4..3b4b0d535f 100644
--- a/docs/Brew-Livecheck.md
+++ b/docs/Brew-Livecheck.md
@@ -1,23 +1,26 @@
---
-last_review_date: "1970-01-01"
+last_review_date: 2025-05-28
---
# `brew livecheck`
The `brew livecheck` command finds the newest version of a formula or cask's software by checking upstream. Livecheck has [strategies](https://rubydoc.brew.sh/Homebrew/Livecheck/Strategy) to identify versions from various sources, such as Git repositories, websites, etc.
-## Behavior
+## Behaviour
When livecheck isn't given instructions for how to check for upstream versions, it does the following by default:
-1. For formulae: Collect the `stable`, `head`, and `homepage` URLs, in that order (resources simply use their `url`). For casks: Collect the `url` and `homepage` URLs, in that order.
+1. Collect a list of URLs to check.
+ * For formulae: use their `stable`, `head`, and `homepage` URLs, in that order.
+ * For formula resources: use their `url`.
+ * For casks: use their `url` and `homepage` URLs, in that order.
1. Determine if any strategies apply to the first URL. If not, try the next URL.
1. If a strategy can be applied, use it to check for new versions.
1. Return the newest version (or an error if versions could not be found at any available URLs).
-It's sometimes necessary to override this default behavior to create a working check. If a source doesn't provide the newest version, we need to check a different one. If livecheck doesn't correctly match version text, we need to provide an appropriate regex or `strategy` block.
+It's sometimes necessary to override this default behaviour to create a working check. If a source doesn't provide the newest version, we need to check a different one. If livecheck doesn't correctly match version text, we need to provide an appropriate regex or `strategy` block.
-This can be accomplished by adding a `livecheck` block to the formula/cask/resource. For more information on the available methods, please refer to the [`Livecheck` class documentation](https://rubydoc.brew.sh/Livecheck).
+This can be accomplished by adding a `livecheck` block to the formula/cask/resource. For more information on the available methods, please refer to the [`Livecheck` class](https://rubydoc.brew.sh/Livecheck) documentation.
## Creating a check
@@ -47,9 +50,9 @@ The `livecheck` block regex restricts matches to a subset of the fetched content
* **Regexes should be made case insensitive, whenever possible**, by adding `i` at the end (e.g. `/.../i` or `%r{...}i`). This improves reliability, as the regex will handle changes in letter case without needing modifications.
-* **Regexes should only use a capturing group around the version text**. For example, in `/href=.*?example-v?(\d+(?:\.\d+)+)(?:-src)?\.t/i`, we're only using a capturing group around the version test (matching a version like `1.2`, `1.2.3`, etc.) and we're using non-capturing groups elsewhere (e.g. `(?:-src)?`).
+* **Regexes should only use a capturing group around the version text**. For example, in `/href=.*?example-v?(\d+(?:\.\d+)+)(?:-src)?\.t/i`, we're only using a capturing group around the version text (matching a version like `1.2`, `1.2.3`, etc.) and we're using non-capturing groups elsewhere (e.g. `(?:-src)?`).
-* **Anchor the start/end of the regex, to restrict the scope**. For example, on HTML pages we often match file names or version directories in `href` attribute URLs (e.g. `/href=.*?example[._-]v?(\d+(?:\.\d+)+)\.zip/i`). The general idea is that limiting scope will help exclude unwanted matches.
+* **Anchor the start/end of the regex to restrict its scope**. For example, on HTML pages we often match file names or version directories in `href` attribute URLs (e.g. `/href=.*?example[._-]v?(\d+(?:\.\d+)+)\.zip/i`). The general idea is that limiting scope will help exclude unwanted matches.
* **Avoid generic catchalls like `.*` or `.+`** in favor of something non-greedy and/or contextually appropriate. For example, to match characters within the bounds of an HTML attribute, use `[^"' >]+?`.
@@ -112,9 +115,17 @@ end
The referenced formula/cask should be in the same tap, as a reference to a formula/cask from another tap will generate an error if the user doesn't already have it tapped.
+A formula resource whose version stays in sync with its parent formula versioning can use the same check with `formula :parent`.
+
+```ruby
+livecheck do
+ formula :parent
+end
+```
+
### `POST` requests
-Some checks require making a `POST` request and that can be accomplished by adding a `post_form` or `post_json` option to a `livecheck` block `url`.
+Some checks require making a `POST` request, which can be accomplished by adding a `post_form` or `post_json` option to a `livecheck` block `url`.
```ruby
livecheck do
@@ -126,7 +137,7 @@ livecheck do
end
```
-`post_form` is used for form data and `post_json` is used for JSON data. livecheck will encode the provided hash value to the appropriate format before making the request.
+`post_form` is used for form data and `post_json` is used for JSON data. Livecheck will encode the provided hash value to the appropriate format before making the request.
`POST` support only applies to strategies that use `Strategy::page_headers` or `::page_content` (directly or indirectly), so it does not apply to `ExtractPlist`, `Git`, `GithubLatest`, `GithubReleases`, etc.
@@ -219,7 +230,7 @@ end
A `strategy` block for `GithubLatest` receives the parsed JSON data from the GitHub API for a repository's "latest" release, along with a regex. When a regex is not provided in a `livecheck` block, the strategy's default regex is passed into the `strategy` block instead.
-By default, the strategy matches version text in the release's tag or title but a `strategy` block can be used to check any of the fields in the release JSON. The logic in the following `strategy` block is similar to the default behavior but only checks the release tag instead, for the sake of demonstration:
+By default, the strategy matches version text in the release's tag or title but a `strategy` block can be used to check any of the fields in the release JSON. The logic in the following `strategy` block is similar to the default behaviour but only checks the release tag instead, for the sake of demonstration:
```ruby
livecheck do
@@ -240,7 +251,7 @@ You can find more information on the response JSON from this API endpoint in the
A `strategy` block for `GithubReleases` receives the parsed JSON data from the GitHub API for a repository's most recent releases, along with a regex. When a regex is not provided in a `livecheck` block, the strategy's default regex is passed into the `strategy` block instead.
-By default, the strategy matches version text in each release's tag or title but a `strategy` block can be used to check any of the fields in the release JSON. The logic in the following `strategy` block is similar to the default behavior but only checks the release tag instead, for the sake of demonstration:
+By default, the strategy matches version text in each release's tag or title but a `strategy` block can be used to check any of the fields in the release JSON. The logic in the following `strategy` block is similar to the default behaviour but only checks the release tag instead, for the sake of demonstration:
```ruby
livecheck do
@@ -343,7 +354,7 @@ A `strategy` block for `Sparkle` receives an `item` which has methods for the `v
brew find-appcast '/path/to/application.app'
```
-The default pattern for the `Sparkle` strategy is to generate `"#{item.short_version},#{item.version}"` from `sparkle:shortVersionString` and `sparkle:version` if both are set. In the example below, the `url` also includes a download ID which is needed:
+The default pattern for the `Sparkle` strategy is to generate `"#{item.short_version},#{item.version}"` from `sparkle:shortVersionString` and `sparkle:version` if both are set. In the example below, the returned value also includes a needed download ID from the `url`:
```ruby
livecheck do
@@ -363,6 +374,17 @@ livecheck do
end
```
+If the value returned by `item` is not the most recent or not what's desired, passing `items` instead will allow iterating over all the items in the feed:
+
+```ruby
+livecheck do
+ url "https://www.example.com/example.xml"
+ strategy :sparkle do |items|
+ items.find { |item| item.channel.nil? }&.short_version
+ end
+end
+```
+
#### `Xml` `strategy` block
A `strategy` block for `Xml` receives an `REXML::Document` object and, if provided, a regex. For example, if the XML contains a `versions` element with nested `version` elements and their inner text contains the version string, we could extract it using a regex as follows:
@@ -416,6 +438,18 @@ livecheck do
end
```
+### `throttle`
+
+For software with extremely frequent releases that don't all need to be published as formula/cask updates, livecheck can be set to reduce how many versions it surfaces by using `throttle`. In this example, only versions whose last component is divisible by 10 will be returned.
+
+```ruby
+livecheck do
+ url :stable
+ regex(/^v?(\d+(?:\.\d+)+)$/i)
+ throttle 10
+end
+```
+
### `skip`
Livecheck automatically skips some formulae/casks for a number of reasons (deprecated, disabled, etc.). However, on rare occasions we need to use a `livecheck` block to do a manual skip. The `skip` method takes a string containing a very brief reason for skipping.
diff --git a/docs/Cask-Cookbook.md b/docs/Cask-Cookbook.md
index e9ac3597ad..7d750b8ac4 100644
--- a/docs/Cask-Cookbook.md
+++ b/docs/Cask-Cookbook.md
@@ -1,5 +1,5 @@
---
-last_review_date: "1970-01-01"
+last_review_date: 2025-05-18
---
# Cask Cookbook
@@ -33,7 +33,7 @@ Exception: `do` blocks such as `postflight` may enclose a block of pure Ruby cod
## Header line details
-The Cask name ([``](#token-reference)) on the header line `cask do` should match the cask filename, without the `.rb` extension, enclosed in double quotes.
+The cask name ([``](#token-reference)) on the header line `cask do` should match the cask filename, without the `.rb` extension, enclosed in double quotes.
There are currently some arbitrary limitations on cask tokens which are in the process of being removed. GitHub Actions will catch any errors during the transition.
@@ -41,6 +41,9 @@ There are currently some arbitrary limitations on cask tokens which are in the p
Having a common order for stanzas makes casks easier to update and parse. Below is the complete stanza sequence (no cask will have all stanzas). The empty lines shown here are also important, as they help to visually delimit information.
+ arch
+ os
+
version
sha256
@@ -109,21 +112,21 @@ Note that every stanza that has additional parameters (`:symbols` after a `,`) s
Each of the following stanzas is required for every cask.
-| name | multiple occurrences allowed? | value |
-| ---------------------------- | :---------------------------: | ----- |
-| [`version`](#stanza-version) | no | Application version. |
-| [`sha256`](#stanza-sha256) | no | SHA-256 checksum of the file downloaded from `url`, calculated by the command `shasum -a 256 `. Can be suppressed by using the special value `:no_check`. |
-| [`url`](#stanza-url) | no | URL to the `.dmg`/`.zip`/`.tgz`/`.tbz2` file that contains the application. A [comment](#when-url-and-homepage-domains-differ-add-verified) should be added if the domains in the `url` and `homepage` stanzas differ. Block syntax should be used for URLs that change on every visit. |
-| [`name`](#stanza-name) | yes | String providing the full and proper name defined by the vendor. |
-| [`desc`](#stanza-desc) | no | One-line description of the cask. Shown when running `brew info`. |
-| `homepage` | no | Application homepage; used for the `brew home` command. |
-| [`livecheck`](#stanza-livecheck) | no | Ruby block describing how to find updates for this cask. Supersedes `appcast`. |
-| [`depends_on`](#stanza-depends_on) | yes | List of dependencies and requirements for this cask. |
-| [`zap`](#stanza-zap) | yes | Additional procedures for a more complete uninstall, including user files and shared resources. |
+| name | multiple occurrences allowed? | value |
+| ---------------------------------- | :---------------------------: | ----- |
+| [`version`](#stanza-version) | no | Application version, or the special value `:latest`. |
+| [`sha256`](#stanza-sha256) | no | SHA-256 checksum of the file downloaded from `url` as calculated by the command `shasum -a 256 `, or the special value `:no_check`. |
+| [`url`](#stanza-url) | no | URL to the `.dmg`/`.zip`/`.tgz`/`.tbz2` file that contains the application. A [comment](#when-url-and-homepage-domains-differ-add-verified) should be added if the domains in the `url` and `homepage` stanzas differ. |
+| [`name`](#stanza-name) | yes | String providing the full and proper name defined by the vendor. |
+| [`desc`](#stanza-desc) | no | One-line description of the cask. Shown when running `brew info`. |
+| `homepage` | no | Application homepage; used for the `brew home` command. |
+| [`livecheck`](#stanza-livecheck) | no | Ruby block describing how to find updates for this cask. Supersedes `appcast`. |
+| [`depends_on`](#stanza-depends_on) | yes | List of dependencies and requirements for this cask. |
+| [`zap`](#stanza-zap) | yes | Additional procedures for a more complete uninstall, including user files and shared resources. |
### At least one artifact stanza is also required
-Each cask must declare one or more *artifacts* (i.e. something to install).
+Each cask must declare one or more [artifacts](https://rubydoc.brew.sh/Cask/Artifact) (i.e. something to install).
| name | multiple occurrences allowed? | value |
| -------------------------------- | :---------------------------: | ----- |
@@ -157,11 +160,11 @@ Each cask must declare one or more *artifacts* (i.e. something to install).
| name | multiple occurrences allowed? | value |
| ------------------------------------------ | :---------------------------: | ----- |
-| [`uninstall`](#stanza-uninstall) | yes | Procedures to uninstall a cask. Optional unless the `pkg` stanza is used. |
-| [`conflicts_with`](#stanza-conflicts_with) | yes | List of conflicts with this cask (*not yet functional*). |
+| [`uninstall`](#stanza-uninstall) | yes | Procedures to uninstall a cask. Optional unless a `pkg` or `installer` artifact stanza is used. |
+| [`conflicts_with`](#stanza-conflicts_with) | yes | List of conflicts with this cask. |
| [`caveats`](#stanza-caveats) | yes | String or Ruby block providing the user with cask-specific information at install time. |
-| [`deprecate!`](#stanza-deprecate--disable) | no | Date as a String in `YYYY-MM-DD` format and a String or Symbol providing a reason. |
-| [`disable!`](#stanza-deprecate--disable) | no | Date as a String in `YYYY-MM-DD` format and a String or Symbol providing a reason. |
+| [`deprecate!`](#stanza-deprecate--disable) | no | Date as a string in `YYYY-MM-DD` format and a string or symbol providing a reason. |
+| [`disable!`](#stanza-deprecate--disable) | no | Date as a string in `YYYY-MM-DD` format and a string or symbol providing a reason. |
| `preflight` | yes | Ruby block containing preflight install operations (needed only in very rare cases). |
| [`postflight`](#stanza-flight) | yes | Ruby block containing postflight install operations. |
| `uninstall_preflight` | yes | Ruby block containing preflight uninstall operations (needed only in very rare cases). |
@@ -250,7 +253,7 @@ Behaviour and usage of `target:` is [the same as with `app`](#renaming-the-targe
Sometimes there are particularities with the installation of a piece of software that cannot or should not be handled programmatically by Homebrew Cask. In those instances, `caveats` is the way to inform the user. Information in `caveats` is displayed when a cask is invoked with either `install` or `info`.
-To avoid flooding users with too many messages (thus desensitising them to the important ones), `caveats` should be used sparingly and exclusively for installation-related matters. If you’re not sure a `caveat` you find pertinent is installation-related or not, ask a maintainer. As a general rule, if your case isn’t already covered in our comprehensive [`caveats Mini-DSL`](#caveats-mini-dsl), it’s unlikely to be accepted.
+To avoid flooding users with too many messages (thus desensitising them to the important ones), `caveats` should be used sparingly and exclusively for installation-related matters. If you’re not sure whether a `caveat` you find pertinent is installation-related or not, ask a maintainer. As a general rule, if your case isn’t already covered in our comprehensive [`caveats mini-DSL`](#caveats-mini-dsl), it’s unlikely to be accepted.
#### `caveats` as a string
@@ -302,52 +305,15 @@ caveats do
end
```
-### Stanza: `deprecate!` / `disable!`
-
-`deprecate!` and `disable!` are used to declare that a cask is no longer functional or supported.
-Casks that contain a `deprecate!` stanza can still be installed, but will print a warning message when they are installed or upgraded.
-Casks that contain a `disable!` stanza cannot be installed or upgraded and will print an error message.
-
-The syntax for both stanzas is the same:
-
-```ruby
-deprecate! date: "YYYY-MM-DD", because: "is ..."
-disable! date: "YYYY-MM-DD", because: "is ..."
-
-# Or with a preset reason (see the `because:` argument section below)
-deprecate! date: "YYYY-MM-DD", because: :discontinued
-disable! date: "YYYY-MM-DD", because: :discontinued
-```
-
-#### `date:` argument
-
-The `date:` argument controls when the deprecation or disabling will take effect.
-Casks that have a `deprecate!` stanza with a date in the future will not be treated as being deprecated until that date.
-Casks that have a `disable!` stanza with a date in the future will be automatically deprecated until that date, at which point they will be disabled.
-
-#### `because:` argument
-
-The `because:` argument accepts a reason for the cask being deprecated or disabled.
-The info message will be ` is deprecated because it !`, so format the reason to fit that sentence.
-For example, `because: "is broken"` will result in ` is deprecated because it is broken!`.
-
-The `because:` argument can also accept a symbol that corresponds to a preset reason, for example:
-
-```ruby
-deprecate! date: "YYYY-MM-DD", because: :discontinued
-```
-
-A complete list of allowable symbols can be found in the [`DeprecateDisable` module](https://github.com/Homebrew/brew/blob/master/Library/Homebrew/deprecate_disable.rb).
-
### Stanza: `conflicts_with`
-`conflicts_with` is used to declare conflicts that keep a cask from installing or working correctly.
+`conflicts_with` is used to declare conflicts that prevent a cask from installing or working correctly.
#### `conflicts_with` *cask*
The value should be another cask token.
-Example: the [macFUSE](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/m/macfuse.rb#L17) cask, which conflicts with `macfuse-dev`.
+Example: [macFUSE](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/m/macfuse.rb#L17), which conflicts with `macfuse-dev`.
```ruby
conflicts_with cask: "macfuse-dev"
@@ -369,9 +335,17 @@ conflicts_with formula: "macvim"
`depends_on` is used to declare dependencies and requirements for a cask. `depends_on` is not consulted until `install` is attempted.
+| key | description |
+| ---------- | ----------- |
+| `cask:` | required Homebrew cask tokens as string or array |
+| `formula:` | required Homebrew formula names as string or array |
+| `macos:` | macOS release requirements as symbol, array or string comparison expression |
+| `arch:` | hardware requirements as symbol or array |
+| `java:` | *stub - not yet functional* |
+
#### `depends_on` *cask*
-The value should be another cask token, needed by the current cask.
+The value should be one or more tokens of casks needed by the current cask, as a string or array of strings.
Example: [NTFSTool](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/n/ntfstool.rb#L11), which depends on macFUSE.
@@ -381,7 +355,7 @@ depends_on cask: "macfuse"
#### `depends_on` *formula*
-The value should name a Homebrew formula needed by the cask.
+The value should be one or more names of formulae needed by the current cask, as a string or array of strings.
Example: some distributions are contained in archive formats such as `7z` which are not supported by stock Apple tools. For these cases, a more capable archive reader may be pulled in at install time by declaring a dependency on the `unar` formula:
@@ -393,7 +367,7 @@ depends_on formula: "unar"
##### Requiring an exact macOS release
-The value for `depends_on macos:` may be a symbol or an array of symbols, listing the exact compatible macOS releases. The available values for macOS releases are defined in the [MacOSVersion class](https://rubydoc.brew.sh/MacOSVersion.html).
+The value for `depends_on macos:` may be a symbol or an array of symbols, listing the exact compatible macOS releases. The values for supported macOS releases can be found in the [`MacOSVersion` class](https://rubydoc.brew.sh/MacOSVersion) documentation.
Only major releases are covered (10.x numbers containing a single dot or whole numbers since macOS 11). The symbol form is used for readability. The following are all valid ways to enumerate the exact macOS release requirements for a cask:
@@ -407,7 +381,7 @@ depends_on macos: [
##### Setting a minimum macOS release
-`depends_on macos:` can also accept a string starting with a comparison operator such as `>=`, followed by an macOS release in the form above. The following is a valid expression meaning “at least macOS Big Sur (11.0)”:
+`depends_on macos:` can also accept a string starting with a comparison operator such as `>=`, followed by a macOS release in the form above. The following is a valid expression meaning “at least macOS Big Sur (11.0)”:
```ruby
depends_on macos: ">= :big_sur"
@@ -417,12 +391,12 @@ A comparison expression cannot be combined with any other form of `depends_on ma
#### `depends_on` *arch*
-The value for `depends_on arch:` may be a symbol or an array of symbols, listing the hardware compatibility requirements for a cask. The requirement is satisfied at install time if any one of multiple `arch:` values matches the user’s hardware.
+The value for `depends_on arch:` may be a symbol or an array of symbols, listing the hardware compatibility requirements for a cask. The requirement is satisfied at install time if any one of the provided `arch:` values matches the user’s hardware.
The available symbols for hardware are:
-| symbol | meaning |
-| ---------- | -------------- |
+| symbol | meaning |
+| ---------- | ------- |
| `:arm64` | Apple Silicon |
| `:x86_64` | 64-bit Intel |
| `:intel` | 64-bit Intel |
@@ -436,19 +410,52 @@ depends_on arch: :x86_64 # same meaning as above
depends_on arch: [:x86_64] # same meaning as above
```
-#### `depends_on` parameters
+### Stanza: `deprecate!` / `disable!`
-| key | description |
-| ---------- | ----------- |
-| `formula:` | Homebrew formula |
-| `cask:` | cask token |
-| `macos:` | symbol, array, or string comparison expression defining macOS release requirements |
-| `arch:` | symbol or array defining hardware requirements |
-| `java:` | *stub - not yet functional* |
+`deprecate!` and `disable!` are used to declare that a cask is no longer functional or supported.
+Casks that contain a `deprecate!` stanza can still be installed, but will print a warning message when they are installed or upgraded.
+Casks that contain a `disable!` stanza cannot be installed or upgraded and will print an error message.
+
+The syntax for both stanzas is the same:
+
+```ruby
+deprecate! date: "YYYY-MM-DD", because: "is ..."
+disable! date: "YYYY-MM-DD", because: "is ..."
+
+# Or with a preset reason and suggested replacement (see the parameter sections below)
+deprecate! date: "YYYY-MM-DD", because: :discontinued, replacement_formula: "another"
+disable! date: "YYYY-MM-DD", because: :unmaintained, replacement_cask: "alternative"
+```
+
+#### `date:` parameter
+
+The `date:` parameter controls when the deprecation or disabling will take effect.
+Casks that have a `deprecate!` stanza with a date in the future will not be treated as being deprecated until that date.
+Casks that have a `disable!` stanza with a date in the future will be automatically deprecated until that date, at which point they will become disabled.
+
+#### `because:` parameter
+
+The `because:` parameter accepts a reason for the cask being deprecated or disabled.
+The info message will be ` is deprecated because it !`, so format the reason to fit that sentence.
+For example, `because: "is broken"` will result in ` is deprecated because it is broken!`.
+
+The `because:` parameter can also accept a symbol that corresponds to a preset reason, for example:
+
+```ruby
+deprecate! date: "YYYY-MM-DD", because: :discontinued
+```
+
+A complete list of allowable symbols can be found in the [`DeprecateDisable` module](https://rubydoc.brew.sh/DeprecateDisable) documentation.
+
+#### `replacement_formula:` / `replacement_cask:` parameter
+
+The `replacement_formula:` and `replacement_cask:` parameters accept a string for suggesting a replacement formula or cask to the user.
+
+Refer to [Deprecating, Disabling and Removing Casks](Deprecating-Disabling-and-Removing-Casks.md) for more information about the deprecation process for casks.
### Stanza: `desc`
-`desc` accepts a single-line UTF-8 string containing a short description of the software. It’s used to help with searchability and disambiguation, thus it must concisely describe what the software does (or what you can accomplish with it).
+`desc` accepts a single-line UTF-8 string containing a short description of the software. As it’s used to help with searchability and disambiguation, it must concisely describe what the software does (or what you can accomplish with it).
`desc` is not for app slogans! Vendors’ descriptions tend to be filled with generic adjectives such as “modern” and “lightweight”. Those are meaningless marketing fluff (do you ever see apps proudly describing themselves as outdated and bulky?) which must be deleted. It’s fine to use the information on the software’s website as a starting point, but it will require editing in almost all cases.
@@ -475,7 +482,7 @@ depends_on arch: [:x86_64] # same meaning as above
+ desc "Sound and music editor"
```
-* **Do not** include the platform. Casks only work on macOS, so this is redundant information.
+* **Do not** include the platform. Casks always work on macOS, so this is redundant information.
```diff
- desc "Sound and music editor for macOS"
@@ -529,7 +536,7 @@ The following methods may be called to perform standard tasks:
| `set_ownership(paths)` | `preflight`, `postflight`, `uninstall_preflight` | Set user and group ownership of `paths`. (Example: [docker-toolbox.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/d/docker-toolbox.rb#L42)) |
| `set_permissions(paths, permissions_str)` | `preflight`, `postflight`, `uninstall_preflight` | Set permissions in `paths` to `permissions_str`. (Example: [ngrok.rb](https://github.com/Homebrew/homebrew-cask/blob/41d91ff669d85343175202adf568e2328486205f/Casks/n/ngrok.rb#L30)) |
-`set_ownership(paths)` defaults user ownership to the current user and group ownership to `staff`. These can be changed by passing in extra options: `set_ownership(paths, user: "user", group: "group")`. (Example: [hummingbird.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/h/hummingbird.rb#L24))
+`set_ownership(paths)` defaults to setting user and group ownership to the current user and `staff`. These can be changed by passing in extra options: `set_ownership(paths, user: "user", group: "group")`. (Example: [hummingbird.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/h/hummingbird.rb#L24))
### Stanza: `installer`
@@ -539,7 +546,7 @@ The `installer` stanza takes a series of key-value pairs, the first key of which
#### `installer` *manual*
-`installer manual:` takes a single string value, describing a GUI installer which must be run by the user at a later time. The path may be absolute, or relative to the cask. Example (from [rubymotion.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/r/rubymotion.rb#L15)):
+`installer manual:` takes a single string value for the path to an interactive installer which must be run by the user at a later time. The path may be absolute, or relative to the cask. Example (from [rubymotion.rb](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/r/rubymotion.rb#L15)):
```ruby
installer manual: "RubyMotion Installer.app"
@@ -547,7 +554,7 @@ installer manual: "RubyMotion Installer.app"
#### `installer` *script*
-`installer script:` introduces a series of key-value pairs describing a command which will automate completion of the install. **It should never be used for interactive installations.** The form is similar to [`uninstall script:`](#uninstall-script):
+`installer script:` takes a series of key-value pairs describing a command which will automate completion of the install. **It should never be used for interactive installations.** The form is similar to [`uninstall script:`](#uninstall-script):
| key | value |
| --------------- | ----- |
@@ -555,6 +562,8 @@ installer manual: "RubyMotion Installer.app"
| `args:` | array of arguments to the install script |
| `input:` | array of lines of input to be sent to `stdin` of the script |
| `must_succeed:` | set to `false` if the script is allowed to fail |
+| `print_stderr:` | set to `false` to suppress `stderr` output |
+| `print_stdout:` | set to `false` to suppress `stdout` output |
| `sudo:` | set to `true` if the script needs *sudo* |
The path may be absolute, or relative to the cask. Example (from [miniforge.rb](https://github.com/Homebrew/homebrew-cask/blob/864f623e2cd17dbde5987a7b3923fdb0b4ac9ee5/Casks/m/miniforge.rb#L23-L26)):
@@ -566,7 +575,7 @@ installer script: {
}
```
-If the `installer script:` does not require any of the key-values it can point directly to the path of the install script:
+If the `installer script:` does not require any of the key-value pairs, it can be given just the path to the install script:
```ruby
installer script: "#{staged_path}/install.sh"
@@ -630,7 +639,7 @@ The `livecheck` stanza is used to automatically fetch the latest version of a ca
Every `livecheck` block must contain a `url`, which can be either a string or a symbol pointing to other URLs in the cask (`:url` or `:homepage`).
-Refer to the [`brew livecheck` documentation](Brew-Livecheck.md) for how to write a `livecheck` block.
+Refer to the [`brew livecheck`](Brew-Livecheck.md) documentation for how to write a `livecheck` block.
### Stanza: `name`
@@ -652,7 +661,7 @@ The first argument to the `pkg` stanza should be a relative path to the `.pkg` f
pkg "Unity.pkg"
```
-Subsequent arguments to `pkg` are key/value pairs which modify the install process. Currently supported keys are `allow_untrusted:` and `choices:`.
+Subsequent arguments to `pkg` are key-value pairs which modify the install process. Currently supported keys are `allow_untrusted:` and `choices:`.
#### `pkg` *allow_untrusted*
@@ -723,9 +732,9 @@ shasum --algorithm 256
#### Special value `:no_check`
-The special value `sha256 :no_check` is used to turn off SHA checking whenever checksumming is impractical due to the upstream configuration.
+The special value `sha256 :no_check` is used to turn off SHA checking whenever checksumming is impractical due to the upstream configuration, e.g. when `url` does not change between releases.
-`version :latest` requires `sha256 :no_check`, and this pairing is common. However, `sha256 :no_check` does not require `version :latest`.
+`sha256 :no_check` is required by [`version :latest`](#special-value-latest), and this pairing is common. However, `sha256 :no_check` does not require `version :latest`.
We use a checksum whenever possible.
@@ -745,46 +754,41 @@ The value of `suite` is never an `.app` bundle, but a plain directory.
> If you cannot design a working `uninstall` stanza, please submit your cask anyway. The maintainers can help you write an `uninstall` stanza, just ask!
-#### `uninstall pkgutil:` is the easiest and most useful
+#### `uninstall` is required for casks that install using `pkg` or `installer`
-The easiest and most useful `uninstall` directive is [`pkgutil:`](#uninstall-pkgutil). It should cover most use cases.
+For most casks, uninstall actions are determined automatically, and an explicit `uninstall` stanza is not needed. However, a cask which uses the [`pkg`](#stanza-pkg) or [`installer`](#stanza-installer) stanzas will **not** know how to uninstall correctly unless an `uninstall` stanza is given.
-#### `uninstall` is required for casks that install using `pkg` or `installer manual:`
+So, while the [cask DSL](#required-stanzas) does not enforce the requirement, it is much better for users if every `pkg` and `installer` has a corresponding `uninstall`.
-For most casks, uninstall actions are determined automatically, and an explicit `uninstall` stanza is not needed. However, a cask which uses the `pkg` or `installer manual:` stanzas will **not** know how to uninstall correctly unless an `uninstall` stanza is given.
-
-So, while the [cask DSL](#required-stanzas) does not enforce the requirement, it is much better for users if every `pkg` and `installer manual:` has a corresponding `uninstall`.
-
-The `uninstall` stanza is available for non-`pkg` casks, and is useful for a few corner cases. However, the documentation below concerns the typical case of using `uninstall` to define procedures for a `pkg`.
+The `uninstall` stanza is available for other artifact types, and is useful for a few corner cases. However, the documentation below concerns the typical case of using `uninstall` to define procedures for a `pkg`.
#### There are multiple uninstall techniques
-Since `pkg` installers can do arbitrary things, different techniques are needed to uninstall in each case. You may need to specify one, or several, of the following key/value pairs as arguments to `uninstall`.
+Since `pkg` installers can do arbitrary things, different techniques are needed to uninstall in each case. You may need to specify one, or several, of the following key-value pairs as arguments to `uninstall`.
+
+##### `uninstall pkgutil:` is the easiest and most useful
+
+The easiest and most useful `uninstall` directive is [`pkgutil:`](#uninstall-pkgutil). It should cover most use cases.
#### Summary of keys
* **`early_script:`** (string or hash) - like [`script:`](#uninstall-script), but runs early (for special cases, best avoided)
* [`launchctl:`](#uninstall-launchctl) (string or array) - IDs of `launchd` jobs to remove
* [`quit:`](#uninstall-quit) (string or array) - bundle IDs of running applications to quit (does not run when uninstall is initiated by `brew upgrade` or `brew reinstall`)
-* [`signal:`](#uninstall-signal) (array of arrays) - signal numbers and bundle IDs of running applications to send a Unix signal to - for when `quit:` does not work (does not run when uninstall is initiated by `brew upgrade` or `brew reinstall`)
+* [`signal:`](#uninstall-signal) (array of arrays) - signal numbers and bundle IDs of running applications to send a Unix signal to, for when `quit:` does not work (does not run when uninstall is initiated by `brew upgrade` or `brew reinstall`)
* [`login_item:`](#uninstall-login_item) (string or array) - names of login items to remove
* [`kext:`](#uninstall-kext) (string or array) - bundle IDs of kexts to unload from the system
-* [`script:`](#uninstall-script) (string or hash) - relative path to an uninstall script to be run via sudo; use hash if args are needed
- * `executable:` - relative path to an uninstall script to be run via sudo (required for hash form)
- * `args:` - array of arguments to the uninstall script
- * `input:` - array of lines of input to be sent to `stdin` of the script
- * `must_succeed:` - set to `false` if the script is allowed to fail
- * `sudo:` - set to `true` if the script needs *sudo*
+* [`script:`](#uninstall-script) (string or hash) - relative path to an uninstall script to be run via *sudo*; use hash if args are needed
* [`pkgutil:`](#uninstall-pkgutil) (string, regexp or array of strings and regexps) - strings or regexps matching bundle IDs of packages to uninstall using `pkgutil`
* [`delete:`](#uninstall-delete) (string or array) - double-quoted, absolute paths of files or directory trees to remove. Should only be used as a last resort; `pkgutil:` is strongly preferred.
-* **`rmdir:`** (string or array) - double-quoted, absolute paths of directories to remove if empty. Works recursively.
+* **`rmdir:`** (string or array) - double-quoted, absolute paths of directories to remove if empty; works recursively
* [`trash:`](#uninstall-trash) (string or array) - double-quoted, absolute paths of files or directory trees to move to Trash
Each `uninstall` technique is applied according to the order above. The order in which `uninstall` keys appear in the cask file is ignored.
-For assistance filling in the right values for `uninstall` keys, there are several helper scripts found under `developer/bin` in the Homebrew Cask repository. Each of these scripts responds to the `-help` option with additional documentation.
+For assistance filling in the right values for `uninstall` keys, there are several [helper scripts found under `developer/bin`](https://github.com/Homebrew/homebrew-cask/tree/HEAD/developer/bin) in the Homebrew Cask repository. Each of these scripts responds to the `-help` option with additional documentation.
-Working out an `uninstall` stanza is easiest when done on a system where the package is currently installed and operational. To operate on an uninstalled `.pkg` file, see [Working With a `.pkg` File Manually](#working-with-a-pkg-file-manually), below.
+Working out an `uninstall` stanza is easiest when done on a system where the package is currently installed and operational. To operate on an uninstalled `.pkg` file, see [Working with a `.pkg` file manually](#working-with-a-pkg-file-manually), below.
#### `uninstall` *pkgutil*
@@ -796,7 +800,7 @@ IDs for the most recently installed packages can be listed using [`list_recent_p
"$(brew --repository homebrew/cask)/developer/bin/list_recent_pkg_ids"
```
-`pkgutil:` also accepts a regular expression match against multiple package IDs. The regular expressions are somewhat nonstandard. To test a `pkgutil:` regular expression against currently installed packages, use [`list_pkg_ids_by_regexp`](https://github.com/Homebrew/homebrew-cask/blob/HEAD/developer/bin/list_pkg_ids_by_regexp):
+`pkgutil:` also accepts a regular expression to match against multiple package IDs. The regular expressions are somewhat nonstandard. To test a `pkgutil:` regular expression against currently installed packages, use [`list_pkg_ids_by_regexp`](https://github.com/Homebrew/homebrew-cask/blob/HEAD/developer/bin/list_pkg_ids_by_regexp):
```bash
"$(brew --repository homebrew/cask)/developer/bin/list_pkg_ids_by_regexp"
@@ -844,7 +848,7 @@ Bundle IDs inside an application bundle on disk can be listed using [`list_ids_i
`signal:` should only be needed in the rare case that a process does not respond to `quit:`.
-Bundle IDs for `signal:` targets may be obtained in the same way as for `quit:`. The value for `signal:` is an array-of-arrays, with each cell containing two elements: the desired Unix signal followed by the corresponding bundle ID.
+Bundle IDs for `signal:` targets may be obtained in the same way as for `quit:`. The value for `signal:` is an array of arrays, with each cell containing two elements: the desired Unix signal followed by the corresponding bundle ID.
The Unix signal may be given in numeric or string form (see the `kill`(1) man page for more details).
@@ -866,7 +870,7 @@ uninstall signal: [
Note that when multiple running processes match the given bundle ID, all matching processes will be signaled.
-Unlike `quit:` directives, Unix signals originate from the current user, not from the superuser. This is construed as a safety feature, since the superuser is capable of bringing down the system via signals. However, this inconsistency may also be considered a bug, and should be addressed in some fashion in a future version.
+Unlike `quit:` directives, Unix signals originate from the current user, not from the superuser. This is construed as a safety feature, since the superuser is capable of bringing down the system via signals. However, this inconsistency could also be considered a bug, and may be addressed in some fashion in a future version.
#### `uninstall` *login_item*
@@ -894,7 +898,19 @@ IDs inside a kext bundle on disk can be listed using [`list_id_in_kext`](https:/
#### `uninstall` *script*
-`uninstall script:` introduces a series of key-value pairs describing a command which will automate completion of the uninstall. Example (from [virtualbox.rb](https://github.com/Homebrew/homebrew-cask/blob/ef9931087f6e101262bf64119166e2d9cec068f0/Casks/v/virtualbox.rb#L55-L61)):
+`uninstall script:` introduces a series of key-value pairs describing a command which will automate completion of the uninstall. The form is similar to [`installer script:`](#installer-script):
+
+| key | value |
+| --------------- | ----- |
+| `executable:` | path to an uninstall script to be run |
+| `args:` | array of arguments to the uninstall script |
+| `input:` | array of lines of input to be sent to `stdin` of the script |
+| `must_succeed:` | set to `false` if the script is allowed to fail |
+| `print_stderr:` | set to `false` to suppress `stderr` output |
+| `print_stdout:` | set to `false` to suppress `stdout` output |
+| `sudo:` | set to `true` if the script needs *sudo* |
+
+The path may be absolute, or relative to the cask. Example (from [virtualbox.rb](https://github.com/Homebrew/homebrew-cask/blob/ef9931087f6e101262bf64119166e2d9cec068f0/Casks/v/virtualbox.rb#L55-L61)):
```ruby
uninstall script: {
@@ -950,7 +966,7 @@ A fully manual method for finding bundle IDs in a package file follows:
1. Unpack `/path/to/my.pkg` (replace with your package name) with `pkgutil --expand /path/to/my.pkg /tmp/expanded.unpkg`.
2. The unpacked package is a folder. Bundle IDs are contained within files named `PackageInfo`. These files can be found with the command `find /tmp/expanded.unpkg -name PackageInfo`.
-3. `PackageInfo` files are XML files, and bundle IDs are found within the `identifier` attributes of `` tags that look like ``, where extraneous attributes have been snipped out and replaced with ellipses.
+3. `PackageInfo` files are XML files, and bundle IDs are found within the `identifier` attributes of `` tags that look like `` (where extraneous attributes have been snipped out and replaced with ellipses).
4. Kexts inside packages are also described in `PackageInfo` files. If any kernel extensions are present, the command `find /tmp/expanded.unpkg -name PackageInfo -print0 | xargs -0 grep -i kext` should return a `` tag with a `path` attribute that contains a `.kext` extension, for example ``.
5. Once bundle IDs have been identified, the unpacked package directory can be deleted.
@@ -962,17 +978,17 @@ If available, an HTTPS URL is preferred. A plain HTTP URL should only be used in
#### Additional `url` parameters
-When a plain URL string is insufficient to fetch a file, additional information may be provided to the `curl`-based downloader, in the form of key/value pairs appended to `url`:
+When a plain URL string is insufficient to fetch a file, additional information may be provided to the `curl`-based downloader, in the form of key-value pairs appended to `url`:
-| key | value |
-| ------------------ | ----------- |
+| key | value |
+| ------------------ | ----- |
| `verified:` | string repeating the beginning of `url`, for [verification purposes](#when-url-and-homepage-domains-differ-add-verified) |
| `using:` | the symbols `:post` and `:homebrew_curl` are the only legal values |
-| `cookies:` | hash of cookies to be set in the download request (Example: [oracle-jdk-javadoc.rb](https://github.com/Homebrew/homebrew-cask/blob/326c44e93aeb8d4dd73acea14a99ae215c75fdd6/Casks/o/oracle-jdk-javadoc.rb#L5-L8)) |
-| `referer:` | string holding the URL to set as referer in the download request (Example: [firealpaca.rb](https://github.com/Homebrew/homebrew-cask/blob/c4b3f0742e044ae2a6e114eb6b90068763d0d12b/Casks/f/firealpaca.rb#L5-L6)) |
+| `cookies:` | hash of cookies to be set for the download request (Example: [oracle-jdk-javadoc.rb](https://github.com/Homebrew/homebrew-cask/blob/326c44e93aeb8d4dd73acea14a99ae215c75fdd6/Casks/o/oracle-jdk-javadoc.rb#L5-L8)) |
+| `referer:` | string holding the URL to set as referer for the download request (Example: [firealpaca.rb](https://github.com/Homebrew/homebrew-cask/blob/c4b3f0742e044ae2a6e114eb6b90068763d0d12b/Casks/f/firealpaca.rb#L5-L6)) |
| `header:` | string or array of strings holding the header(s) to set for the download request (Example: [pull-6545](https://github.com/Homebrew/brew/pull/6545#issue-503302353), [issue-15590](https://github.com/Homebrew/brew/issues/15590#issue-1774825542)) |
| `user_agent:` | string holding the user agent to set for the download request. Can also be set to the symbol `:fake`, which will use a generic browser-like user agent string. We prefer `:fake` when the server does not require a specific user agent. |
-| `data:` | hash of parameters to be set in the POST request (Example: [segger-jlink.rb](https://github.com/Homebrew/homebrew-cask/blob/38ac55614f146d68ae317594f0c119e9acbd7c9e/Casks/s/segger-jlink.rb#L6-L11)) |
+| `data:` | hash of parameters to be set for a POST request (Example: [segger-jlink.rb](https://github.com/Homebrew/homebrew-cask/blob/38ac55614f146d68ae317594f0c119e9acbd7c9e/Casks/s/segger-jlink.rb#L6-L11)) |
#### When URL and homepage domains differ, add `verified:`
@@ -980,11 +996,11 @@ When the domains of `url` and `homepage` differ, the discrepancy should be docum
This must be added so a user auditing the cask knows the URL was verified by the Homebrew Cask team as the one provided by the vendor, even though it may look unofficial. It is our responsibility as Homebrew Cask maintainers to verify both the `url` and `homepage` information when first added (or subsequently modified, apart from versioning).
-The parameter doesn’t mean you should trust the source blindly, but we only approve casks in which users can easily verify its authenticity with basic means, such as checking the official homepage or public repository. Occasionally, slightly more elaborate techniques may be used, such as inspecting a [`livecheck`](#stanza-livecheck) URL we established as official. Cases where such quick verifications aren’t possible (e.g. when the download URL is behind a registration wall) are [treated in a stricter manner](https://docs.brew.sh/Acceptable-Casks#unofficial-vendorless-and-walled-builds).
+The parameter doesn’t mean you should trust the source blindly, but we only approve casks in which users can easily verify its authenticity with basic means, such as checking the official homepage or public repository. Occasionally, slightly more elaborate techniques may be used, such as inspecting a [`livecheck`](#stanza-livecheck) URL we established as official. Cases where such quick verifications aren’t possible (e.g. when the download URL is behind a registration wall) are [treated in a stricter manner](Acceptable-Casks.md#unofficial-vendorless-and-walled-builds).
#### Difficulty finding a URL
-Web browsers may obscure the direct `url` download location for a variety of reasons. Homebrew Cask supplies a [`list_url_attributes_on_file`](https://github.com/Homebrew/homebrew-cask/blob/HEAD/developer/bin/list_url_attributes_on_file) script which can read extended file attributes to extract the actual source URL of most files downloaded by a browser on macOS. The script usually emits multiple candidate URLs; you may have to test each of them:
+Web browsers may obscure the direct `url` of a download for a variety of reasons. Homebrew Cask supplies a [`list_url_attributes_on_file`](https://github.com/Homebrew/homebrew-cask/blob/HEAD/developer/bin/list_url_attributes_on_file) script which can read extended file attributes to extract the actual source URL of most files downloaded by a browser on macOS. The script usually emits multiple candidate URLs; you may have to test each of them:
```bash
$(brew --repository homebrew/cask)/developer/bin/list_url_attributes_on_file
@@ -992,25 +1008,25 @@ $(brew --repository homebrew/cask)/developer/bin/list_url_attributes_on_file *"`
-* An uninstaller tool such as [AppCleaner](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/a/appcleaner.rb).
-* Inspection of the usual paths, i.e. `/Library/{'Application Support',LaunchAgents,LaunchDaemons,Frameworks,Logs,Preferences,PrivilegedHelperTools}` and `~/Library/{'Application Support',Caches,Containers,LaunchAgents,Logs,Preferences,'Saved Application State'}`.
+* An uninstaller tool such as [AppCleaner](https://formulae.brew.sh/cask/appcleaner)
+* Inspection of the usual paths, i.e. `/Library/{'Application Support',LaunchAgents,LaunchDaemons,Frameworks,Logs,Preferences,PrivilegedHelperTools}` and `~/Library/{'Application Support',Caches,Containers,LaunchAgents,Logs,Preferences,'Saved Application State'}`
If no additional files are discovered, instead of a zap stanza, include the following comment:
@@ -1186,7 +1203,7 @@ If no additional files are discovered, instead of a zap stanza, include the foll
### Handling different system configurations
-Casks can deliver specific versions of artifacts depending on the current macOS release or CPU architecture by either tailoring the URL / SHA-256 hash / version, using the [`on_` syntax](Formula-Cookbook.md#handling-different-system-configurations) (which replaces conditional statements using `MacOS.version` or `Hardware::CPU`), or both.
+Casks can deliver specific versions of artifacts depending on the current macOS release or CPU architecture by either tailoring the `url` / `sha256` / `version` stanzas, using the [`on_` syntax](Formula-Cookbook.md#handling-different-system-configurations) (which replaces conditional statements using `MacOS.version` or `Hardware::CPU`), or both.
If your cask's artifact is offered as separate downloads for Apple Silicon and Intel architectures, they'll presumably be downloadable at distinct URLs that differ only slightly. To adjust the URL depending on the current CPU architecture, supply a hash for each to the `arm:` and `intel:` parameters of `sha256`, and use the special `arch` stanza to define the unique components of the respective URLs for substitution in the `url`. Additional substitutions can be defined by calling `on_arch_conditional` directly. Example (from [libreoffice.rb](https://github.com/Homebrew/homebrew-cask/blob/a4164b8f5084fdaefb6e2e2f4f699270690b7845/Casks/l/libreoffice.rb#L1-L10)):
@@ -1253,7 +1270,7 @@ cask "calibre" do
end
```
-Such `on_` blocks can be nested and contain other stanzas not listed here. Examples: [calhash.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/c/calhash.rb), [openzfs.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/o/openzfs.rb), [r.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/r/r.rb), [wireshark.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/w/wireshark.rb)
+Such `on_` blocks can be nested and contain other stanzas not listed here. However, they should not contain `depends_on macos:` stanzas, which should occur once below the `on_` blocks and encompass all releases listed in the cask. Examples: [calhash.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/c/calhash.rb), [openzfs.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/o/openzfs.rb), [r.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/r/r.rb), [wireshark.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/w/wireshark.rb)
### Switch between languages or regions
@@ -1290,12 +1307,12 @@ Variables and methods should not be defined outside the `Utils` namespace, as th
This section describes the algorithm implemented in the `generate_cask_token` script, and covers detailed rules and exceptions which are not needed in most cases.
* [Purpose](#purpose)
-* [Finding the Simplified Name of the Vendor’s Distribution](#finding-the-simplified-name-of-the-vendors-distribution)
-* [Converting the Simplified Name To a Token](#converting-the-simplified-name-to-a-token)
-* [Cask Filenames](#cask-filenames)
-* [Cask Headers](#cask-headers)
-* [Cask Token Examples](#cask-token-examples)
-* [Special Affixes](#special-affixes)
+* [Finding the simplified name of the vendor’s distribution](#finding-the-simplified-name-of-the-vendors-distribution)
+* [Converting the simplified name to a token](#converting-the-simplified-name-to-a-token)
+* [Cask filenames](#cask-filenames)
+* [Cask headers](#cask-headers)
+* [Cask token examples](#cask-token-examples)
+* [Special affixes](#special-affixes)
### Purpose
@@ -1305,7 +1322,7 @@ Software vendors are often inconsistent with their naming. By enforcing strict n
* Minimize renaming events
* Unambiguously boil down the name of the software into a unique identifier
-Details of software names and brands will inevitably be lost in the conversion to a minimal token. To capture the vendor’s full name for a distribution, use the [`name`](#stanza-name) within a cask. `name` accepts an unrestricted UTF-8 string.
+Details of software names and brands will inevitably be lost in the conversion to a minimal token. To capture the vendor’s full name for a distribution, use the [`name`](#stanza-name) within a cask, which accepts an unrestricted UTF-8 string.
### Finding the simplified name of the vendor’s distribution
@@ -1317,9 +1334,13 @@ Details of software names and brands will inevitably be lost in the conversion t
* Remove `.app` from the end.
-* Remove from the end: the string “app”, if the vendor styles the name like “Software App.app”. Exception: when “app” is an inseparable part of the name, without which the name would be inherently nonsensical, as in [whatsapp.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/w/whatsapp.rb).
+* Remove from the end: the string “app”, if the vendor styles the name like “Software App.app”.
-* Remove from the end: version numbers or incremental release designations such as “alpha”, “beta”, or “release candidate”. Strings which distinguish different capabilities or codebases such as “Community Edition” are currently accepted. Exception: when a number is not an incremental release counter, but a differentiator for a different product from a different vendor, as in [kdiff3.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/k/kdiff3.rb).
+ * Exception: when “app” is an inseparable part of the name, without which the name would be inherently nonsensical, as in [whatsapp.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/w/whatsapp.rb).
+
+* Remove from the end: version numbers or incremental release designations such as “alpha”, “beta”, or “release candidate”. Strings which distinguish different capabilities or codebases such as “Community Edition” are currently accepted.
+
+ * Exception: when a number is not an incremental release counter, but a differentiator for a different product from a different vendor, as in [kdiff3.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/k/kdiff3.rb).
* If the version number is arranged to occur in the middle of the App name, it should also be removed.
@@ -1327,15 +1348,19 @@ Details of software names and brands will inevitably be lost in the conversion t
* Remove from the end: strings such as “Desktop”, “for Desktop”.
-* Remove from the end: strings such as “Mac”, “for Mac”, “for OS X”, “macOS”, “for macOS”. These terms are generally added to ported software such as “MAME OS X.app”. Exception: when the software is not a port, and “Mac” is an inseparable part of the name, without which the name would be inherently nonsensical, as in [PlayOnMac.app](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/p/playonmac.rb).
+* Remove from the end: strings such as “Mac”, “for Mac”, “for OS X”, “macOS”, “for macOS”. These terms are generally added to ported software such as “MAME OS X.app”.
+
+ * Exception: when the software is not a port, and “Mac” is an inseparable part of the name, without which the name would be inherently nonsensical, as in [PlayOnMac.app](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/p/playonmac.rb).
* Remove from the end: hardware designations such as “for x86”, “32-bit”, “ARM”.
-* Remove from the end: software framework names such as “Cocoa”, “Qt”, “Gtk”, “Wx”, “Java”, “Oracle JVM”, etc. Exception: the framework is the product being casked.
+* Remove from the end: software framework names such as “Cocoa”, “Qt”, “Gtk”, “Wx”, “Java”, “Oracle JVM”, etc.
+
+ * Exception: the framework is the product being casked.
* Remove from the end: localization strings such as “en-US”.
-* If the result of that process is a generic term, such as “Macintosh Installer”, try prepending the name of the vendor or developer, followed by a hyphen. If that doesn’t work, then just create the best name you can, based on the vendor’s web page.
+* If the result of this process is a generic term, such as “Macintosh Installer”, try prepending the name of the vendor or developer, followed by a hyphen. If that doesn’t work, then just create the best name you can, based on the vendor’s web page.
* If the result conflicts with the name of an existing cask, make yours unique by prepending the name of the vendor or developer, followed by a hyphen. Example: [unison.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/u/unison.rb) and [panic-unison.rb](https://github.com/Homebrew/homebrew-cask/blob/HEAD/Casks/p/panic-unison.rb).
@@ -1358,7 +1383,7 @@ Details of software names and brands will inevitably be lost in the conversion t
#### Simplified names of `pkg`-based installers
-* The Simplified Name of a `pkg` may be more tricky to determine than that of an App. If a `pkg` installs an App, then use that App name with the rules above. If not, just create the best name you can, based on the vendor’s web page.
+* The simplified name of a `pkg` may be more tricky to determine than that of an App. If a `pkg` installs an App, then use that App name with the rules above. If not, just create the best name you can, based on the vendor’s web page.
#### Simplified names of non-App software
@@ -1368,9 +1393,9 @@ Details of software names and brands will inevitably be lost in the conversion t
### Converting the simplified name to a token
-The token is the primary identifier for a package in this project. It’s the unique string users refer to when operating on the cask.
+As the token is the primary identifier for casks, it’s the unique string users refer to when operating on them.
-To convert the App’s Simplified Name (above) to a token:
+To convert the App’s simplified name (above) to a token:
* Convert all letters to lower case.
* Expand the `+` symbol into a separated English word: `-plus-`.
@@ -1382,19 +1407,19 @@ To convert the App’s Simplified Name (above) to a token:
* Digits stay digits.
* Delete any character which is not alphanumeric or a hyphen.
* Collapse a series of multiple hyphens into one hyphen.
-* Delete a leading or trailing hyphen.
+* Delete any leading or trailing hyphens.
-### Casks pinned to specific versions
+#### Casks pinned to specific versions
-Casks pinned to a specific version of the application (i.e. [`carbon-copy-cloner@5`](https://github.com/Homebrew/homebrew-cask/blob/1b8f44198e5e184c597ee07454a1e10f97f36b15/Casks/c/carbon-copy-cloner%405.rb)) should use the same token as the standard cask with a suffix of `@`. For Carbon Copy Cloner (`carbon-copy-cloner`), pinned to version 5, the token should be `carbon-copy-cloner@5`.
-### Casks pinned to development channels
+#### Casks pinned to development channels
-Casks that use an development "channel", such as betas, should use the same token as the standard cask with a suffix of `@`. For Google Chrome (`google-chrome`), using the "beta" channel, the token should be `google-chrome@beta`.
+Casks that use a development "channel", such as betas, should use the same token as the standard cask with a suffix of `@`. For Google Chrome (`google-chrome`), using the "beta" channel, the token should be `google-chrome@beta`.
### Cask filenames
-Casks are stored in a Ruby file named after the token, with the file extension `.rb`.
+Casks are defined in a Ruby file named after the token, with the file extension `.rb`.
### Cask headers
@@ -1405,7 +1430,7 @@ The token is also given in the header line for each cask.
These illustrate most of the rules for generating a token:
| App Name on Disk | Simplified App Name | Cask Token | Filename |
-|------------------------|---------------------|------------------|----------------------|
+| ---------------------- | ------------------- | ---------------- | -------- |
| `Audio Hijack Pro.app` | Audio Hijack Pro | audio-hijack-pro | `audio-hijack-pro.rb` |
| `VLC.app` | VLC | vlc | `vlc.rb` |
| `BetterTouchTool.app` | BetterTouchTool | bettertouchtool | `bettertouchtool.rb` |
@@ -1414,11 +1439,11 @@ These illustrate most of the rules for generating a token:
For versioned/development channel casks:
-| Standard Cask Token | Derivative | Cask Token | Filename |
-|------------------------|---------------------|-----------------------|----------------------|
-| `google-chrome` | Beta Channel | `google-chrome@beta` | `google-chrome@beta.rb` |
-| `vlc` | Nightly Channel | `vlc@nightly` | `vlc@nightly.rb` |
-| `carbon-copy-cloner` | Pinned to version 5 | `carbon-copy-cloner@5`| `carbon-copy-cloner@5.rb` |
+| Standard Cask Token | Derivative | Cask Token | Filename |
+| -------------------- | ------------------- | ---------------------- | -------- |
+| `google-chrome` | Beta channel | `google-chrome@beta` | `google-chrome@beta.rb` |
+| `vlc` | Nightly channel | `vlc@nightly` | `vlc@nightly.rb` |
+| `carbon-copy-cloner` | Pinned to version 5 | `carbon-copy-cloner@5` | `carbon-copy-cloner@5.rb` |
### Special affixes
@@ -1426,7 +1451,7 @@ A few situations require a prefix or suffix to be added to the token.
#### Token overlap
-When the token for a new cask would otherwise conflict with the token of an already existing cask, the nature of that overlap dictates the token, potentially for both casks. See [Forks and Apps with Conflicting Names](Acceptable-Casks.md#forks-and-apps-with-conflicting-names) for information on how to proceed.
+When the token for a new cask would otherwise conflict with the token of an already existing cask, the nature of that overlap dictates the token, potentially for both casks. See [Forks and apps with conflicting names](Acceptable-Casks.md#forks-and-apps-with-conflicting-names) for information on how to proceed.
#### Potentially misleading name
diff --git a/docs/Common-Issues.md b/docs/Common-Issues.md
index 30d29ae5de..257555e8e1 100644
--- a/docs/Common-Issues.md
+++ b/docs/Common-Issues.md
@@ -229,7 +229,7 @@ Help us by [submitting a fix](https://github.com/Homebrew/homebrew-cask/blob/HEA
### Cask - source is not there
-First, you need to identify which artifact is not being handled correctly anymore. It’s explicit in the error message: if it says `It seems the App source…'` then the problem is with the [`app`](https://docs.brew.sh/Cask-Cookbook#stanza-app) stanza. This pattern is the same across [all artifacts](https://docs.brew.sh/Cask-Cookbook#at-least-one-artifact-stanza-is-also-required).
+First, you need to identify which artifact is not being handled correctly anymore. It’s explicit in the error message: if it says `It seems the App source…'` then the problem is with the [`app`](Cask-Cookbook.md#stanza-app) stanza. This pattern is the same across [all artifacts](Cask-Cookbook.md#at-least-one-artifact-stanza-is-also-required).
Fixing this error is typically easy, and requires only a bit of time on your part. Start by downloading the package for the cask: `brew fetch `. The last line of output will inform you of the location of the download. Navigate there and manually unpack it. As an example, let's say the structure inside the archive is as follows:
@@ -246,19 +246,19 @@ Now, if we find this when looking at the cask with `brew cat `:
The cask expects `SomeApp.app` to be in the top directory of the archive (see how it says simply `SomeApp.app`) but the developer has since moved it to be inside a `Files` directory. All we have to do is update that line of the cask to follow the new structure: `app "Files/SomeApp.app"`.
-Note that occasionally the app’s name changes completely (from `SomeApp.app` to `OtherApp.app`, let's say). In these instances, the filename of the cask itself, as well as its token, must also change. Consult the [`token reference`](https://docs.brew.sh/Cask-Cookbook#token-reference) for complete instructions on the new name.
+Note that occasionally the app’s name changes completely (from `SomeApp.app` to `OtherApp.app`, let's say). In these instances, the filename of the cask itself, as well as its token, must also change. Consult the [`token reference`](Cask-Cookbook.md#token-reference) for complete instructions on the new name.
Help us by [submitting a fix](https://github.com/Homebrew/homebrew-cask/blob/HEAD/CONTRIBUTING.md#updating-a-cask). If you get stumped, [open an issue](https://github.com/Homebrew/homebrew-cask/issues/new?template=01_bug_report.md) explaining your steps so far and where you’re having trouble.
### Cask - wrong number of arguments
-Make sure the issue really lies with your macOS version. To do so, try to install the software manually. If it is incompatible with your macOS version, it will tell you. In that case, there is nothing we can do to help you install the software, but we can add a [`depends_on macos:`](https://docs.brew.sh/Cask-Cookbook#depends_on-macos) stanza to prevent the cask from being installed on incompatible macOS versions.
+Make sure the issue really lies with your macOS version. To do so, try to install the software manually. If it is incompatible with your macOS version, it will tell you. In that case, there is nothing we can do to help you install the software, but we can add a [`depends_on macos:`](Cask-Cookbook.md#depends_on-macos) stanza to prevent the cask from being installed on incompatible macOS versions.
Help us by [submitting a fix](https://github.com/Homebrew/homebrew-cask/blob/HEAD/CONTRIBUTING.md#updating-a-cask). If you get stumped, [open an issue](https://github.com/Homebrew/homebrew-cask/issues/new?template=01_bug_report.md) explaining your steps so far and where you’re having trouble.
## Other local issues
-If your Homebrew installation gets messed up (and fixing the issues found by `brew doctor` doesn't solve the problem), reinstalling Homebrew may help to reset to a normal state. To easily reinstall Homebrew, use `brew bundle` to automatically restore your installed formulae and casks. To do so, run `brew bundle dump`, [uninstall](https://docs.brew.sh/FAQ#how-do-i-uninstall-homebrew), [reinstall](https://docs.brew.sh/Installation) and run `brew bundle install`.
+If your Homebrew installation gets messed up (and fixing the issues found by `brew doctor` doesn't solve the problem), reinstalling Homebrew may help to reset to a normal state. To easily reinstall Homebrew, use `brew bundle` to automatically restore your installed formulae and casks. To do so, run `brew bundle dump`, [uninstall](FAQ.md#how-do-i-uninstall-homebrew), [reinstall](Installation.md) and run `brew bundle install`.
## Possible `curl` issues
diff --git a/docs/FAQ.md b/docs/FAQ.md
index 99cb87f333..6dca0305e5 100644
--- a/docs/FAQ.md
+++ b/docs/FAQ.md
@@ -222,7 +222,7 @@ There are a few ideas to fix this problem:
So we let software be. Anything installed with Homebrew Cask should behave the same as if it were installed manually. But since we also want to support software that doesn’t self-upgrade, we add [`auto_updates true`](https://github.com/Homebrew/homebrew-cask/blob/aa461148bbb5119af26b82cccf5003e2b4e50d95/Casks/a/alfred.rb#L18) to casks for software that does, which excludes them from `brew upgrade`.
-Casks which use [`version :latest`](https://docs.brew.sh/Cask-Cookbook#version-latest) are also excluded, because we have no way to track their installed version. It helps to ask the developers of such software to provide versioned releases (i.e. include the version in the path of the download `url`).
+Casks which use [`version :latest`](Cask-Cookbook.md#special-value-latest) are also excluded, because we have no way to track their installed version. It helps to ask the developers of such software to provide versioned releases (i.e. include the version in the path of the download `url`).
If you still want to force software to be upgraded via Homebrew Cask, you can reference it specifically in the `upgrade` command:
diff --git a/docs/Formula-Cookbook.md b/docs/Formula-Cookbook.md
index 94d1285545..f26de4266e 100644
--- a/docs/Formula-Cookbook.md
+++ b/docs/Formula-Cookbook.md
@@ -43,7 +43,7 @@ Packages are installed according to their formulae. Read over a simple one, e.g.
Make sure you run `brew update` before you start. This ensures your Homebrew installation is a Git repository.
-To create or edit formulae locally, you'll need to first [tap `homebrew/core`](https://docs.brew.sh/FAQ#can-i-edit-formulae-myself) if you haven't previously. This clones the Homebrew/homebrew-core Git repository to `$(brew --repository homebrew/core)`. As you're developing, you'll also need to set `HOMEBREW_NO_INSTALL_FROM_API=1` in your shell environment or before any `install`, `reinstall` or `upgrade` commands to force `brew` to use the local repository instead of the API.
+To create or edit formulae locally, you'll need to first [tap `homebrew/core`](FAQ.md#can-i-edit-formulae-myself) if you haven't previously. This clones the Homebrew/homebrew-core Git repository to `$(brew --repository homebrew/core)`. As you're developing, you'll also need to set `HOMEBREW_NO_INSTALL_FROM_API=1` in your shell environment or before any `install`, `reinstall` or `upgrade` commands to force `brew` to use the local repository instead of the API.
Before submitting a new formula make sure your package:
@@ -433,7 +433,7 @@ If you have already forked Homebrew on GitHub, then you can manually push (just
git push https://github.com/myname/homebrew-core/
```
-Now, [open a pull request](https://docs.brew.sh/How-To-Open-a-Homebrew-Pull-Request) for your changes.
+Now, [open a pull request](How-To-Open-a-Homebrew-Pull-Request.md) for your changes.
* One formula per commit; one commit per formula.
* Keep merge commits out of the pull request.
diff --git a/docs/Homebrew-and-Python.md b/docs/Homebrew-and-Python.md
index d8283b3ccc..525d92fd68 100644
--- a/docs/Homebrew-and-Python.md
+++ b/docs/Homebrew-and-Python.md
@@ -11,7 +11,7 @@ Homebrew will install the necessary Python 3 version that is needed to make your
## Python 3
Homebrew provides formulae for the newest and maintained releases of Python 3 (`python@3.y`) ().
-We keep older `python@3.y` versions according to our [versioned formulae guidelines](https://docs.brew.sh/Versions).
+We keep older `python@3.y` versions according to our [versioned formulae guidelines](Versions.md).
**Important:** Python may be upgraded to a newer version at any time. Consider using a version
manager such as `pyenv` if you require stability of minor or patch versions for virtual environments.
diff --git a/docs/Homebrew-on-Linux.md b/docs/Homebrew-on-Linux.md
index 9c6bae5452..f10dff9693 100644
--- a/docs/Homebrew-on-Linux.md
+++ b/docs/Homebrew-on-Linux.md
@@ -76,7 +76,7 @@ To install build tools, paste at a terminal prompt:
### ARM32 (Tier 3 Support)
-Homebrew can run on 32-bit ARM (e.g. Raspberry Pi and others), but as they lack bottles (binary packages) they are a [Tier 3 supported platform](https://docs.brew.sh/Support-Tiers#tier-3)
+Homebrew can run on 32-bit ARM systems (e.g. Raspberry Pi and others), but as they lack bottles (binary packages) they are a [Tier 3 supported platform](Support-Tiers.md#tier-3).
You may need to install your own Ruby using your system package manager, a PPA, or `rbenv/ruby-build` as we don't distribute a Homebrew Portable Ruby for ARM32.
diff --git a/docs/How-To-Open-a-Homebrew-Pull-Request.md b/docs/How-To-Open-a-Homebrew-Pull-Request.md
index 8257319ac7..8b0ca8a04b 100644
--- a/docs/How-To-Open-a-Homebrew-Pull-Request.md
+++ b/docs/How-To-Open-a-Homebrew-Pull-Request.md
@@ -10,11 +10,11 @@ The type of change you want to make influences which of Homebrew's main reposito
## Submit a new version of an existing formula
-1. Use [`brew bump-formula-pr`](Manpage#bump-formula-pr-options-formula) to do everything (i.e. forking, committing, pushing) with a single command. Run `brew bump-formula-pr --help` to learn more.
+1. Use [`brew bump-formula-pr`](Manpage.md#bump-formula-pr-options-formula) to do everything (i.e. forking, committing, pushing) with a single command. Run `brew bump-formula-pr --help` to learn more.
## Submit a new version of an existing cask
-1. Use [`brew bump-cask-pr`](Manpage#bump-cask-pr-options-cask) to do everything (i.e. forking, committing, pushing) with a single command. Run `brew bump-cask-pr --help` to learn more.
+1. Use [`brew bump-cask-pr`](Manpage.md#bump-cask-pr-options-cask) to do everything (i.e. forking, committing, pushing) with a single command. Run `brew bump-cask-pr --help` to learn more.
## Set up your own fork of the Homebrew repository
@@ -38,7 +38,7 @@ The type of change you want to make influences which of Homebrew's main reposito
### Formulae-related pull request
-Before creating a new formula, please read [Acceptable Formulae](https://docs.brew.sh/Acceptable-Formulae).
+Before creating a new formula, please read [Acceptable Formulae](Acceptable-Formulae.md).
1. [Fork the Homebrew/homebrew-core repository on GitHub](https://github.com/Homebrew/homebrew-core/fork).
* This creates a personal remote repository that you can push to. This is needed because only Homebrew maintainers have push access to the main repositories.
@@ -64,7 +64,7 @@ Before creating a new formula, please read [Acceptable Formulae](https://docs.br
### Cask-related pull request
-Before creating a new cask, please read [Acceptable Casks](https://docs.brew.sh/Acceptable-Casks).
+Before creating a new cask, please read [Acceptable Casks](Acceptable-Casks.md).
1. [Fork the Homebrew/homebrew-cask repository on GitHub](https://github.com/Homebrew/homebrew-cask/fork).
* This creates a personal remote repository that you can push to. This is needed because only Homebrew maintainers have push access to the main repositories.
diff --git a/docs/Installation.md b/docs/Installation.md
index fc2412b421..618925e1bd 100644
--- a/docs/Installation.md
+++ b/docs/Installation.md
@@ -104,12 +104,12 @@ eval "$(/bin/brew shellenv)"
```
Replace `` with the directory where Homebrew is installed on your system.
-You can find Homebrew's default install location [in this FAQ entry](https://docs.brew.sh/FAQ#why-should-i-install-homebrew-in-the-default-location).
+You can find Homebrew's default install location in [this FAQ entry](FAQ.md#why-should-i-install-homebrew-in-the-default-location).
-For more insight, re-run the installer or inspect [the installer's source](https://github.com/Homebrew/install/blob/deacfa6a6e62e5f4002baf9e1fac7a96e9aa5d41/install.sh#L1072-L1088)
+For more insight, re-run the installer or inspect [the installer's source](https://github.com/Homebrew/install/blob/956abfa01f0d1dba285e6d3da86587ed428f19fe/install.sh#L1075-L1091)
to see how the installer constructs the path it recommends.
-See [Tips and Tricks > Loading Homebrew from the same dotfiles on different operating systems](Tips-and-Tricks.md#loading-homebrew-from-the-same-dotfiles-on-different-operating-systems)
+See [this tip in Tips and Tricks](Tips-and-Tricks.md#load-homebrew-from-the-same-dotfiles-on-different-operating-systems)
for another way to handle this across multiple operating systems.
## Uninstallation
diff --git a/docs/Manpage.md b/docs/Manpage.md
index bce11be419..50734eddaa 100644
--- a/docs/Manpage.md
+++ b/docs/Manpage.md
@@ -278,15 +278,15 @@ flags which will help with finding keg-only dependencies like `openssl`,
`--formula`
-: `list` or `dump` Homebrew formula dependencies.
+: `list`, `dump` or `cleanup` Homebrew formula dependencies.
`--cask`
-: `list` or `dump` Homebrew cask dependencies.
+: `list`, `dump` or `cleanup` Homebrew cask dependencies.
`--tap`
-: `list` or `dump` Homebrew tap dependencies.
+: `list`, `dump` or `cleanup` Homebrew tap dependencies.
`--mas`
@@ -298,7 +298,7 @@ flags which will help with finding keg-only dependencies like `openssl`,
`--vscode`
-: `list` or `dump` VSCode (and forks/variants) extensions.
+: `list`, `dump` or `cleanup` VSCode (and forks/variants) extensions.
`--no-vscode`
@@ -4443,8 +4443,8 @@ Homebrew's Project Leader is Mike McQuaid.
Homebrew's Project Leadership Committee is Colin Dean, Michka Popoff, Mike
McQuaid, Patrick Linnane and Vanessa Gennarelli.
-Homebrew's Technical Steering Committee is Bo Anderson, FX Coudert, Mike McQuaid
-and Rylan Polster.
+Homebrew's Technical Steering Committee is Bo Anderson, Issy Long, Michael Cho,
+Mike McQuaid and Ruoyu Zhong.
Homebrew's maintainers are Alexander Bayandin, Bevan Kay, Bo Anderson, Branch
Vincent, Caleb Xu, Carlo Cabrera, Daeho Ro, Douglas Eichelberger, Dustin
diff --git a/docs/New-Maintainer-Checklist.md b/docs/New-Maintainer-Checklist.md
index 1661901b9c..80ec6acd8a 100644
--- a/docs/New-Maintainer-Checklist.md
+++ b/docs/New-Maintainer-Checklist.md
@@ -82,7 +82,7 @@ Now sit back, relax and let the new maintainers handle more of our contributions
## PLC
-If a maintainer or member is elected to the Homebrew's [Project Leadership Committee](https://docs.brew.sh/Homebrew-Governance#4-project-leadership-committee):
+If a maintainer or member is elected to the Homebrew's [Project Leadership Committee](Homebrew-Governance.md#4-project-leadership-committee):
- Invite them to the [**@Homebrew/plc** team](https://github.com/orgs/Homebrew/teams/plc/members)
- Make them [billing managers](https://github.com/organizations/Homebrew/settings/billing) and [moderators](https://github.com/organizations/Homebrew/settings/moderators) on the Homebrew GitHub organisation
@@ -92,7 +92,7 @@ When they cease to be a PLC member, revoke or downgrade their access to all of t
## TSC
-If a maintainer is elected to the Homebrew's [Technical Steering Committee](https://docs.brew.sh/Homebrew-Governance#7-technical-steering-committee):
+If a maintainer is elected to the Homebrew's [Technical Steering Committee](Homebrew-Governance.md#7-technical-steering-committee):
- Invite them to the [**@Homebrew/tsc** team](https://github.com/orgs/Homebrew/teams/tsc/members)
- Make them [billing managers](https://github.com/organizations/Homebrew/settings/billing) and [moderators](https://github.com/organizations/Homebrew/settings/moderators) on the Homebrew GitHub organisation
@@ -111,7 +111,7 @@ When they cease to be an owner, revoke or downgrade their access to all of the a
## Members
-People who are either not eligible or willing to be Homebrew maintainers but have shown continued involvement in the Homebrew community may be admitted by a majority vote of the [Project Leadership Committee](https://docs.brew.sh/Homebrew-Governance#4-project-leadership-committee).
+People who are either not eligible or willing to be Homebrew maintainers but have shown continued involvement in the Homebrew community may be admitted by a majority vote of the [Project Leadership Committee](Homebrew-Governance.md#4-project-leadership-committee).
When admitted as members:
diff --git a/docs/Prose-Style-Guidelines.md b/docs/Prose-Style-Guidelines.md
index ad64206f5a..c5e2907884 100644
--- a/docs/Prose-Style-Guidelines.md
+++ b/docs/Prose-Style-Guidelines.md
@@ -1,5 +1,5 @@
---
-last_review_date: "2025-02-08"
+last_review_date: 2025-05-22
---
# Prose Style Guidelines
@@ -23,7 +23,7 @@ Homebrew's audience includes users with a wide range of education and experience
We strive for "correct" but not "fancy" usage. Think newspaper article, not academic paper.
-This is a set of guidelines to be applied using human judgement, not a set of hard and fast rules. It is like [Garner's Modern American Usage](https://en.wikipedia.org/wiki/Garner's_Modern_American_Usage). It is less like the [Ruby Style Guide](https://github.com/rubocop-hq/ruby-style-guide#the-ruby-style-guide). All guidelines here are open to interpretation and discussion. 100% conformance to these guidelines is *not* a goal.
+This is a set of guidelines to be applied using human judgement, not a set of hard and fast rules. It is more like [Garner's Modern American Usage](https://en.wikipedia.org/wiki/Garner's_Modern_American_Usage) and less like the [Ruby Style Guide](https://github.com/rubocop-hq/ruby-style-guide#the-ruby-style-guide). All guidelines here are open to interpretation and discussion. 100% conformance to these guidelines is *not* a goal.
The intent of this document is to help authors make decisions about clarity, style, and consistency. It is not to help settle arguments about who knows English better. Don't use this document to be a jerk.
@@ -53,6 +53,8 @@ We prefer:
* Use a subordinate list item instead of dropping a multi-sentence paragraph-long item into a list of sentence fragments
* Prefer Markdown over other markup formats unless their specific features are needed
* GitHub Flavoured Markdown. GitHub's implementation is the standard, period.
+* Link to other documentation pages with relative links to the Markdown filename rather than the full URL
+ * e.g. `FAQ.md` instead of `https://docs.brew.sh/FAQ`
### Typographical conventions
diff --git a/docs/Rakefile b/docs/Rakefile
index 9d58bcb719..5411ccfa0a 100644
--- a/docs/Rakefile
+++ b/docs/Rakefile
@@ -34,8 +34,9 @@ task test: :build do
],
ignore_urls: [
"/",
- %r{https://formulae.brew.sh"},
+ %r{https://formulae.brew.sh},
%r{https://github.com/},
+ %r{https://homebrew.1password.com/},
"https://legacy.python.org/dev/peps/pep-0453/#recommendations-for-downstream-distributors",
],
cache: {
diff --git a/docs/Support-Tiers.md b/docs/Support-Tiers.md
index 2f5baf9193..5a98f0c72e 100644
--- a/docs/Support-Tiers.md
+++ b/docs/Support-Tiers.md
@@ -22,7 +22,7 @@ A Tier 1 supported configuration is one in which:
For Tier 1 support, Homebrew on macOS must be all of:
- running on official Apple hardware (e.g. not a "Hackintosh" or VM)
-- running a version of macOS supported by Apple on that hardware
+- running the latest patch release of a macOS version supported by Apple on that hardware
- running a version of macOS with Homebrew CI coverage (i.e. the latest stable or prerelease version, two preceding versions)
- installed in the default prefix (i.e. `/opt/homebrew` on Apple Silicon, `/usr/local` on Intel x86_64)
- running on a supported architecture (i.e. Apple Silicon or Intel x86_64)
diff --git a/docs/Tips-and-Tricks.md b/docs/Tips-and-Tricks.md
index 198f1b914f..b3aedef367 100644
--- a/docs/Tips-and-Tricks.md
+++ b/docs/Tips-and-Tricks.md
@@ -143,7 +143,7 @@ export HOMEBREW_ARTIFACT_DOMAIN_NO_FALLBACK=1
export HOMEBREW_DOCKER_REGISTRY_BASIC_AUTH_TOKEN="$(printf 'anonymous:' | base64)"
```
-## Loading Homebrew from the same dotfiles on different operating systems
+## Load Homebrew from the same dotfiles on different operating systems
Some users may want to use the same shell initialization files on macOS and Linux.
Use this to detect the likely Homebrew installation directory and load Homebrew when it's found.
diff --git a/docs/Typechecking.md b/docs/Typechecking.md
index a7599ea936..216b79f396 100644
--- a/docs/Typechecking.md
+++ b/docs/Typechecking.md
@@ -1,12 +1,12 @@
---
-last_review_date: "2025-02-08"
+last_review_date: 2025-05-22
---
# Type Checking With Sorbet
-The majority of the code in Homebrew is written in Ruby which is a dynamic language. To avail the benefits of static type checking, we have set up Sorbet in our codebase which provides the benefits of static type checking to dynamic languages like Ruby.
+The majority of the code in Homebrew is written in Ruby which is a dynamic language. To avail the benefits of static type checking, we have set up [Sorbet](https://sorbet.org/) in our codebase which provides the benefits of static type checking to dynamic languages like Ruby.
-The [Sorbet Documentation] is a good place to get started if you want to dive deeper into Sorbet and its abilities.
+The [Sorbet Documentation](https://sorbet.org/docs/overview) is a good place to get started if you want to dive deeper into Sorbet and its abilities.
## Sorbet in the Homebrew Codebase
@@ -34,45 +34,41 @@ For more information on how to express more complex types, refer to the official
### Ruby interface files (`.rbi`)
-[RBI files](https://sorbet.org/docs/rbi) help Sorbet learn about constants, ancestors and methods defined in ways it doesn’t understand natively. We can also create an RBI file to help Sorbet understand dynamic definitions. Some of these files are autogenerated (see the next section) and some are manually written ([example]).
+[RBI files](https://sorbet.org/docs/rbi) help Sorbet learn about constants, ancestors and methods defined in ways it doesn't understand natively. We can also create an RBI file to help Sorbet understand dynamic definitions. Some of these files are automatically generated (see the next section) and some are manually written, e.g. [`extend/on_system.rbi`](https://github.com/Homebrew/brew/blob/975fe8a83fd57a8d8e790ec6fb10c2f13f705d02/Library/Homebrew/extend/on_system.rbi).
-There are also a very small number of files that Homebrew loads before sorbet-runtime, such as `utils/gems.rb`. Those files cannot have type signatures alongside the code itself, so RBI files are used there instead to retain static type checking.
-
-[example]: https://github.com/Homebrew/brew/blob/9d4000b15cb6ffa8c11f49372f7016d05aaa0851/Library/Homebrew/extend/ENV.rbi
+There are also a very small number of files that Homebrew loads before `sorbet-runtime`, such as `utils/gems.rb`. Those files cannot have type signatures alongside the code itself, so RBI files are used there instead to retain static type checking.
### The [`Library/Homebrew/sorbet`] directory
[`Library/Homebrew/sorbet`]: https://github.com/Homebrew/brew/tree/master/Library/Homebrew/sorbet
-- The `rbi` directory contains all Ruby Interface (`.rbi`) files auto-generated by running `brew typecheck --update`:
+The `rbi` directory contains all Ruby Interface (`.rbi`) files auto-generated by running `brew typecheck --update`:
- - `gems`: RBI files for all gems are generated using [Tapioca](https://github.com/Shopify/tapioca#tapioca).
- - `dsl`: RBI files autogenerated by our [Tapioca compilers](https://github.com/Homebrew/brew/tree/master/Library/Homebrew/sorbet/tapioca/compilers).
- - `upstream.rbi`: This file is not auto-generated and is a manually written file that contains temporary workarounds for upstream Sorbet issues. This file is typically empty.
+- `gems`: RBI files for all gems are generated using [Tapioca](https://github.com/Shopify/tapioca#tapioca).
+- `dsl`: RBI files auto-generated by our [Tapioca compilers](https://github.com/Homebrew/brew/tree/master/Library/Homebrew/sorbet/tapioca/compilers).
+- `upstream.rbi`: This file is manually written and contains temporary workarounds for upstream Sorbet issues. It is typically empty.
-- The `config` file is a newline-separated list of arguments to pass to `srb tc`, the same as if they’d been passed on the command line. Arguments in the config file are always passed first, followed by arguments provided on the command line. We use it to ignore Gem directories which we do not wish to type check.
+The `tapioca` directory contains configuration files and compilers for Tapioca, allowing Sorbet to type check the dynamically generated components of the codebase.
-- Every Ruby file in the codebase has a magic `# typed: ` comment at the top, where `` is one of [Sorbet's strictness levels], usually `false`, `true` or `strict`. The `false` files only report errors related to the syntax, constant resolution and correctness of the method signatures, but no type errors. Our long-term goal is to move all `false` files to `true` and start reporting type errors on those files as well. Therefore, when adding new files, you should ideally mark it with `# typed: true` and work out any resulting type errors.
-
-[Sorbet's strictness levels]: https://sorbet.org/docs/static#file-level-granularity-strictness-levels
+The `config` file is a newline-separated list of arguments to pass to `srb tc`, the same as if they'd been passed on the command line. Arguments in the config file are always passed first, followed by arguments provided on the command line. We use it to ignore e.g. gem directories which we do not wish to type check.
## Using `brew typecheck`
-When run without any arguments, `brew typecheck`, will run considering the strictness levels set in each of the individual Ruby files in the core Homebrew codebase. However, when it is run on a specific file or directory, more errors may show up since Sorbet cannot resolve constants defined outside the scope of the specified file. These problems can be solved with RBI files. Currently `brew typecheck` provides `--quiet`, `--file`, `--dir` and `--ignore` options but you can explore more options with `srb tc --help` and pass them with `srb tc`.
+Every Ruby file in the codebase has a magic `# typed: ` comment at the top, where `` is one of [Sorbet's strictness levels](https://sorbet.org/docs/static#file-level-granularity-strictness-levels), usually `false`, `true` or `strict`. The `false` files only report errors related to the syntax, constant resolution and correctness of the method signatures, but no type errors. Our long-term goal is to move all `false` files to `true` and start reporting type errors on those files as well. Therefore, when adding new files, you should ideally mark it with `# typed: true` and work out any resulting type errors.
+
+When run without any arguments, `brew typecheck` will run considering the strictness levels set in each of the individual Ruby files in the core Homebrew codebase. However, when run on a specific file or directory, more errors may show up since Sorbet cannot resolve constants defined outside the scope of the specified file. These problems can be solved with RBI files. Currently `brew typecheck` provides `--quiet`, `--file`, `--dir` and `--ignore` options, but you can explore more options with `srb tc --help` and pass them with `srb tc`.
## Resolving Type Errors
-Sorbet reports type errors along with an error reference code, which can be used to look up more information on how to debug the error, or what causes the error in the [Sorbet Documentation]. Here is how to debug some common type errors:
+Sorbet reports type errors along with an error reference code, which can be used to look up more information on how to debug the error, or what causes the error in the [Sorbet Documentation](https://sorbet.org/docs/overview). Here's how to debug some common type errors:
- Using `T.reveal_type`: in files which are `true` or higher, by wrapping a variable or method call in `T.reveal_type`, Sorbet will show us what type it thinks that variable has in the output of `srb tc`. This is particularly useful when writing [method signatures](https://sorbet.org/docs/sigs) and debugging. Make sure to remove this line from your code before committing your changes, since this is just a debugging tool.
- One of the most frequent errors that we've encountered is `7003: Method does not exist.` Since Ruby is a very dynamic language, methods can be defined in ways Sorbet cannot see statically. In such cases, check if the method exists at runtime; if not, then Sorbet has caught a future bug! But, it is also possible that even though a method exists at runtime, Sorbet cannot see it. In such cases, we use [`.rbi` files](#ruby-interface-files-rbi).
-- Since Sorbet does not automatically assume that Kernel is to be included in Modules, we may encounter many errors while trying to use methods like `puts`, `ohai`, `odebug` etc. There are generally two approaches to fixing this:
+- Since Sorbet does not automatically assume that `Kernel` is to be included in modules, we may encounter many errors while trying to use methods like `puts`, `ohai`, `odebug` etc. There are generally two approaches to fixing this:
- - If you are using `module_function` but never run `include ModuleName` anywhere, remove the `module_definition` and convert all methods to class methods (prepend the name with `self.`)
- - If you do include the module elsewhere, add a `requires_ancestor` to the module defining what types of classes this module can be included in. This may be as simple as a `requires_ancestor { Kernel }`, which most classes are a descendant from.
+ - If you are using `module_function` but never run `include ModuleName` anywhere, remove the `module_definition` and convert all methods to class methods (prepend the name with `self.`).
+ - If you do include the module elsewhere, add a `requires_ancestor` to the module defining what types of classes this module can be included in. This may be as simple as a `requires_ancestor { Kernel }`, which most classes are descended from.
- The tips above are very generic and apply to lots of cases. For some common gotchas when using Sorbet, refer to the [Sorbet Error Reference](https://sorbet.org/docs/error-reference) and [FAQ](https://sorbet.org/docs/faq).
-
-[Sorbet Documentation]: https://sorbet.org/docs/overview
diff --git a/docs/vale-styles/Homebrew/README.md b/docs/vale-styles/Homebrew/README.md
index 1b087e5b53..12de474ec9 100644
--- a/docs/vale-styles/Homebrew/README.md
+++ b/docs/vale-styles/Homebrew/README.md
@@ -1,7 +1,7 @@
---
-last_review_date: "1970-01-01"
+last_review_date: 2025-05-22
---
# Vale Styles
-Based on Homebrew's [Prose Style Guidelines](http://docs.brew.sh/Prose-Style-Guidelines.html).
+Based on Homebrew's [Prose Style Guidelines](/docs/Prose-Style-Guidelines.md).
diff --git a/manpages/brew.1 b/manpages/brew.1
index 70c81844ec..c9d84fcd31 100644
--- a/manpages/brew.1
+++ b/manpages/brew.1
@@ -169,13 +169,13 @@ Temporarily start services while running the \fBexec\fP or \fBsh\fP command\. Th
\fBlist\fP all dependencies\.
.TP
\fB\-\-formula\fP
-\fBlist\fP or \fBdump\fP Homebrew formula dependencies\.
+\fBlist\fP, \fBdump\fP or \fBcleanup\fP Homebrew formula dependencies\.
.TP
\fB\-\-cask\fP
-\fBlist\fP or \fBdump\fP Homebrew cask dependencies\.
+\fBlist\fP, \fBdump\fP or \fBcleanup\fP Homebrew cask dependencies\.
.TP
\fB\-\-tap\fP
-\fBlist\fP or \fBdump\fP Homebrew tap dependencies\.
+\fBlist\fP, \fBdump\fP or \fBcleanup\fP Homebrew tap dependencies\.
.TP
\fB\-\-mas\fP
\fBlist\fP or \fBdump\fP Mac App Store dependencies\.
@@ -184,7 +184,7 @@ Temporarily start services while running the \fBexec\fP or \fBsh\fP command\. Th
\fBlist\fP or \fBdump\fP Whalebrew dependencies\.
.TP
\fB\-\-vscode\fP
-\fBlist\fP or \fBdump\fP VSCode (and forks/variants) extensions\.
+\fBlist\fP, \fBdump\fP or \fBcleanup\fP VSCode (and forks/variants) extensions\.
.TP
\fB\-\-no\-vscode\fP
\fBdump\fP without VSCode (and forks/variants) extensions\. This is enabled by default if \fB$HOMEBREW_BUNDLE_DUMP_NO_VSCODE\fP is set\.
@@ -2922,7 +2922,7 @@ Homebrew\[u2019]s Project Leader is Mike McQuaid\.
.P
Homebrew\[u2019]s Project Leadership Committee is Colin Dean, Michka Popoff, Mike McQuaid, Patrick Linnane and Vanessa Gennarelli\.
.P
-Homebrew\[u2019]s Technical Steering Committee is Bo Anderson, FX Coudert, Mike McQuaid and Rylan Polster\.
+Homebrew\[u2019]s Technical Steering Committee is Bo Anderson, Issy Long, Michael Cho, Mike McQuaid and Ruoyu Zhong\.
.P
Homebrew\[u2019]s maintainers are Alexander Bayandin, Bevan Kay, Bo Anderson, Branch Vincent, Caleb Xu, Carlo Cabrera, Daeho Ro, Douglas Eichelberger, Dustin Rodrigues, Eric Knibbe, FX Coudert, Issy Long, Justin Krehel, Klaus Hipp, Markus Reiter, Michael Cho, Michka Popoff, Mike McQuaid, Nanda H Krishna, Patrick Linnane, Rui Chen, Ruoyu Zhong, Rylan Polster, Sam Ford, Sean Molenaar, Ĺ tefan Baebler, Thierry Moisan, Timothy Sutton and William Woodruff\.
.P
|