diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 65452dedcd..417a3aaeac 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -53,3 +53,10 @@ updates: interval: daily allow: - dependency-type: all + + - package-ecosystem: pip + directory: /Library/Homebrew/formula-analytics/ + schedule: + interval: daily + allow: + - dependency-type: all diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml index 3f36813ac8..0475c337e4 100644 --- a/.github/workflows/actionlint.yml +++ b/.github/workflows/actionlint.yml @@ -78,7 +78,7 @@ jobs: path: results.sarif - name: Upload SARIF file - uses: github/codeql-action/upload-sarif@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8 + uses: github/codeql-action/upload-sarif@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 with: sarif_file: results.sarif category: zizmor diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 72c0785fef..10e0bc4e8e 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -28,7 +28,7 @@ jobs: persist-credentials: false - name: Initialize CodeQL - uses: github/codeql-action/init@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8 + uses: github/codeql-action/init@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 with: languages: ruby config: | @@ -36,4 +36,4 @@ jobs: - Library/Homebrew/vendor - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8 + uses: github/codeql-action/analyze@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 1db26e8391..d86215f7ca 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -2,6 +2,9 @@ name: Docker on: pull_request: + push: + branches: + - master merge_group: release: types: @@ -34,7 +37,7 @@ jobs: run: git fetch origin master - name: Set up Docker Buildx - uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 + uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 with: cache-binary: false @@ -74,7 +77,7 @@ jobs: "homebrew/brew:latest" ) fi - elif [[ "${GITHUB_EVENT_NAME}" == "merge_group" && + elif [[ "${GITHUB_EVENT_NAME}" == "push" && "${GITHUB_REF}" == "refs/heads/master" && "${{ matrix.version }}" == "22.04" ]]; then tags+=( diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ed867d3f1f..f0269acf64 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -53,7 +53,7 @@ jobs: run: vale docs/ - name: Install Ruby - uses: ruby/setup-ruby@2654679fe7f7c29875c669398a8ec0791b8a64a1 # v1.215.0 + uses: ruby/setup-ruby@d781c1b4ed31764801bfae177617bb0446f5ef8d # v1.218.0 with: bundler-cache: true working-directory: docs diff --git a/.github/workflows/rubydoc.yml b/.github/workflows/rubydoc.yml index c59f23350e..9580c363b1 100644 --- a/.github/workflows/rubydoc.yml +++ b/.github/workflows/rubydoc.yml @@ -43,7 +43,7 @@ jobs: persist-credentials: false - name: Install Ruby - uses: ruby/setup-ruby@2654679fe7f7c29875c669398a8ec0791b8a64a1 # v1.215.0 + uses: ruby/setup-ruby@d781c1b4ed31764801bfae177617bb0446f5ef8d # v1.218.0 with: bundler-cache: true working-directory: rubydoc diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index bf9a7e49b3..631d86d86a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -115,7 +115,6 @@ jobs: run: | brew tap homebrew/bundle brew tap homebrew/command-not-found - brew tap homebrew/formula-analytics brew tap homebrew/portable-ruby brew tap homebrew/services @@ -129,7 +128,6 @@ jobs: homebrew/test-bot brew style homebrew/command-not-found \ - homebrew/formula-analytics \ homebrew/portable-ruby - name: Run brew style on homebrew/cask @@ -182,9 +180,6 @@ jobs: run: | brew audit --skip-style --except=version --tap=homebrew/cask - - name: Generate formula API - run: brew generate-formula-api --dry-run - - name: Generate cask API run: brew generate-cask-api --dry-run @@ -346,7 +341,7 @@ jobs: filenames=$(find Library/Homebrew/test/junit -name 'rspec*.xml' -print | tr '\n' ',') echo "filenames=${filenames%,}" >> "$GITHUB_OUTPUT" - - uses: codecov/test-results-action@4e79e65778be1cecd5df25e14af1eafb6df80ea9 # v1.0.2 + - uses: codecov/test-results-action@44ecb3a270cd942bdf0fa8f2ce14cb32493e810a # v1.0.3 with: working-directory: ${{ steps.set-up-homebrew.outputs.repository-path }} files: ${{ steps.junit_xml.outputs.filenames }} @@ -398,3 +393,46 @@ jobs: - run: brew install gnu-tar - run: brew test-bot --only-formulae --only-json-tab --test-default-formula + + test-analytics: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: + - ubuntu-latest + - macos-latest + needs: syntax + if: github.repository_owner == 'Homebrew' && github.event_name != 'push' + steps: + - name: Set up Homebrew + id: set-up-homebrew + uses: Homebrew/actions/setup-homebrew@master + + - name: Setup Python + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 + with: + python-version-file: ${{ steps.set-up-homebrew.outputs.repository-path }}/Library/Homebrew/formula-analytics/.python-version + + - name: Cache Homebrew Bundler RubyGems + id: cache + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 + with: + path: ${{ steps.set-up-homebrew.outputs.gems-path }} + key: ${{ runner.os }}-rubygems-${{ steps.set-up-homebrew.outputs.gems-hash }} + restore-keys: ${{ runner.os }}-rubygems- + + - name: Install Homebrew Bundler RubyGems + if: steps.cache.outputs.cache-hit != 'true' + run: brew install-bundler-gems + + - run: brew formula-analytics --setup + + - run: brew formula-analytics --install --json --days-ago=2 + if: github.event.pull_request.head.repo.fork == false && (github.event_name == 'pull_request' && github.event.pull_request.user.login != 'dependabot[bot]') + env: + HOMEBREW_INFLUXDB_TOKEN: ${{ secrets.HOMEBREW_INFLUXDB_READ_TOKEN }} + + - run: brew generate-analytics-api + if: github.event.pull_request.head.repo.fork == false && (github.event_name == 'pull_request' && github.event.pull_request.user.login != 'dependabot[bot]') + env: + HOMEBREW_INFLUXDB_TOKEN: ${{ secrets.HOMEBREW_INFLUXDB_READ_TOKEN }} diff --git a/.github/workflows/vendor-gems.yml b/.github/workflows/vendor-gems.yml index 6d1eb4fab6..e69cf92f41 100644 --- a/.github/workflows/vendor-gems.yml +++ b/.github/workflows/vendor-gems.yml @@ -92,7 +92,7 @@ jobs: fi - name: Generate push token - uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 + uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 id: app-token if: github.event_name == 'workflow_dispatch' with: diff --git a/.gitignore b/.gitignore index 5e9ff351e9..8823009012 100644 --- a/.gitignore +++ b/.gitignore @@ -106,6 +106,7 @@ **/vendor/bundle/ruby/*/gems/prism-*/ **/vendor/bundle/ruby/*/gems/psych-*/ **/vendor/bundle/ruby/*/gems/pry-*/ +**/vendor/bundle/ruby/*/gems/pycall-*/ **/vendor/bundle/ruby/*/gems/racc-*/ **/vendor/bundle/ruby/*/gems/rainbow-*/ **/vendor/bundle/ruby/*/gems/rbi-*/ diff --git a/Library/Homebrew/Gemfile b/Library/Homebrew/Gemfile index 317ce59571..764f615c43 100644 --- a/Library/Homebrew/Gemfile +++ b/Library/Homebrew/Gemfile @@ -71,6 +71,9 @@ end group :vscode, optional: true do gem "ruby-lsp", require: false end +group :formula_analytics, optional: true do + gem "pycall", require: false +end # shared gems (used by multiple groups) group :audit, :bump_unversioned_casks, :livecheck, optional: true do diff --git a/Library/Homebrew/Gemfile.lock b/Library/Homebrew/Gemfile.lock index a2ba8beff5..8028d7eda5 100644 --- a/Library/Homebrew/Gemfile.lock +++ b/Library/Homebrew/Gemfile.lock @@ -43,6 +43,7 @@ GEM coderay (~> 1.1) method_source (~> 1.0) public_suffix (6.0.1) + pycall (1.5.2) racc (1.8.1) rainbow (3.1.1) rbi (0.2.4) @@ -113,15 +114,15 @@ GEM simplecov-html (0.13.1) simplecov_json_formatter (0.1.4) simpleidn (0.2.3) - sorbet (0.5.11805) - sorbet-static (= 0.5.11805) - sorbet-runtime (0.5.11805) - sorbet-static (0.5.11805-aarch64-linux) - sorbet-static (0.5.11805-universal-darwin) - sorbet-static (0.5.11805-x86_64-linux) - sorbet-static-and-runtime (0.5.11805) - sorbet (= 0.5.11805) - sorbet-runtime (= 0.5.11805) + sorbet (0.5.11812) + sorbet-static (= 0.5.11812) + sorbet-runtime (0.5.11812) + sorbet-static (0.5.11812-aarch64-linux) + sorbet-static (0.5.11812-universal-darwin) + sorbet-static (0.5.11812-x86_64-linux) + sorbet-static-and-runtime (0.5.11812) + sorbet (= 0.5.11812) + sorbet-runtime (= 0.5.11812) spoom (1.5.3) erubi (>= 1.10.0) prism (>= 0.28.0) @@ -152,6 +153,7 @@ GEM PLATFORMS aarch64-linux + arm-linux arm64-darwin x86_64-darwin x86_64-linux @@ -168,6 +170,7 @@ DEPENDENCIES patchelf plist pry + pycall redcarpet rexml rspec diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index cadda01cbe..54e74af6b9 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -63,6 +63,11 @@ module Homebrew [:switch, "-g", "--git", { description: "Create a Git repository, useful for creating patches to the software.", }], + [:switch, "--ask", { + description: "Ask for confirmation before downloading and upgrading formulae. " \ + "Print bottles and dependencies download size, install and net install size.", + env: :ask, + }], ].each do |args| options = args.pop send(*args, **options) @@ -126,6 +131,98 @@ module Homebrew unless formulae.empty? Install.perform_preinstall_checks_once + ask_input = lambda { + ohai "Do you want to proceed with the installation? [Y/y/yes/N/n]" + accepted_inputs = %w[y yes] + declined_inputs = %w[n no] + loop do + result = $stdin.gets.chomp.strip.downcase + if accepted_inputs.include?(result) + break + elsif declined_inputs.include?(result) + exit 0 + else + puts "Invalid input. Please enter 'Y', 'y', or 'yes' to proceed, or 'N' to abort." + end + end + } + + # Build a unique list of formulae to size by including: + # 1. The original formulae to install. + # 2. Their outdated dependents (subject to pruning criteria). + # 3. Optionally, any installed formula that depends on one of these and is outdated. + compute_sized_formulae = lambda { |f, check_dep: true, upgrade: true| + sized_formulae = f.flat_map do |formula| + # Always include the formula itself. + formula_list = [formula] + next unless upgrade + + deps = args.build_from_source? ? formula.deps.build : formula.deps.required + # If there are dependencies, try to gather outdated, bottled ones. + if deps.any? && check_dep + outdated_dependents = deps.map(&:to_formula).reject(&:pinned?).select do |dep| + dep.installed_kegs.empty? || (dep.bottled? && dep.outdated?) + end + + formula_list.concat(outdated_dependents) + end + + formula_list + end + + # Add any installed formula that depends on one of the sized formulae and is outdated. + if check_dep && !Homebrew::EnvConfig.no_installed_dependents_check? + sized_formulae.concat(Formula.installed.select do |installed_formula| + installed_formula.outdated? && + installed_formula.deps.required.any? { |dep| sized_formulae.include?(dep.to_formula) } + end) + end + + sized_formulae.uniq(&:to_s) + } + + # Compute the total sizes (download, installed, and net) for the given formulae. + compute_total_sizes = lambda { |sized_formulae, debug: false| + total_download_size = 0 + total_installed_size = 0 + total_net_size = 0 + + sized_formulae.each do |formula| + next unless (bottle = formula.bottle) + + # Fetch additional bottle metadata (if necessary). + bottle.fetch_tab(quiet: !debug) + + total_download_size += bottle.bottle_size.to_i if bottle.bottle_size + total_installed_size += bottle.installed_size.to_i if bottle.installed_size + + # Sum disk usage for all installed kegs of the formula. + next if formula.installed_kegs.none? + + kegs_dep_size = formula.installed_kegs.sum { |keg| keg.disk_usage.to_i } + total_net_size += bottle.installed_size.to_i - kegs_dep_size if bottle.installed_size + end + + { download: total_download_size, + installed: total_installed_size, + net: total_net_size } + } + + # Main block: if asking the user is enabled, show dependency and size information. + if args.ask? + ohai "Looking for bottles..." + + sized_formulae = compute_sized_formulae.call(formulae, check_dep: false, upgrade: false) + sizes = compute_total_sizes.call(sized_formulae, debug: args.debug?) + + puts "Formulae: #{sized_formulae.join(", ")}\n\n" + puts "Download Size: #{disk_usage_readable(sizes[:download])}" + puts "Install Size: #{disk_usage_readable(sizes[:installed])}" + puts "Net Install Size: #{disk_usage_readable(sizes[:net])}" if sizes[:net] != 0 + + ask_input.call + end + formulae.each do |formula| if formula.pinned? onoe "#{formula.full_name} is pinned. You must unpin it to reinstall." diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 6ab70581ac..38eaf18f90 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -71,6 +71,11 @@ module Homebrew [:switch, "--overwrite", { description: "Delete files that already exist in the prefix while linking.", }], + [:switch, "--ask", { + description: "Ask for confirmation before downloading and upgrading formulae. " \ + "Print bottles and dependencies download size, install and net install size.", + env: :ask, + }], ].each do |args| options = args.pop send(*args, **options) @@ -216,6 +221,98 @@ module Homebrew Install.perform_preinstall_checks_once + ask_input = lambda { + ohai "Do you want to proceed with the installation? [Y/y/yes/N/n]" + accepted_inputs = %w[y yes] + declined_inputs = %w[n no] + loop do + result = $stdin.gets.chomp.strip.downcase + if accepted_inputs.include?(result) + break + elsif declined_inputs.include?(result) + exit 0 + else + puts "Invalid input. Please enter 'Y', 'y', or 'yes' to proceed, or 'N' to abort." + end + end + } + + # Build a unique list of formulae to size by including: + # 1. The original formulae to install. + # 2. Their outdated dependents (subject to pruning criteria). + # 3. Optionally, any installed formula that depends on one of these and is outdated. + compute_sized_formulae = lambda { |f, check_dep: true, upgrade: true| + sized_formulae = f.flat_map do |formula| + # Always include the formula itself. + formula_list = [formula] + next unless upgrade + + deps = args.build_from_source? ? formula.deps.build : formula.deps.required + # If there are dependencies, try to gather outdated, bottled ones. + if deps.any? && check_dep + outdated_dependents = deps.map(&:to_formula).reject(&:pinned?).select do |dep| + dep.installed_kegs.empty? || (dep.bottled? && dep.outdated?) + end + + formula_list.concat(outdated_dependents) + end + + formula_list + end + + # Add any installed formula that depends on one of the sized formulae and is outdated. + if check_dep && !Homebrew::EnvConfig.no_installed_dependents_check? + sized_formulae.concat(Formula.installed.select do |installed_formula| + installed_formula.outdated? && + installed_formula.deps.required.any? { |dep| sized_formulae.include?(dep.to_formula) } + end) + end + + sized_formulae.uniq(&:to_s) + } + + # Compute the total sizes (download, installed, and net) for the given formulae. + compute_total_sizes = lambda { |sized_formulae, debug: false| + total_download_size = 0 + total_installed_size = 0 + total_net_size = 0 + + sized_formulae.each do |formula| + next unless (bottle = formula.bottle) + + # Fetch additional bottle metadata (if necessary). + bottle.fetch_tab(quiet: !debug) + + total_download_size += bottle.bottle_size.to_i if bottle.bottle_size + total_installed_size += bottle.installed_size.to_i if bottle.installed_size + + # Sum disk usage for all installed kegs of the formula. + next if formula.installed_kegs.none? + + kegs_dep_size = formula.installed_kegs.sum { |keg| keg.disk_usage.to_i } + total_net_size += bottle.installed_size.to_i - kegs_dep_size if bottle.installed_size + end + + { download: total_download_size, + installed: total_installed_size, + net: total_net_size } + } + + # Main block: if asking the user is enabled, show dependency and size information. + if args.ask? + ohai "Looking for bottles..." + + sized_formulae = compute_sized_formulae.call(formulae_to_install) + sizes = compute_total_sizes.call(sized_formulae, debug: args.debug?) + + puts "Formulae: #{sized_formulae.join(", ")}\n\n" + puts "Download Size: #{disk_usage_readable(sizes[:download])}" + puts "Install Size: #{disk_usage_readable(sizes[:installed])}" + puts "Net Install Size: #{disk_usage_readable(sizes[:net])}" if sizes[:net] != 0 + + ask_input.call + end + Upgrade.upgrade_formulae( formulae_to_install, flags: args.flags_only, diff --git a/Library/Homebrew/dev-cmd/formula-analytics.rb b/Library/Homebrew/dev-cmd/formula-analytics.rb new file mode 100755 index 0000000000..9d92285a57 --- /dev/null +++ b/Library/Homebrew/dev-cmd/formula-analytics.rb @@ -0,0 +1,392 @@ +# typed: strict +# frozen_string_literal: true + +require "abstract_command" + +module Homebrew + module DevCmd + class FormulaAnalytics < AbstractCommand + cmd_args do + usage_banner <<~EOS + `formula-analytics` + + Query Homebrew's analytics. + EOS + flag "--days-ago=", + description: "Query from the specified days ago until the present. The default is 30 days." + switch "--install", + description: "Output the number of specifically requested installations or installation as " \ + "dependencies of the formula. This is the default." + switch "--cask-install", + description: "Output the number of installations of casks." + switch "--install-on-request", + description: "Output the number of specifically requested installations of the formula." + switch "--build-error", + description: "Output the number of build errors for the formulae." + switch "--os-version", + description: "Output OS versions." + switch "--homebrew-devcmdrun-developer", + description: "Output devcmdrun/HOMEBREW_DEVELOPER." + switch "--homebrew-os-arch-ci", + description: "Output OS/Architecture/CI." + switch "--homebrew-prefixes", + description: "Output Homebrew prefixes." + switch "--homebrew-versions", + description: "Output Homebrew versions." + switch "--brew-command-run", + description: "Output `brew` commands run." + switch "--brew-command-run-options", + description: "Output `brew` commands run with options." + switch "--brew-test-bot-test", + description: "Output `brew test-bot` steps run." + switch "--json", + description: "Output JSON. This is required: plain text support has been removed." + switch "--all-core-formulae-json", + description: "Output a different JSON format containing the JSON data for all " \ + "Homebrew/homebrew-core formulae." + switch "--setup", + description: "Install the necessary gems, require them and exit without running a query." + conflicts "--install", "--cask-install", "--install-on-request", "--build-error", "--os-version", + "--homebrew-devcmdrun-developer", "--homebrew-os-arch-ci", "--homebrew-prefixes", + "--homebrew-versions", "--brew-command-run", "--brew-command-run-options", "--brew-test-bot-test" + conflicts "--json", "--all-core-formulae-json", "--setup" + named_args :none + end + + FIRST_INFLUXDB_ANALYTICS_DATE = T.let(Date.new(2023, 03, 27).freeze, Date) + + sig { override.void } + def run + Homebrew.install_bundler_gems!(groups: ["formula_analytics"]) + + setup_python + influx_analytics(args) + end + + sig { void } + def setup_python + formula_analytics_root = HOMEBREW_LIBRARY/"Homebrew/formula-analytics" + vendor_python = Pathname.new("~/.brew-formula-analytics/vendor/python").expand_path + python_version = (formula_analytics_root/".python-version").read.chomp + + which_python = which("python#{python_version}", ORIGINAL_PATHS) + odie <<~EOS if which_python.nil? + Python #{python_version} is required. Try: + brew install python@#{python_version} + EOS + + venv_root = vendor_python/python_version + vendor_python.children.reject { |path| path == venv_root }.each(&:rmtree) if vendor_python.exist? + venv_python = venv_root/"bin/python" + + repo_requirements = HOMEBREW_LIBRARY/"Homebrew/formula-analytics/requirements.txt" + venv_requirements = venv_root/"requirements.txt" + if !venv_requirements.exist? || !FileUtils.identical?(repo_requirements, venv_requirements) + safe_system which_python, "-I", "-m", "venv", "--clear", venv_root, out: :err + safe_system venv_python, "-m", "pip", "install", + "--disable-pip-version-check", + "--require-hashes", + "--requirement", repo_requirements, + out: :err + FileUtils.cp repo_requirements, venv_requirements + end + + ENV["PATH"] = "#{venv_root}/bin:#{ENV.fetch("PATH")}" + ENV["__PYVENV_LAUNCHER__"] = venv_python.to_s # support macOS framework Pythons + + require "pycall" + PyCall.init(venv_python) + require formula_analytics_root/"pycall-setup" + end + + sig { params(args: Homebrew::DevCmd::FormulaAnalytics::Args).void } + def influx_analytics(args) + require "utils/analytics" + require "json" + + return if args.setup? + + odie "HOMEBREW_NO_ANALYTICS is set!" if ENV["HOMEBREW_NO_ANALYTICS"] + + token = ENV.fetch("HOMEBREW_INFLUXDB_TOKEN", nil) + odie "No InfluxDB credentials found in HOMEBREW_INFLUXDB_TOKEN!" unless token + + client = InfluxDBClient3.new( + token:, + host: URI.parse(Utils::Analytics::INFLUX_HOST).host, + org: Utils::Analytics::INFLUX_ORG, + database: Utils::Analytics::INFLUX_BUCKET, + ) + + max_days_ago = (Date.today - FIRST_INFLUXDB_ANALYTICS_DATE).to_s.to_i + days_ago = (args.days_ago || 30).to_i + if days_ago > max_days_ago + opoo "Analytics started #{FIRST_INFLUXDB_ANALYTICS_DATE}. `--days-ago` set to maximum value." + days_ago = max_days_ago + end + if days_ago > 365 + opoo "Analytics are only retained for 1 year, setting `--days-ago=365`." + days_ago = 365 + end + + all_core_formulae_json = args.all_core_formulae_json? + + categories = [] + categories << :build_error if args.build_error? + categories << :cask_install if args.cask_install? + categories << :formula_install if args.install? + categories << :formula_install_on_request if args.install_on_request? + categories << :homebrew_devcmdrun_developer if args.homebrew_devcmdrun_developer? + categories << :homebrew_os_arch_ci if args.homebrew_os_arch_ci? + categories << :homebrew_prefixes if args.homebrew_prefixes? + categories << :homebrew_versions if args.homebrew_versions? + categories << :os_versions if args.os_version? + categories << :command_run if args.brew_command_run? + categories << :command_run_options if args.brew_command_run_options? + categories << :test_bot_test if args.brew_test_bot_test? + + category_matching_buckets = [:build_error, :cask_install, :command_run, :test_bot_test] + + categories.each do |category| + additional_where = all_core_formulae_json ? " AND tap_name ~ '^homebrew/(core|cask)$'" : "" + bucket = if category_matching_buckets.include?(category) + category + elsif category == :command_run_options + :command_run + else + :formula_install + end + + case category + when :homebrew_devcmdrun_developer + dimension_key = "devcmdrun_developer" + groups = [:devcmdrun, :developer] + when :homebrew_os_arch_ci + dimension_key = "os_arch_ci" + groups = [:os, :arch, :ci] + when :homebrew_prefixes + dimension_key = "prefix" + groups = [:prefix, :os, :arch] + when :homebrew_versions + dimension_key = "version" + groups = [:version] + when :os_versions + dimension_key = :os_version + groups = [:os_name_and_version] + when :command_run + dimension_key = "command_run" + groups = [:command] + when :command_run_options + dimension_key = "command_run_options" + groups = [:command, :options, :devcmdrun, :developer] + additional_where += " AND ci = 'false'" + when :test_bot_test + dimension_key = "test_bot_test" + groups = [:command, :passed, :arch, :os] + when :cask_install + dimension_key = :cask + groups = [:package, :tap_name] + else + dimension_key = :formula + additional_where += " AND on_request = 'true'" if category == :formula_install_on_request + groups = [:package, :tap_name, :options] + end + + sql_groups = groups.map { |e| "\"#{e}\"" }.join(",") + query = <<~EOS + SELECT #{sql_groups}, COUNT(*) AS "count" FROM "#{bucket}" WHERE time >= now() - INTERVAL '#{days_ago} day'#{additional_where} GROUP BY #{sql_groups} + EOS + batches = begin + client.query(query:, language: "sql").to_batches + rescue PyCall::PyError => e + if e.message.include?("message: unauthenticated") + odie "Could not authenticate with InfluxDB! Please check your HOMEBREW_INFLUXDB_TOKEN!" + end + raise + end + + json = T.let({ + category:, + total_items: 0, + start_date: Date.today - days_ago.to_i, + end_date: Date.today, + total_count: 0, + items: [], + }, T::Hash[Symbol, T.untyped]) + + batches.each do |batch| + batch.to_pylist.each do |record| + dimension = case category + when :homebrew_devcmdrun_developer + "devcmdrun=#{record["devcmdrun"]} HOMEBREW_DEVELOPER=#{record["developer"]}" + when :homebrew_os_arch_ci + if record["ci"] == "true" + "#{record["os"]} #{record["arch"]} (CI)" + else + "#{record["os"]} #{record["arch"]}" + end + when :homebrew_prefixes + if record["prefix"] == "custom-prefix" + "#{record["prefix"]} (#{record["os"]} #{record["arch"]})" + else + (record["prefix"]).to_s + end + when :os_versions + format_os_version_dimension(record["os_name_and_version"]) + when :command_run_options + options = record["options"].split + + # Cleanup bad data before TODO + # Can delete this code after 18th July 2025. + options.reject! { |option| option.match?(/^--with(out)?-/) } + next if options.any? { |option| option.match?(/^TMPDIR=/) } + + "#{record["command"]} #{options.sort.join(" ")}" + when :test_bot_test + command_and_package, options = record["command"].split.partition { |arg| !arg.start_with?("-") } + + # Cleanup bad data before https://github.com/Homebrew/homebrew-test-bot/pull/1043 + # Can delete this code after 27th April 2025. + next if %w[audit install linkage style test].exclude?(command_and_package.first) + next if command_and_package.last.include?("/") + next if options.include?("--tap=") + next if options.include?("--only-dependencies") + next if options.include?("--cached") + + command_and_options = (command_and_package + options.sort).join(" ") + passed = (record["passed"] == "true") ? "PASSED" : "FAILED" + + "#{command_and_options} (#{record["os"]} #{record["arch"]}) (#{passed})" + else + record[groups.first.to_s] + end + next if dimension.blank? + + if (tap_name = record["tap_name"].presence) && + ((tap_name != "homebrew/cask" && dimension_key == :cask) || + (tap_name != "homebrew/core" && dimension_key == :formula)) + dimension = "#{tap_name}/#{dimension}" + end + + if (all_core_formulae_json || category == :build_error) && + (options = record["options"].presence) + # homebrew/core formulae don't have non-HEAD options but they ended up in our analytics anyway. + if all_core_formulae_json + options = options.split.include?("--HEAD") ? "--HEAD" : "" + end + dimension = "#{dimension} #{options}" + end + + dimension = dimension.strip + next if dimension.match?(/[<>]/) + + count = record["count"] + + json[:total_items] += 1 + json[:total_count] += count + + json[:items] << { + number: nil, + dimension_key => dimension, + count:, + } + end + end + + odie "No data returned" if json[:total_count].zero? + + # Combine identical values + deduped_items = {} + + json[:items].each do |item| + key = item[dimension_key] + if deduped_items.key?(key) + deduped_items[key][:count] += item[:count] + else + deduped_items[key] = item + end + end + + json[:items] = deduped_items.values + + if all_core_formulae_json + core_formula_items = {} + + json[:items].each do |item| + item.delete(:number) + formula_name, = item[dimension_key].split.first + next if formula_name.include?("/") + + core_formula_items[formula_name] ||= [] + core_formula_items[formula_name] << item + end + json.delete(:items) + + core_formula_items.each_value do |items| + items.sort_by! { |item| -item[:count] } + items.each do |item| + item[:count] = format_count(item[:count]) + end + end + + json[:formulae] = core_formula_items.sort_by { |name, _| name }.to_h + else + json[:items].sort_by! do |item| + -item[:count] + end + + json[:items].each_with_index do |item, index| + item[:number] = index + 1 + + percent = (item[:count].to_f / json[:total_count]) * 100 + item[:percent] = format_percent(percent) + item[:count] = format_count(item[:count]) + end + end + + puts JSON.pretty_generate json + end + end + + sig { params(count: Integer).returns(String) } + def format_count(count) + count.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse + end + + sig { params(percent: Float).returns(String) } + def format_percent(percent) + format("%.2f", percent:).gsub(/\.00$/, "") + end + + sig { params(dimension: T.nilable(String)).returns(T.nilable(String)) } + def format_os_version_dimension(dimension) + return if dimension.blank? + + dimension = dimension.gsub(/^Intel ?/, "") + .gsub(/^macOS ?/, "") + .gsub(/ \(.+\)$/, "") + case dimension + when "10.11", /^10\.11\.?/ then "OS X El Capitan (10.11)" + when "10.12", /^10\.12\.?/ then "macOS Sierra (10.12)" + when "10.13", /^10\.13\.?/ then "macOS High Sierra (10.13)" + when "10.14", /^10\.14\.?/ then "macOS Mojave (10.14)" + when "10.15", /^10\.15\.?/ then "macOS Catalina (10.15)" + when "10.16", /^11\.?/ then "macOS Big Sur (11)" + when /^12\.?/ then "macOS Monterey (12)" + when /^13\.?/ then "macOS Ventura (13)" + when /^14\.?/ then "macOS Sonoma (14)" + when /^15\.?/ then "macOS Sequoia (15)" + when /Ubuntu(-Server)? (14|16|18|20|22)\.04/ then "Ubuntu #{Regexp.last_match(2)}.04 LTS" + when /Ubuntu(-Server)? (\d+\.\d+).\d ?(LTS)?/ + "Ubuntu #{Regexp.last_match(2)} #{Regexp.last_match(3)}".strip + when %r{Debian GNU/Linux (\d+)\.\d+} then "Debian #{Regexp.last_match(1)} #{Regexp.last_match(2)}" + when /CentOS (\w+) (\d+)/ then "CentOS #{Regexp.last_match(1)} #{Regexp.last_match(2)}" + when /Fedora Linux (\d+)[.\d]*/ then "Fedora Linux #{Regexp.last_match(1)}" + when /KDE neon .*?([\d.]+)/ then "KDE neon #{Regexp.last_match(1)}" + when /Amazon Linux (\d+)\.[.\d]*/ then "Amazon Linux #{Regexp.last_match(1)}" + else dimension + end + end + end + end +end diff --git a/Library/Homebrew/dev-cmd/generate-analytics-api.rb b/Library/Homebrew/dev-cmd/generate-analytics-api.rb new file mode 100755 index 0000000000..b27a581acc --- /dev/null +++ b/Library/Homebrew/dev-cmd/generate-analytics-api.rb @@ -0,0 +1,138 @@ +# typed: strict +# frozen_string_literal: true + +require "abstract_command" + +module Homebrew + module DevCmd + class GenerateAnalyticsApi < AbstractCommand + CATEGORIES = %w[ + build-error install install-on-request + core-build-error core-install core-install-on-request + cask-install core-cask-install os-version + homebrew-devcmdrun-developer homebrew-os-arch-ci + homebrew-prefixes homebrew-versions + brew-command-run brew-command-run-options brew-test-bot-test + ].freeze + + # TODO: add brew-command-run-options brew-test-bot-test to above when working. + DAYS = %w[30 90 365].freeze + MAX_RETRIES = 3 + + cmd_args do + description <<~EOS + Generates analytics API data files for formulae.brew.sh. + + The generated files are written to the current directory. + EOS + + named_args :none + end + + sig { params(category_name: String, data_source: T.nilable(String)).returns(String) } + def analytics_json_template(category_name, data_source: nil) + data_source = "#{data_source}: true" if data_source + + <<~EOS + --- + layout: analytics_json + category: #{category_name} + #{data_source} + --- + {{ content }} + EOS + end + + sig { params(args: String).returns(String) } + def run_formula_analytics(*args) + puts "brew formula-analytics #{args.join(" ")}" + + retries = 0 + result = Utils.popen_read(HOMEBREW_BREW_FILE, "formula-analytics", *args, err: :err) + + while !$CHILD_STATUS.success? && retries < MAX_RETRIES + # Give InfluxDB some more breathing room. + sleep 4**(retries+2) + + retries += 1 + puts "Retrying #{args.join(" ")} (#{retries}/#{MAX_RETRIES})..." + result = Utils.popen_read(HOMEBREW_BREW_FILE, "formula-analytics", *args, err: :err) + end + + odie "`brew formula-analytics #{args.join(" ")}` failed: #{result}" unless $CHILD_STATUS.success? + + result + end + + sig { override.void } + def run + safe_system HOMEBREW_BREW_FILE, "formula-analytics", "--setup" + + directories = ["_data/analytics", "api/analytics"] + FileUtils.rm_rf directories + FileUtils.mkdir_p directories + + root_dir = Pathname.pwd + analytics_data_dir = root_dir/"_data/analytics" + analytics_api_dir = root_dir/"api/analytics" + + threads = [] + + CATEGORIES.each do |category| + formula_analytics_args = [] + + case category + when "core-build-error" + formula_analytics_args << "--all-core-formulae-json" + formula_analytics_args << "--build-error" + category_name = "build-error" + data_source = "homebrew-core" + when "core-install" + formula_analytics_args << "--all-core-formulae-json" + formula_analytics_args << "--install" + category_name = "install" + data_source = "homebrew-core" + when "core-install-on-request" + formula_analytics_args << "--all-core-formulae-json" + formula_analytics_args << "--install-on-request" + category_name = "install-on-request" + data_source = "homebrew-core" + when "core-cask-install" + formula_analytics_args << "--all-core-formulae-json" + formula_analytics_args << "--cask-install" + category_name = "cask-install" + data_source = "homebrew-cask" + else + formula_analytics_args << "--#{category}" + category_name = category + end + + path_suffix = File.join(category_name, data_source || "") + analytics_data_path = analytics_data_dir/path_suffix + analytics_api_path = analytics_api_dir/path_suffix + + FileUtils.mkdir_p analytics_data_path + FileUtils.mkdir_p analytics_api_path + + # The `--json` and `--all-core-formulae-json` flags are mutually + # exclusive, but we need to explicitly set `--json` sometimes, + # so only set it if we've not already set + # `--all-core-formulae-json`. + formula_analytics_args << "--json" unless formula_analytics_args.include? "--all-core-formulae-json" + + DAYS.each do |days| + next if days != "30" && category_name == "build-error" && !data_source.nil? + + threads << Thread.new do + args = %W[--days-ago=#{days}] + (analytics_data_path/"#{days}d.json").write run_formula_analytics(*formula_analytics_args, *args) + (analytics_api_path/"#{days}d.json").write analytics_json_template(category_name, data_source:) + end + end + end + + threads.each(&:join) + end + end + end +end diff --git a/Library/Homebrew/formula-analytics/.python-version b/Library/Homebrew/formula-analytics/.python-version new file mode 100644 index 0000000000..e4fba21835 --- /dev/null +++ b/Library/Homebrew/formula-analytics/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/Library/Homebrew/formula-analytics/pycall-setup.rb b/Library/Homebrew/formula-analytics/pycall-setup.rb new file mode 100644 index 0000000000..70a560ce35 --- /dev/null +++ b/Library/Homebrew/formula-analytics/pycall-setup.rb @@ -0,0 +1,12 @@ +# typed: strict +# frozen_string_literal: true + +require "pycall/import" +# This was a rewrite from `include(Module.new(...))`, +# to appease Sorbet, so let's keep the existing behaviour +# and silence RuboCop. +# rubocop:disable Style/MixinUsage +include PyCall::Import +# rubocop:enable Style/MixinUsage + +pyfrom "influxdb_client_3", import: :InfluxDBClient3 diff --git a/Library/Homebrew/formula-analytics/pycall-setup.rbi b/Library/Homebrew/formula-analytics/pycall-setup.rbi new file mode 100644 index 0000000000..a378238ba6 --- /dev/null +++ b/Library/Homebrew/formula-analytics/pycall-setup.rbi @@ -0,0 +1,24 @@ +# typed: strict + +class InfluxDBClient3 + def self.initialize(*args); end + + def query(*args); end +end + +module PyCall + def self.init(*args); end + + module Import + def self.pyfrom(*args); end + + def self.import(*args); end + end + + PyError = Class.new(StandardError).freeze +end + +# Needs defined here for Sorbet to work as expected. +# rubocop:disable Style/TopLevelMethodDefinition +def pyfrom(*args); end +# rubocop:enable Style/TopLevelMethodDefinition diff --git a/Library/Homebrew/formula-analytics/requirements.in b/Library/Homebrew/formula-analytics/requirements.in new file mode 100644 index 0000000000..d1ef841565 --- /dev/null +++ b/Library/Homebrew/formula-analytics/requirements.in @@ -0,0 +1 @@ +influxdb3-python diff --git a/Library/Homebrew/formula-analytics/requirements.txt b/Library/Homebrew/formula-analytics/requirements.txt new file mode 100644 index 0000000000..a4a2880d79 --- /dev/null +++ b/Library/Homebrew/formula-analytics/requirements.txt @@ -0,0 +1,84 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in +# +certifi==2025.1.31 \ + --hash=sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651 \ + --hash=sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe + # via influxdb3-python +influxdb3-python==0.10.0 \ + --hash=sha256:d279e5f8a597d49b44035263b1cf1472a3861ceba930fd08e1e3b1721a07d3cf \ + --hash=sha256:f3d44dff4c4bbfdcb1fa1c4013ccfa317fbbd7df5812eb46395421166ffb385a + # via -r requirements.in +pyarrow==19.0.0 \ + --hash=sha256:239ca66d9a05844bdf5af128861af525e14df3c9591bcc05bac25918e650d3a2 \ + --hash=sha256:2795064647add0f16563e57e3d294dbfc067b723f0fd82ecd80af56dad15f503 \ + --hash=sha256:29cd86c8001a94f768f79440bf83fee23963af5e7bc68ce3a7e5f120e17edf89 \ + --hash=sha256:2a0144a712d990d60f7f42b7a31f0acaccf4c1e43e957f7b1ad58150d6f639c1 \ + --hash=sha256:2a1a109dfda558eb011e5f6385837daffd920d54ca00669f7a11132d0b1e6042 \ + --hash=sha256:2b6d3ce4288793350dc2d08d1e184fd70631ea22a4ff9ea5c4ff182130249d9b \ + --hash=sha256:2f672f5364b2d7829ef7c94be199bb88bf5661dd485e21d2d37de12ccb78a136 \ + --hash=sha256:3c1c162c4660e0978411a4761f91113dde8da3433683efa473501254563dcbe8 \ + --hash=sha256:450a7d27e840e4d9a384b5c77199d489b401529e75a3b7a3799d4cd7957f2f9c \ + --hash=sha256:4624c89d6f777c580e8732c27bb8e77fd1433b89707f17c04af7635dd9638351 \ + --hash=sha256:4d8b0c0de0a73df1f1bf439af1b60f273d719d70648e898bc077547649bb8352 \ + --hash=sha256:5418d4d0fab3a0ed497bad21d17a7973aad336d66ad4932a3f5f7480d4ca0c04 \ + --hash=sha256:597360ffc71fc8cceea1aec1fb60cb510571a744fffc87db33d551d5de919bec \ + --hash=sha256:5e8a28b918e2e878c918f6d89137386c06fe577cd08d73a6be8dafb317dc2d73 \ + --hash=sha256:62ef8360ff256e960f57ce0299090fb86423afed5e46f18f1225f960e05aae3d \ + --hash=sha256:66732e39eaa2247996a6b04c8aa33e3503d351831424cdf8d2e9a0582ac54b34 \ + --hash=sha256:718947fb6d82409013a74b176bf93e0f49ef952d8a2ecd068fecd192a97885b7 \ + --hash=sha256:8d47c691765cf497aaeed4954d226568563f1b3b74ff61139f2d77876717084b \ + --hash=sha256:8e3a839bf36ec03b4315dc924d36dcde5444a50066f1c10f8290293c0427b46a \ + --hash=sha256:9348a0137568c45601b031a8d118275069435f151cbb77e6a08a27e8125f59d4 \ + --hash=sha256:a08e2a8a039a3f72afb67a6668180f09fddaa38fe0d21f13212b4aba4b5d2451 \ + --hash=sha256:a218670b26fb1bc74796458d97bcab072765f9b524f95b2fccad70158feb8b17 \ + --hash=sha256:a22a4bc0937856263df8b94f2f2781b33dd7f876f787ed746608e06902d691a5 \ + --hash=sha256:a7bbe7109ab6198688b7079cbad5a8c22de4d47c4880d8e4847520a83b0d1b68 \ + --hash=sha256:a92aff08e23d281c69835e4a47b80569242a504095ef6a6223c1f6bb8883431d \ + --hash=sha256:b34d3bde38eba66190b215bae441646330f8e9da05c29e4b5dd3e41bde701098 \ + --hash=sha256:b903afaa5df66d50fc38672ad095806443b05f202c792694f3a604ead7c6ea6e \ + --hash=sha256:be686bf625aa7b9bada18defb3a3ea3981c1099697239788ff111d87f04cd263 \ + --hash=sha256:c0423393e4a07ff6fea08feb44153302dd261d0551cc3b538ea7a5dc853af43a \ + --hash=sha256:c318eda14f6627966997a7d8c374a87d084a94e4e38e9abbe97395c215830e0c \ + --hash=sha256:c3b78eff5968a1889a0f3bc81ca57e1e19b75f664d9c61a42a604bf9d8402aae \ + --hash=sha256:c73268cf557e688efb60f1ccbc7376f7e18cd8e2acae9e663e98b194c40c1a2d \ + --hash=sha256:c751c1c93955b7a84c06794df46f1cec93e18610dcd5ab7d08e89a81df70a849 \ + --hash=sha256:ce42275097512d9e4e4a39aade58ef2b3798a93aa3026566b7892177c266f735 \ + --hash=sha256:cf3bf0ce511b833f7bc5f5bb3127ba731e97222023a444b7359f3a22e2a3b463 \ + --hash=sha256:da410b70a7ab8eb524112f037a7a35da7128b33d484f7671a264a4c224ac131d \ + --hash=sha256:e675a3ad4732b92d72e4d24009707e923cab76b0d088e5054914f11a797ebe44 \ + --hash=sha256:e82c3d5e44e969c217827b780ed8faf7ac4c53f934ae9238872e749fa531f7c9 \ + --hash=sha256:edfe6d3916e915ada9acc4e48f6dafca7efdbad2e6283db6fd9385a1b23055f1 \ + --hash=sha256:f094742275586cdd6b1a03655ccff3b24b2610c3af76f810356c4c71d24a2a6c \ + --hash=sha256:f208c3b58a6df3b239e0bb130e13bc7487ed14f39a9ff357b6415e3f6339b560 \ + --hash=sha256:f43f5aef2a13d4d56adadae5720d1fed4c1356c993eda8b59dace4b5983843c1 + # via influxdb3-python +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via influxdb3-python +reactivex==4.0.4 \ + --hash=sha256:0004796c420bd9e68aad8e65627d85a8e13f293de76656165dffbcb3a0e3fb6a \ + --hash=sha256:e912e6591022ab9176df8348a653fe8c8fa7a301f26f9931c9d8c78a650e04e8 + # via influxdb3-python +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 + # via python-dateutil +typing-extensions==4.12.2 \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 + # via reactivex +urllib3==2.3.0 \ + --hash=sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df \ + --hash=sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d + # via influxdb3-python + +# The following packages are considered to be unsafe in a requirements file: +setuptools==75.8.0 \ + --hash=sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6 \ + --hash=sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3 + # via influxdb3-python diff --git a/Library/Homebrew/formula-analytics/transform_analytics_to_counts.json b/Library/Homebrew/formula-analytics/transform_analytics_to_counts.json new file mode 100644 index 0000000000..f4617ab4b2 --- /dev/null +++ b/Library/Homebrew/formula-analytics/transform_analytics_to_counts.json @@ -0,0 +1,15 @@ +[ + { + "apiVersion": "influxdata.com/v2alpha1", + "kind": "Task", + "metadata": { + "name": "elegant-archimedes-94d001" + }, + "spec": { + "every": "1h", + "name": "Transform analytics to counts", + "query": "errors =\n from(bucket: \"analytics\")\n |> range(start: -task.every)\n |> filter(fn: (r) => r._measurement == \"build_error\" and r._field == \"package\")\n |> reduce(\n fn: (r, accumulator) =>\n ({\n pkg: r._value,\n _value: 1 + accumulator._value,\n _time: r._time,\n _field: r._field,\n _measurement: r._measurement,\n }),\n identity: {\n pkg: \"\",\n _value: 0,\n _time: now(),\n _measurement: \"\",\n _field: \"\",\n },\n )\n |> keep(\n columns: [\n \"_value\",\n \"pkg\",\n \"_time\",\n \"_measurement\",\n \"_field\",\n ],\n )\n |> to(bucket: \"analytics_downsampled\")\n\nformula =\n from(bucket: \"analytics\")\n |> range(start: -task.every)\n |> filter(fn: (r) => r._measurement == \"formula_install\" and r._field == \"package\")\n |> reduce(\n fn: (r, accumulator) =>\n ({\n pkg: r._value,\n _value: 1 + accumulator._value,\n _time: r._time,\n _field: r._field,\n _measurement: r._measurement,\n }),\n identity: {\n pkg: \"\",\n _value: 0,\n _time: now(),\n _measurement: \"\",\n _field: \"\",\n },\n )\n |> keep(\n columns: [\n \"_value\",\n \"pkg\",\n \"_time\",\n \"_measurement\",\n \"_field\",\n ],\n )\n |> to(bucket: \"analytics_downsampled\")\n\nreqFormula =\n from(bucket: \"analytics\")\n |> range(start: -task.every)\n |> filter(\n fn: (r) =>\n r._measurement == \"formula_install\" and r._field == \"package\" and r.on_request\n ==\n \"true\",\n )\n |> reduce(\n fn: (r, accumulator) =>\n ({\n pkg: r._value,\n _value: 1 + accumulator._value,\n _time: r._time,\n _field: r._field,\n _measurement: r._measurement,\n measure_col: \"formula_install_on_request\",\n }),\n identity: {\n pkg: \"\",\n _value: 0,\n _time: now(),\n _measurement: \"\",\n measure_col: \"formula_install_on_request\",\n _field: \"\",\n },\n )\n |> keep(\n columns: [\n \"_value\",\n \"pkg\",\n \"_time\",\n \"_measurement\",\n \"measure_col\",\n \"_field\",\n ],\n )\n |> to(bucket: \"analytics_downsampled\", measurementColumn: \"measure_col\")\n\ncasks =\n from(bucket: \"analytics\")\n |> range(start: -task.every)\n |> filter(fn: (r) => r._measurement == \"cask_install\" and r._field == \"package\")\n |> reduce(\n fn: (r, accumulator) =>\n ({\n pkg: r._value,\n _value: 1 + accumulator._value,\n _time: r._time,\n _field: r._field,\n _measurement: r._measurement,\n }),\n identity: {\n pkg: \"\",\n _value: 0,\n _time: now(),\n _measurement: \"\",\n _field: \"\",\n },\n )\n |> keep(\n columns: [\n \"_value\",\n \"pkg\",\n \"_time\",\n \"_measurement\",\n \"_field\",\n ],\n )\n |> to(bucket: \"analytics_downsampled\")\n\n// Agregate analytics\noses =\n from(bucket: \"analytics\")\n |> range(start: -task.every)\n |> filter(\n fn: (r) =>\n (r._measurement == \"formula_install\" or r._measurement == \"cask_install\")\n and\n r._field == \"os_name_and_version\",\n )\n |> reduce(\n fn: (r, accumulator) =>\n ({\n os: r._value,\n _value: 1 + accumulator._value,\n _time: r._time,\n _field: r._field,\n _measurement: r._measurement,\n measure_col: \"os_versions\",\n }),\n identity: {\n os: \"\",\n _value: 0,\n _time: now(),\n _measurement: \"\",\n measure_col: \"os_versions\",\n _field: \"\",\n },\n )\n |> keep(\n columns: [\n \"_value\",\n \"os\",\n \"_time\",\n \"_measurement\",\n \"measure_col\",\n \"_field\",\n ],\n )\n |> to(bucket: \"analytics_downsampled\", measurementColumn: \"measure_col\")", + "status": "active" + } + } +] \ No newline at end of file diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 889b6b6f58..1bfd73a0e2 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -4216,7 +4216,7 @@ class Formula lambda do |_| on_macos do T.bind(self, PourBottleCheck) - reason(<<~EOS) + reason(+<<~EOS) The bottle needs the Xcode Command Line Tools to be installed at /Library/Developer/CommandLineTools. Development tools provided by Xcode.app are not sufficient. diff --git a/Library/Homebrew/livecheck/strategy.rb b/Library/Homebrew/livecheck/strategy.rb index 950c8578e7..ca67feef36 100644 --- a/Library/Homebrew/livecheck/strategy.rb +++ b/Library/Homebrew/livecheck/strategy.rb @@ -12,8 +12,6 @@ module Homebrew module Strategy extend Utils::Curl - module_function - # {Strategy} priorities informally range from 1 to 10, where 10 is the # highest priority. 5 is the default priority because it's roughly in # the middle of this range. Strategies with a priority of 0 (or lower) @@ -98,7 +96,7 @@ module Homebrew # loaded, otherwise livecheck won't be able to use them. # @return [Hash] sig { returns(T::Hash[Symbol, T.untyped]) } - def strategies + def self.strategies @strategies ||= T.let(Strategy.constants.sort.each_with_object({}) do |const_symbol, hash| constant = Strategy.const_get(const_symbol) next unless constant.is_a?(Class) @@ -116,7 +114,7 @@ module Homebrew # `Symbol` (e.g. `:page_match`) # @return [Class, nil] sig { params(symbol: T.nilable(Symbol)).returns(T.untyped) } - def from_symbol(symbol) + def self.from_symbol(symbol) strategies[symbol] if symbol.present? end @@ -138,7 +136,7 @@ module Homebrew block_provided: T::Boolean, ).returns(T::Array[T.untyped]) } - def from_url(url, livecheck_strategy: nil, regex_provided: false, block_provided: false) + def self.from_url(url, livecheck_strategy: nil, regex_provided: false, block_provided: false) usable_strategies = strategies.select do |strategy_symbol, strategy| if strategy == PageMatch # Only treat the strategy as usable if the `livecheck` block @@ -178,7 +176,7 @@ module Homebrew post_json: T.nilable(T::Hash[T.any(String, Symbol), String]), ).returns(T::Array[String]) } - def post_args(post_form: nil, post_json: nil) + def self.post_args(post_form: nil, post_json: nil) if post_form.present? require "uri" ["--data", URI.encode_www_form(post_form)] diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/reinstall.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/reinstall.rbi index 10f9c8fb8f..beee25bbbe 100644 --- a/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/reinstall.rbi +++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/reinstall.rbi @@ -17,6 +17,9 @@ class Homebrew::Cmd::Reinstall::Args < Homebrew::CLI::Args sig { returns(T.nilable(String)) } def appdir; end + sig { returns(T::Boolean) } + def ask?; end + sig { returns(T.nilable(String)) } def audio_unit_plugindir; end diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/upgrade_cmd.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/upgrade_cmd.rbi index bc2ba6224b..3eb336f954 100644 --- a/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/upgrade_cmd.rbi +++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/cmd/upgrade_cmd.rbi @@ -14,6 +14,9 @@ class Homebrew::Cmd::UpgradeCmd::Args < Homebrew::CLI::Args sig { returns(T.nilable(String)) } def appdir; end + sig { returns(T::Boolean) } + def ask?; end + sig { returns(T.nilable(String)) } def audio_unit_plugindir; end diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/formula_analytics.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/formula_analytics.rbi new file mode 100644 index 0000000000..10517cad8a --- /dev/null +++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/formula_analytics.rbi @@ -0,0 +1,61 @@ +# typed: true + +# DO NOT EDIT MANUALLY +# This is an autogenerated file for dynamic methods in `Homebrew::DevCmd::FormulaAnalytics`. +# Please instead update this file by running `bin/tapioca dsl Homebrew::DevCmd::FormulaAnalytics`. + + +class Homebrew::DevCmd::FormulaAnalytics + sig { returns(Homebrew::DevCmd::FormulaAnalytics::Args) } + def args; end +end + +class Homebrew::DevCmd::FormulaAnalytics::Args < Homebrew::CLI::Args + sig { returns(T::Boolean) } + def all_core_formulae_json?; end + + sig { returns(T::Boolean) } + def brew_command_run?; end + + sig { returns(T::Boolean) } + def brew_command_run_options?; end + + sig { returns(T::Boolean) } + def brew_test_bot_test?; end + + sig { returns(T::Boolean) } + def build_error?; end + + sig { returns(T::Boolean) } + def cask_install?; end + + sig { returns(T.nilable(String)) } + def days_ago; end + + sig { returns(T::Boolean) } + def homebrew_devcmdrun_developer?; end + + sig { returns(T::Boolean) } + def homebrew_os_arch_ci?; end + + sig { returns(T::Boolean) } + def homebrew_prefixes?; end + + sig { returns(T::Boolean) } + def homebrew_versions?; end + + sig { returns(T::Boolean) } + def install?; end + + sig { returns(T::Boolean) } + def install_on_request?; end + + sig { returns(T::Boolean) } + def json?; end + + sig { returns(T::Boolean) } + def os_version?; end + + sig { returns(T::Boolean) } + def setup?; end +end diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/generate_analytics_api.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/generate_analytics_api.rbi new file mode 100644 index 0000000000..63461ae03c --- /dev/null +++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/dev_cmd/generate_analytics_api.rbi @@ -0,0 +1,13 @@ +# typed: true + +# DO NOT EDIT MANUALLY +# This is an autogenerated file for dynamic methods in `Homebrew::DevCmd::GenerateAnalyticsApi`. +# Please instead update this file by running `bin/tapioca dsl Homebrew::DevCmd::GenerateAnalyticsApi`. + + +class Homebrew::DevCmd::GenerateAnalyticsApi + sig { returns(Homebrew::DevCmd::GenerateAnalyticsApi::Args) } + def args; end +end + +class Homebrew::DevCmd::GenerateAnalyticsApi::Args < Homebrew::CLI::Args; end diff --git a/Library/Homebrew/sorbet/rbi/dsl/homebrew/env_config.rbi b/Library/Homebrew/sorbet/rbi/dsl/homebrew/env_config.rbi index a6a0e07bc0..f915406f5b 100644 --- a/Library/Homebrew/sorbet/rbi/dsl/homebrew/env_config.rbi +++ b/Library/Homebrew/sorbet/rbi/dsl/homebrew/env_config.rbi @@ -28,6 +28,9 @@ module Homebrew::EnvConfig sig { returns(T::Boolean) } def artifact_domain_no_fallback?; end + sig { returns(T::Boolean) } + def ask?; end + sig { returns(T.nilable(::String)) } def auto_update_secs; end diff --git a/Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.8.rbi b/Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.9.rbi similarity index 100% rename from Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.8.rbi rename to Library/Homebrew/sorbet/rbi/gems/ruby-lsp@0.23.9.rbi diff --git a/Library/Homebrew/sorbet/tapioca/config.yml b/Library/Homebrew/sorbet/tapioca/config.yml index 707b1bafb6..d4e2f10cdd 100644 --- a/Library/Homebrew/sorbet/tapioca/config.yml +++ b/Library/Homebrew/sorbet/tapioca/config.yml @@ -35,4 +35,7 @@ gem: - unicode-display_width - unicode-emoji - yard-sorbet + # The tapioca generated gem is not correct or sufficient for pycall + # so we need to generate our own: + - pycall prerequire: sorbet/tapioca/prerequire.rb diff --git a/Library/Homebrew/test/dev-cmd/formula-analytics_spec.rb b/Library/Homebrew/test/dev-cmd/formula-analytics_spec.rb new file mode 100644 index 0000000000..76704d2909 --- /dev/null +++ b/Library/Homebrew/test/dev-cmd/formula-analytics_spec.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "cmd/shared_examples/args_parse" +require "dev-cmd/formula-analytics" + +RSpec.describe Homebrew::DevCmd::FormulaAnalytics do + it_behaves_like "parseable arguments" +end diff --git a/Library/Homebrew/test/dev-cmd/generate-analytics-api_spec.rb b/Library/Homebrew/test/dev-cmd/generate-analytics-api_spec.rb new file mode 100644 index 0000000000..1253d97206 --- /dev/null +++ b/Library/Homebrew/test/dev-cmd/generate-analytics-api_spec.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +require "cmd/shared_examples/args_parse" +require "dev-cmd/generate-analytics-api" + +RSpec.describe Homebrew::DevCmd::GenerateAnalyticsApi do + it_behaves_like "parseable arguments" +end diff --git a/Library/Homebrew/utils/pypi.rb b/Library/Homebrew/utils/pypi.rb index 41bdaa4f2c..d8920b3d75 100644 --- a/Library/Homebrew/utils/pypi.rb +++ b/Library/Homebrew/utils/pypi.rb @@ -401,7 +401,8 @@ module PyPI end end - resource_section = "#{package_errors}\n#{new_resource_blocks}" + package_errors += "\n" if package_errors.present? + resource_section = "#{package_errors}#{new_resource_blocks}" odie "Excluded superfluous packages: #{exclude_packages.join(", ")}" if exclude_packages.any? diff --git a/Library/Homebrew/vendor/bundle/bundler/setup.rb b/Library/Homebrew/vendor/bundle/bundler/setup.rb index 2b2a1d1bd9..697e52ed5c 100644 --- a/Library/Homebrew/vendor/bundle/bundler/setup.rb +++ b/Library/Homebrew/vendor/bundle/bundler/setup.rb @@ -71,8 +71,10 @@ $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/prism-1.3.0") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/prism-1.3.0/lib") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/pry-0.15.2/lib") +$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/pycall-1.5.2") +$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/pycall-1.5.2/lib") $:.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}/gems/sorbet-runtime-0.5.11805/lib") +$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-runtime-0.5.11812/lib") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rbi-0.2.4/lib") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/extensions/arm64-darwin-20/#{Gem.extension_api_version}/rbs-3.8.1") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rbs-3.8.1/lib") @@ -96,7 +98,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.23.1/lib") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-rspec-3.4.0/lib") $:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/rubocop-sorbet-0.8.7/lib") -$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-lsp-0.23.8/lib") +$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/ruby-lsp-0.23.9/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") @@ -104,9 +106,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.11805-universal-darwin/lib") -$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-0.5.11805/lib") -$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-and-runtime-0.5.11805/lib") +$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-0.5.11812-universal-darwin/lib") +$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-0.5.11812/lib") +$:.unshift File.expand_path("#{__dir__}/../#{RUBY_ENGINE}/#{Gem.ruby_api_version}/gems/sorbet-static-and-runtime-0.5.11812/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.5.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.3.0/gems/sorbet-runtime-0.5.11805/lib/sorbet-runtime.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/sorbet-runtime.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/sorbet-runtime.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/sorbet-runtime.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/_types.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/_types.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/_types.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/_types.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/abstract_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/abstract_utils.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/abstract_utils.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/abstract_utils.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/boolean.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/boolean.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/boolean.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/boolean.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/compatibility_patches.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/compatibility_patches.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/compatibility_patches.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/compatibility_patches.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/configuration.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/configuration.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/configuration.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/configuration.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/enum.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/enum.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/enum.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/generic.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/generic.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/generic.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/generic.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/helpers.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/helpers.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/helpers.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/helpers.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/non_forcing_constants.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/non_forcing_constants.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/non_forcing_constants.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/non_forcing_constants.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/abstract/data.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/abstract/data.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/abstract/data.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/abstract/data.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/abstract/declare.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/abstract/declare.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/abstract/declare.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/abstract/declare.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/abstract/hooks.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/abstract/hooks.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/abstract/hooks.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/abstract/hooks.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/abstract/validate.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/abstract/validate.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/abstract/validate.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/abstract/validate.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/caller_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/caller_utils.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/caller_utils.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/caller_utils.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/casts.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/casts.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/casts.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/casts.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/class_utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/class_utils.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/class_utils.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/class_utils.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/decl_state.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/decl_state.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/decl_state.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/decl_state.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/final.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/final.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/final.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/final.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/_methods.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/_methods.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/_methods.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/_methods.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/call_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/call_validation.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/call_validation.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/call_validation.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/call_validation_2_6.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/call_validation_2_6.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/call_validation_2_6.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/call_validation_2_6.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/call_validation_2_7.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/call_validation_2_7.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/call_validation_2_7.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/call_validation_2_7.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/decl_builder.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/decl_builder.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/decl_builder.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/decl_builder.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/modes.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/modes.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/modes.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/modes.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/signature.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/signature.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/signature.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/signature.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/signature_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/signature_validation.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/methods/signature_validation.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/methods/signature_validation.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/mixins/mixins.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/mixins/mixins.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/mixins/mixins.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/mixins/mixins.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/retry.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/retry.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/retry.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/retry.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/runtime_levels.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/runtime_levels.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/runtime_levels.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/runtime_levels.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/sealed.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/sealed.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/sealed.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/sealed.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/not_typed.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/not_typed.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/not_typed.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/not_typed.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/simple_pair_union.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/simple_pair_union.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/simple_pair_union.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/simple_pair_union.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/string_holder.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/string_holder.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/string_holder.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/string_holder.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/type_alias.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/type_alias.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/type_alias.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/type_alias.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/void.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/void.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/private/types/void.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/private/types/void.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/_props.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/_props.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/_props.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/_props.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/constructor.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/constructor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/constructor.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/constructor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/custom_type.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/custom_type.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/custom_type.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/custom_type.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/decorator.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/decorator.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/decorator.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/decorator.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/errors.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/errors.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/errors.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/errors.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/generated_code_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/generated_code_validation.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/generated_code_validation.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/generated_code_validation.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/has_lazily_specialized_methods.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/has_lazily_specialized_methods.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/has_lazily_specialized_methods.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/has_lazily_specialized_methods.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/optional.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/optional.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/optional.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/optional.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/plugin.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/plugin.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/plugin.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/plugin.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/pretty_printable.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/pretty_printable.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/pretty_printable.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/pretty_printable.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/apply_default.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/apply_default.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/apply_default.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/apply_default.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/deserializer_generator.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/deserializer_generator.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/deserializer_generator.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/deserializer_generator.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/parser.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/parser.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/parser.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/parser.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/serde_transform.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/serde_transform.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/serde_transform.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/serde_transform.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/serializer_generator.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/serializer_generator.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/serializer_generator.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/serializer_generator.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/setter_factory.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/setter_factory.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/private/setter_factory.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/private/setter_factory.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/serializable.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/serializable.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/serializable.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/serializable.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/type_validation.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/type_validation.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/type_validation.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/type_validation.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/utils.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/utils.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/utils.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/weak_constructor.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/weak_constructor.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/props/weak_constructor.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/props/weak_constructor.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/sig.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/sig.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/sig.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/sig.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/struct.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/struct.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/struct.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/struct.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/anything.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/anything.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/anything.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/anything.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/attached_class.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/attached_class.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/attached_class.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/attached_class.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/base.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/base.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/base.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/base.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/class_of.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/class_of.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/class_of.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/class_of.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/enum.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/enum.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/enum.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/fixed_array.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/fixed_array.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/fixed_array.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/fixed_array.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/fixed_hash.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/fixed_hash.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/fixed_hash.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/fixed_hash.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/intersection.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/intersection.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/intersection.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/intersection.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/noreturn.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/noreturn.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/noreturn.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/noreturn.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/proc.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/proc.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/proc.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/proc.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/self_type.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/self_type.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/self_type.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/self_type.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/simple.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/simple.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/simple.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/simple.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/t_enum.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/t_enum.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/t_enum.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/t_enum.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/type_member.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/type_member.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/type_member.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/type_member.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/type_parameter.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/type_parameter.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/type_parameter.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/type_parameter.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/type_template.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/type_template.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/type_template.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/type_template.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/type_variable.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/type_variable.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/type_variable.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/type_variable.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_array.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_array.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_array.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_array.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_class.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_class.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_class.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_class.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_enumerable.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_enumerable.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_enumerable.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_enumerable.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_enumerator.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_enumerator.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_enumerator.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_enumerator.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_enumerator_chain.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_enumerator_chain.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_enumerator_chain.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_enumerator_chain.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_enumerator_lazy.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_enumerator_lazy.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_enumerator_lazy.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_enumerator_lazy.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_hash.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_hash.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_hash.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_hash.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_range.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_range.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_range.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_range.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_set.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_set.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/typed_set.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/typed_set.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/union.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/union.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/union.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/union.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/untyped.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/untyped.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/types/untyped.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/types/untyped.rb diff --git a/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/utils.rb b/Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/utils.rb similarity index 100% rename from Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11805/lib/types/utils.rb rename to Library/Homebrew/vendor/bundle/ruby/3.3.0/gems/sorbet-runtime-0.5.11812/lib/types/utils.rb diff --git a/completions/bash/brew b/completions/bash/brew index 173f29f49c..91c384f483 100644 --- a/completions/bash/brew +++ b/completions/bash/brew @@ -1133,6 +1133,38 @@ _brew_formula() { __brew_complete_formulae } +_brew_formula_analytics() { + local cur="${COMP_WORDS[COMP_CWORD]}" + case "${cur}" in + -*) + __brewcomp " + --all-core-formulae-json + --brew-command-run + --brew-command-run-options + --brew-test-bot-test + --build-error + --cask-install + --days-ago + --debug + --help + --homebrew-devcmdrun-developer + --homebrew-os-arch-ci + --homebrew-prefixes + --homebrew-versions + --install + --install-on-request + --json + --os-version + --quiet + --setup + --verbose + " + return + ;; + *) ;; + esac +} + _brew_formulae() { local cur="${COMP_WORDS[COMP_CWORD]}" case "${cur}" in @@ -1149,6 +1181,22 @@ _brew_formulae() { esac } +_brew_generate_analytics_api() { + local cur="${COMP_WORDS[COMP_CWORD]}" + case "${cur}" in + -*) + __brewcomp " + --debug + --help + --quiet + --verbose + " + return + ;; + *) ;; + esac +} + _brew_generate_cask_api() { local cur="${COMP_WORDS[COMP_CWORD]}" case "${cur}" in @@ -3029,7 +3077,9 @@ _brew() { extract) _brew_extract ;; fetch) _brew_fetch ;; formula) _brew_formula ;; + formula-analytics) _brew_formula_analytics ;; formulae) _brew_formulae ;; + generate-analytics-api) _brew_generate_analytics_api ;; generate-cask-api) _brew_generate_cask_api ;; generate-cask-ci-matrix) _brew_generate_cask_ci_matrix ;; generate-formula-api) _brew_generate_formula_api ;; diff --git a/completions/fish/brew.fish b/completions/fish/brew.fish index ea6849ed4e..50b7da926f 100644 --- a/completions/fish/brew.fish +++ b/completions/fish/brew.fish @@ -780,6 +780,29 @@ __fish_brew_complete_arg 'formula' -l verbose -d 'Make some output more verbose' __fish_brew_complete_arg 'formula' -a '(__fish_brew_suggest_formulae_all)' +__fish_brew_complete_cmd 'formula-analytics' 'Query Homebrew\'s analytics' +__fish_brew_complete_arg 'formula-analytics' -l all-core-formulae-json -d 'Output a different JSON format containing the JSON data for all Homebrew/homebrew-core formulae' +__fish_brew_complete_arg 'formula-analytics' -l brew-command-run -d 'Output `brew` commands run' +__fish_brew_complete_arg 'formula-analytics' -l brew-command-run-options -d 'Output `brew` commands run with options' +__fish_brew_complete_arg 'formula-analytics' -l brew-test-bot-test -d 'Output `brew test-bot` steps run' +__fish_brew_complete_arg 'formula-analytics' -l build-error -d 'Output the number of build errors for the formulae' +__fish_brew_complete_arg 'formula-analytics' -l cask-install -d 'Output the number of installations of casks' +__fish_brew_complete_arg 'formula-analytics' -l days-ago -d 'Query from the specified days ago until the present. The default is 30 days' +__fish_brew_complete_arg 'formula-analytics' -l debug -d 'Display any debugging information' +__fish_brew_complete_arg 'formula-analytics' -l help -d 'Show this message' +__fish_brew_complete_arg 'formula-analytics' -l homebrew-devcmdrun-developer -d 'Output devcmdrun/HOMEBREW_DEVELOPER' +__fish_brew_complete_arg 'formula-analytics' -l homebrew-os-arch-ci -d 'Output OS/Architecture/CI' +__fish_brew_complete_arg 'formula-analytics' -l homebrew-prefixes -d 'Output Homebrew prefixes' +__fish_brew_complete_arg 'formula-analytics' -l homebrew-versions -d 'Output Homebrew versions' +__fish_brew_complete_arg 'formula-analytics' -l install -d 'Output the number of specifically requested installations or installation as dependencies of the formula. This is the default' +__fish_brew_complete_arg 'formula-analytics' -l install-on-request -d 'Output the number of specifically requested installations of the formula' +__fish_brew_complete_arg 'formula-analytics' -l json -d 'Output JSON. This is required: plain text support has been removed' +__fish_brew_complete_arg 'formula-analytics' -l os-version -d 'Output OS versions' +__fish_brew_complete_arg 'formula-analytics' -l quiet -d 'Make some output more quiet' +__fish_brew_complete_arg 'formula-analytics' -l setup -d 'Install the necessary gems, require them and exit without running a query' +__fish_brew_complete_arg 'formula-analytics' -l verbose -d 'Make some output more verbose' + + __fish_brew_complete_cmd 'formulae' 'List all locally installable formulae including short names' __fish_brew_complete_arg 'formulae' -l debug -d 'Display any debugging information' __fish_brew_complete_arg 'formulae' -l help -d 'Show this message' @@ -787,6 +810,13 @@ __fish_brew_complete_arg 'formulae' -l quiet -d 'Make some output more quiet' __fish_brew_complete_arg 'formulae' -l verbose -d 'Make some output more verbose' +__fish_brew_complete_cmd 'generate-analytics-api' 'Generates analytics API data files for formulae.brew.sh' +__fish_brew_complete_arg 'generate-analytics-api' -l debug -d 'Display any debugging information' +__fish_brew_complete_arg 'generate-analytics-api' -l help -d 'Show this message' +__fish_brew_complete_arg 'generate-analytics-api' -l quiet -d 'Make some output more quiet' +__fish_brew_complete_arg 'generate-analytics-api' -l verbose -d 'Make some output more verbose' + + __fish_brew_complete_cmd 'generate-cask-api' 'Generate `homebrew/cask` API data files for https://formulae.brew.sh' __fish_brew_complete_arg 'generate-cask-api' -l debug -d 'Display any debugging information' __fish_brew_complete_arg 'generate-cask-api' -l dry-run -d 'Generate API data without writing it to files' diff --git a/completions/internal_commands_list.txt b/completions/internal_commands_list.txt index b3162e50ae..3711dc41ac 100644 --- a/completions/internal_commands_list.txt +++ b/completions/internal_commands_list.txt @@ -43,7 +43,9 @@ environment extract fetch formula +formula-analytics formulae +generate-analytics-api generate-cask-api generate-cask-ci-matrix generate-formula-api diff --git a/completions/zsh/_brew b/completions/zsh/_brew index 03b75e2567..21582179ad 100644 --- a/completions/zsh/_brew +++ b/completions/zsh/_brew @@ -170,7 +170,9 @@ __brew_internal_commands() { 'extract:Look through repository history to find the most recent version of formula and create a copy in tap' 'fetch:Download a bottle (if available) or source packages for formulae and binaries for casks' 'formula:Display the path where formula is located' + 'formula-analytics:Query Homebrew'\''s analytics' 'formulae:List all locally installable formulae including short names' + 'generate-analytics-api:Generates analytics API data files for formulae.brew.sh' 'generate-cask-api:Generate `homebrew/cask` API data files for https://formulae.brew.sh' 'generate-cask-ci-matrix:Generate a GitHub Actions matrix for a given pull request URL or list of cask names' 'generate-formula-api:Generate `homebrew/core` API data files for https://formulae.brew.sh' @@ -991,6 +993,31 @@ _brew_formula() { '*::formula:__brew_formulae' } +# brew formula-analytics +_brew_formula_analytics() { + _arguments \ + '(--json --setup)--all-core-formulae-json[Output a different JSON format containing the JSON data for all Homebrew/homebrew-core formulae]' \ + '(--install --cask-install --install-on-request --build-error --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run-options --brew-test-bot-test)--brew-command-run[Output `brew` commands run]' \ + '(--install --cask-install --install-on-request --build-error --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run --brew-test-bot-test)--brew-command-run-options[Output `brew` commands run with options]' \ + '(--install --cask-install --install-on-request --build-error --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run --brew-command-run-options)--brew-test-bot-test[Output `brew test-bot` steps run]' \ + '(--install --cask-install --install-on-request --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run --brew-command-run-options --brew-test-bot-test)--build-error[Output the number of build errors for the formulae]' \ + '(--install --install-on-request --build-error --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run --brew-command-run-options --brew-test-bot-test)--cask-install[Output the number of installations of casks]' \ + '--days-ago[Query from the specified days ago until the present. The default is 30 days]' \ + '--debug[Display any debugging information]' \ + '--help[Show this message]' \ + '(--install --cask-install --install-on-request --build-error --os-version --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run --brew-command-run-options --brew-test-bot-test)--homebrew-devcmdrun-developer[Output devcmdrun/HOMEBREW_DEVELOPER]' \ + '(--install --cask-install --install-on-request --build-error --os-version --homebrew-devcmdrun-developer --homebrew-prefixes --homebrew-versions --brew-command-run --brew-command-run-options --brew-test-bot-test)--homebrew-os-arch-ci[Output OS/Architecture/CI]' \ + '(--install --cask-install --install-on-request --build-error --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-versions --brew-command-run --brew-command-run-options --brew-test-bot-test)--homebrew-prefixes[Output Homebrew prefixes]' \ + '(--install --cask-install --install-on-request --build-error --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --brew-command-run --brew-command-run-options --brew-test-bot-test)--homebrew-versions[Output Homebrew versions]' \ + '(--cask-install --install-on-request --build-error --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run --brew-command-run-options --brew-test-bot-test)--install[Output the number of specifically requested installations or installation as dependencies of the formula. This is the default]' \ + '(--install --cask-install --build-error --os-version --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run --brew-command-run-options --brew-test-bot-test)--install-on-request[Output the number of specifically requested installations of the formula]' \ + '(--all-core-formulae-json --setup)--json[Output JSON. This is required: plain text support has been removed]' \ + '(--install --cask-install --install-on-request --build-error --homebrew-devcmdrun-developer --homebrew-os-arch-ci --homebrew-prefixes --homebrew-versions --brew-command-run --brew-command-run-options --brew-test-bot-test)--os-version[Output OS versions]' \ + '--quiet[Make some output more quiet]' \ + '(--json --all-core-formulae-json)--setup[Install the necessary gems, require them and exit without running a query]' \ + '--verbose[Make some output more verbose]' +} + # brew formulae _brew_formulae() { _arguments \ @@ -1000,6 +1027,15 @@ _brew_formulae() { '--verbose[Make some output more verbose]' } +# brew generate-analytics-api +_brew_generate_analytics_api() { + _arguments \ + '--debug[Display any debugging information]' \ + '--help[Show this message]' \ + '--quiet[Make some output more quiet]' \ + '--verbose[Make some output more verbose]' +} + # brew generate-cask-api _brew_generate_cask_api() { _arguments \ diff --git a/docs/BrewTestBot.md b/docs/BrewTestBot.md index f69812b993..2d74f2c439 100644 --- a/docs/BrewTestBot.md +++ b/docs/BrewTestBot.md @@ -3,7 +3,7 @@ logo: /assets/img/brewtestbot.png image: /assets/img/brewtestbot.png redirect_from: - /Brew-Test-Bot -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # BrewTestBot diff --git a/docs/Creating-a-Homebrew-Issue.md b/docs/Creating-a-Homebrew-Issue.md index d9d9e9d3e7..ec2e2025b4 100644 --- a/docs/Creating-a-Homebrew-Issue.md +++ b/docs/Creating-a-Homebrew-Issue.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Creating a Homebrew Issue diff --git a/docs/FAQ.md b/docs/FAQ.md index c269fe7bbe..99cb87f333 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # FAQ (Frequently Asked Questions) @@ -158,10 +158,9 @@ Ensure you have a [local copy of `homebrew/core`](#can-i-edit-formulae-myself), ```sh brew update -brew install hub +brew install gh cd "$(brew --repository homebrew/core)" -hub fetch github_username -hub pr checkout pull_request_number +gh pr checkout pull_request_number ``` ## Why was a formula deleted or disabled? diff --git a/docs/Homebrew-brew-Maintainer-Guide.md b/docs/Homebrew-brew-Maintainer-Guide.md index 8165dfa081..ed60b143df 100644 --- a/docs/Homebrew-brew-Maintainer-Guide.md +++ b/docs/Homebrew-brew-Maintainer-Guide.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Homebrew/brew Maintainer Guide @@ -15,7 +15,7 @@ PRs must meet the following conditions to be merged: - Have at least one maintainer approval. - Have passing CI (continuous integration). This is a _mandatory_ step. PRs with failing CI should _never_ be merged. See the [CI](#ci) section below for more information about `Homebrew/brew` CI. -If possible, PRs should also have GPG-signed commits (see the private `ops` repository for instructions on setting this up). +If possible, PRs should also have [signed commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits). ### Automatic approvals diff --git a/docs/Interesting-Taps-and-Forks.md b/docs/Interesting-Taps-and-Forks.md index 4b7a4e28ce..d91a329bce 100644 --- a/docs/Interesting-Taps-and-Forks.md +++ b/docs/Interesting-Taps-and-Forks.md @@ -1,14 +1,14 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Interesting Taps and Forks A [tap](Taps.md) is Homebrew-speak for a Git repository containing additional formulae. -Homebrew has the capability to add (and remove) multiple taps to your local installation with the `brew tap` and `brew untap` commands; run `man brew` in your terminal for usage information. The main repository at , often called `homebrew/core`, is always built-in. +Homebrew has the capability to add (and remove) multiple taps to your local installation with the `brew tap` and `brew untap` commands; run `man brew` in your terminal for usage information. -Your taps are Git repositories located at `$(brew --repository)/Library/Taps`. +Your taps are Git repositories located at `$(brew --repository)/Library/Taps`. As a normal user, you usually won't see `homebrew/core` here anymore and that's OK - [normal usage is via the JSON API](https://brew.sh/2023/02/16/homebrew-4.0.0/). ## Unsupported interesting taps diff --git a/docs/Kickstarter-Supporters.md b/docs/Kickstarter-Supporters.md index 24d1328285..04d26f375f 100644 --- a/docs/Kickstarter-Supporters.md +++ b/docs/Kickstarter-Supporters.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Kickstarter Supporters diff --git a/docs/Maintainer-Guidelines.md b/docs/Maintainer-Guidelines.md index ce9c91a3e9..1101460d36 100644 --- a/docs/Maintainer-Guidelines.md +++ b/docs/Maintainer-Guidelines.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Maintainer Guidelines diff --git a/docs/Maintainers-Avoiding-Burnout.md b/docs/Maintainers-Avoiding-Burnout.md index 96f425119d..4cb10b07a2 100644 --- a/docs/Maintainers-Avoiding-Burnout.md +++ b/docs/Maintainers-Avoiding-Burnout.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Maintainers: Avoiding Burnout diff --git a/docs/Manpage.md b/docs/Manpage.md index e712c08f71..e799be7bf4 100644 --- a/docs/Manpage.md +++ b/docs/Manpage.md @@ -2281,6 +2281,82 @@ form of *`user`*`/`*`repo`*`/`*`formula`*. Display the path where *`formula`* is located. +### `formula-analytics` + +Query Homebrew's analytics. + +`--days-ago` + +: Query from the specified days ago until the present. The default is 30 days. + +`--install` + +: Output the number of specifically requested installations or installation as + dependencies of the formula. This is the default. + +`--cask-install` + +: Output the number of installations of casks. + +`--install-on-request` + +: Output the number of specifically requested installations of the formula. + +`--build-error` + +: Output the number of build errors for the formulae. + +`--os-version` + +: Output OS versions. + +`--homebrew-devcmdrun-developer` + +: Output devcmdrun/HOMEBREW\_DEVELOPER. + +`--homebrew-os-arch-ci` + +: Output OS/Architecture/CI. + +`--homebrew-prefixes` + +: Output Homebrew prefixes. + +`--homebrew-versions` + +: Output Homebrew versions. + +`--brew-command-run` + +: Output `brew` commands run. + +`--brew-command-run-options` + +: Output `brew` commands run with options. + +`--brew-test-bot-test` + +: Output `brew test-bot` steps run. + +`--json` + +: Output JSON. This is required: plain text support has been removed. + +`--all-core-formulae-json` + +: Output a different JSON format containing the JSON data for all + Homebrew/homebrew-core formulae. + +`--setup` + +: Install the necessary gems, require them and exit without running a query. + +### `generate-analytics-api` + +Generates analytics API data files for formulae.brew.sh. + +The generated files are written to the current directory. + ### `generate-cask-api` \[`--dry-run`\] Generate `homebrew/cask` API data files for . The diff --git a/docs/Migrating-A-Formula-To-A-Tap.md b/docs/Migrating-A-Formula-To-A-Tap.md index 257c14d7cf..961e89cd80 100644 --- a/docs/Migrating-A-Formula-To-A-Tap.md +++ b/docs/Migrating-A-Formula-To-A-Tap.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Migrating a Formula to a Tap diff --git a/docs/New-Maintainer-Checklist.md b/docs/New-Maintainer-Checklist.md index fafd99c803..1661901b9c 100644 --- a/docs/New-Maintainer-Checklist.md +++ b/docs/New-Maintainer-Checklist.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # New Maintainer Checklist @@ -107,15 +107,14 @@ The Project Leader, one other PLC member (ideally a maintainer) and one other TS - Make them owners on the [`machomebrew` private Slack](https://machomebrew.slack.com/admin) - Make them owners on the [`homebrew` private 1Password](https://homebrew.1password.com/people) -When they cease to be am owner, revoke or downgrade their access to all of the above. +When they cease to be an owner, revoke or downgrade their access to all of the above. ## 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) to join the Homebrew GitHub organisation as [members](https://docs.brew.sh/Homebrew-Governance#2-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). When admitted as members: -- Invite them to the [**@Homebrew/members** team](https://github.com/orgs/Homebrew/teams/members), to give them access to the private governance repository. - Invite them as a single-channel guest to the #members channel on the [`machomebrew` private Slack](https://machomebrew.slack.com/admin/invites) (and ensure they've read the [communication guidelines](Maintainer-Guidelines.md#communication)) and ask them to use their real name there (rather than a pseudonym they may use on e.g. GitHub). - Add them to the current year's membership list in the [governance archives](https://github.com/Homebrew/brew/tree/master/docs/governance). diff --git a/docs/Prose-Style-Guidelines.md b/docs/Prose-Style-Guidelines.md index 3839eae019..8b7703c493 100644 --- a/docs/Prose-Style-Guidelines.md +++ b/docs/Prose-Style-Guidelines.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Prose Style Guidelines diff --git a/docs/Querying-Brew.md b/docs/Querying-Brew.md index d9f1cf44dc..2322112133 100644 --- a/docs/Querying-Brew.md +++ b/docs/Querying-Brew.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Querying `brew` diff --git a/docs/Rakefile b/docs/Rakefile index 4d76f69297..9d58bcb719 100644 --- a/docs/Rakefile +++ b/docs/Rakefile @@ -12,6 +12,8 @@ end desc "Run Markdownlint to validate the Markdown style." task :lint do sh "mdl $(git ls-files '*.md' | grep -v 'Manpage.md')" + sh "grep -L '^last_review_date:' $(git ls-files '*.md' | grep -v 'Manpage.md') | " \ + "xargs -I {} echo 'File {} is missing last_review_date frontmatter.'" end desc "Run HTMLProofer to validate the HTML output." diff --git a/docs/Typechecking.md b/docs/Typechecking.md index a4eaa0b95e..a7599ea936 100644 --- a/docs/Typechecking.md +++ b/docs/Typechecking.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Type Checking With Sorbet diff --git a/docs/Updating-Software-in-Homebrew.md b/docs/Updating-Software-in-Homebrew.md index 4aa1199dc6..1702dddf60 100644 --- a/docs/Updating-Software-in-Homebrew.md +++ b/docs/Updating-Software-in-Homebrew.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Updating Software in Homebrew diff --git a/docs/index.md b/docs/index.md index 679b769d10..5b71e7e8b1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,5 +1,5 @@ --- -last_review_date: "1970-01-01" +last_review_date: "2025-02-08" --- # Documentation diff --git a/manpages/brew.1 b/manpages/brew.1 index 7a7755e8ce..d4567eb9ca 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -1448,6 +1448,60 @@ Extract the specified \fIversion\fP of \fIformula\fP instead of the most recent\ Overwrite the destination formula if it already exists\. .SS "\fBformula\fP \fIformula\fP \fR[\.\.\.]" Display the path where \fIformula\fP is located\. +.SS "\fBformula\-analytics\fP" +Query Homebrew\[u2019]s analytics\. +.TP +\fB\-\-days\-ago\fP +Query from the specified days ago until the present\. The default is 30 days\. +.TP +\fB\-\-install\fP +Output the number of specifically requested installations or installation as dependencies of the formula\. This is the default\. +.TP +\fB\-\-cask\-install\fP +Output the number of installations of casks\. +.TP +\fB\-\-install\-on\-request\fP +Output the number of specifically requested installations of the formula\. +.TP +\fB\-\-build\-error\fP +Output the number of build errors for the formulae\. +.TP +\fB\-\-os\-version\fP +Output OS versions\. +.TP +\fB\-\-homebrew\-devcmdrun\-developer\fP +Output devcmdrun/HOMEBREW_DEVELOPER\. +.TP +\fB\-\-homebrew\-os\-arch\-ci\fP +Output OS/Architecture/CI\. +.TP +\fB\-\-homebrew\-prefixes\fP +Output Homebrew prefixes\. +.TP +\fB\-\-homebrew\-versions\fP +Output Homebrew versions\. +.TP +\fB\-\-brew\-command\-run\fP +Output \fBbrew\fP commands run\. +.TP +\fB\-\-brew\-command\-run\-options\fP +Output \fBbrew\fP commands run with options\. +.TP +\fB\-\-brew\-test\-bot\-test\fP +Output \fBbrew test\-bot\fP steps run\. +.TP +\fB\-\-json\fP +Output JSON\. This is required: plain text support has been removed\. +.TP +\fB\-\-all\-core\-formulae\-json\fP +Output a different JSON format containing the JSON data for all Homebrew/homebrew\-core formulae\. +.TP +\fB\-\-setup\fP +Install the necessary gems, require them and exit without running a query\. +.SS "\fBgenerate\-analytics\-api\fP" +Generates analytics API data files for formulae\.brew\.sh\. +.P +The generated files are written to the current directory\. .SS "\fBgenerate\-cask\-api\fP \fR[\fB\-\-dry\-run\fP]" Generate \fBhomebrew/cask\fP API data files for .UR https://formulae\.brew\.sh