- Support MDM/Munki/Jamf runs where the parent process is root but
Homebrew must execute as the logged-in macOS console user.
- Keep the nested operation constrained to `HOMEBREW_BREW_FILE` so this
helper cannot become a general-purpose root command launcher.
- Share `macos_user.sh` with installer scripts so no-user and package
plist fallback behaviour cannot drift between install paths.
- Stage `macos_user.sh` for `pkgbuild` because `preinstall` needs the
resolver before the Homebrew payload has been installed.
- Use dry-run-style `--ask` plans for install and reinstall commands.
- Make single-package operations proceed without a prompt e.g. if you
`brew install foo` and there's no dependencies or dependents to install:
just install without the prompt.
- Keep prompting when dependencies or dependents change the plan.
- Avoid suggesting internal aliases because they duplicate canonical commands.
- Keep alias expansion for option completion after users type an alias.
- Regenerate bash, fish, zsh and internal command completion data.
- Treat `brew bundle upgrade` as an `install` alias so install-only
switches like `--force` remain valid.
- Use `alias_options` to imply `--upgrade` without keeping a separate
`UpgradeSubcommand` path.
- Regenerate completions and manpages so docs match parser behaviour.
- Ensure we do not accidentally include gems with licences we do not
agree with.
- Run the Homebrew `licensed` formula in the vendor-gems workflow so
CI fails when a Bundler gem has an unapproved licence or stale cache
record.
- Keep `licensed` outside `Library/Homebrew/Gemfile` so all-groups
Bundler installs do not need its native dependencies.
- Use an isolated Homebrew formula cache key and allow cleanup of any
existing formulae before installing `licensed` for CI.
- Vendor the current `.licenses` cache so future dependency updates
have an explicit review baseline.
- Mark generated licence, Sorbet RBI and Bundler files as generated.
- Restore regular API cache files during package builds until
`internal` API installs are the default.
- Merge packaged API cache contents so existing `api/internal`
directories do not break package reinstalls.
- Avoid prompting for `brew upgrade --ask` when the dry-run plan
has no version changes.
- Keep the ask-flow regression explicit so the prompt still appears
when there are upgrades.
- Avoid overwhelming `UsageError` output for commands with subcommands.
- Keep root command help to subcommand summaries and root flags.
- Reuse parser metadata so matched subcommands show valid flags only.
- Group generated manpage options with their matching subcommands.
- Scope generated shell completions to root and subcommand flags.
- Use operation-specific flag text in help, manpages and completions.
- Let `ensure_installed!` reuse matching system executables for tools.
- Keep `latest: true` as the only path that validates executable versions.
- Avoid installing brewed `git`, `bat` and style tools when PATH is enough.
- Mount the host filesystem read-only in the Bubblewrap namespace to match
macOS sandbox behaviour, so source builds see the same formula, API cache
and runtime paths as the parent.
- Remove `HOMEBREW_NO_INSTALL_FROM_API` build and test workarounds; those hid
missing Linux sandbox reads instead of fixing the namespace.
- Memoise `Sandbox.state` so a check runs the Bubblewrap probe once, and clear
it when sandbox setup changes the host configuration.
- Share Linux sandbox `sysctl` settings as a typed struct between doctor
diagnostics, GitHub Actions `brew tests` and `brew test-bot` setup.
- Apply `Sandbox.configure!` during `brew tests` and `brew test-bot` on GitHub
Actions when `$HOMEBREW_SANDBOX_LINUX` is enabled.
- Let `Sandbox.configure!` install the `bubblewrap` formula when no system
`bwrap` is present, while Docker containers can keep using their package.
- Disable `$HOMEBREW_SANDBOX_LINUX` during GitHub Actions `brew test-bot`
setup if the host still cannot create a Bubblewrap sandbox.
- Tailor doctor output for missing, setuid and unusable Bubblewrap, leaving
`$HOMEBREW_NO_SANDBOX_LINUX` as the final workaround.
- Add `$HOMEBREW_NO_SANDBOX_LINUX` as a last-resort opt-out and make it
override `$HOMEBREW_SANDBOX_LINUX`.
- Use `bzip2 -d` for `.bz2` extraction so fixture installs no longer depend on
a separate `bunzip2` executable being present.
- Ignore `brew irb` stderr in its coverage integration test, because Linux can
warn when `irb` reloads the native `io-console` extension.
- Small state/action commands should use the same parser API.
- Keep the legacy analytics UUID command visible but marked for removal.
- Refresh generated manpages and completions after all conversions.
- `brew bundle` needs each action to own its options and usage.
- Keep shared Brewfile, type and install context in one place.
- Move existing behaviour into command-shaped subcommand classes.
- Prevent `upgrade --ask` from repeating bottle manifest headings
when the prompt already fetched valid bottle manifests
- Validate cached bottle manifests quietly before skipping queue work
so corrupt caches are cleared and retried through existing fetch logic
- Add `HOMEBREW_NO_ASK` as a documented no-op placeholder
until ask mode becomes the default in a later release
- Avoid global path stubs affecting Bundle dump formula setup
- Cover cached manifest handling in `upgrade` and `FormulaInstaller`
- Stop downloading `executables.txt` when JSON has no entries.
- Remove stale cached executable data when JSON has no entries.
- Tolerate concurrent executable cache removal during tests.
- Require generated API JSON to carry executable data.
- Keep GitHub Packages as the API generation input only.
- Avoid fetching `executables.txt` as a separate API artefact.
- Populate generated JSON from GitHub Packages metadata.
- Keep `which-formula` data generated from active formula JSON.
- Fall back to GitHub Packages data during the JSON transition.
- Drop obsolete `--skip-update` command options.
- Keep stale `HOMEBREW_BOOTSNAP_GEM_PATH` from breaking coverage runs.
- Use the correct Linux mtime check for the executables database.
- Use `bwrap` to translate shared sandbox rules into rootless
namespace execution.
- Gate the backend behind `HOMEBREW_SANDBOX_LINUX` while the Linux
policy is still experimental.
- Keep macOS on its existing `sandbox-exec` path while Linux uses shared
executable lookup for `bwrap`.
- Auto-install `bubblewrap` from `homebrew/core` when the sandbox is
enabled and no system or usable brewed binary is found.
- Prefer a usable system `bwrap` from `ORIGINAL_PATHS` over a brewed
one so distribution-provided binaries are used when available.
- Find brewed `bwrap` from `HOMEBREW_ORIGINAL_BREW_FILE` so integration
subprocesses still use the Linux sandbox.
- Preserve `Sandbox#run`'s tmpdir cwd inside the `bwrap` namespace and
suppress Linux PTY thread warnings after sandboxed children exit.
- Expose formula, Homebrew library and Linux runtime paths as read-only
binds so sandboxed source builds can run with vendored Ruby.
- Keep synthetic test formula installs off the API so sandbox CI does
not require network during local formula setup.
- Avoid creating optional prefix `var` directories just to configure a
test sandbox and remove empty Linux bind placeholders after runs.
- Require a working rootless `bwrap` on GitHub Actions and install the
system `bubblewrap` package before Linux tests run.
- `brew services` needs per-action options for useful completions.
- Move each service action beside its parser declaration.
- Keep shared daemon, sudo and target setup in the dispatcher.
- Reuse dry-run upgrade planning for `--ask` so users see
the same package list before choosing whether to continue.
- Suppress dependency and dependent dry-run sections when they
duplicate the final `outdated packages` summary.
- Include available formula bottle download sizes inline in the
dry-run package list.
- Keep `--ask` prompts default-no and ahead of downloads.
- Avoid parallel `brew bundle` installs racing over recursive formula locks.
- Match `FormulaInstaller#lock` so bottle pours wait on shared build deps.
- Cover shared build-only deps in `installer_spec.rb`.
- Homebrew commands need parser-owned nested actions for help and
completions.
- Keep this first step behaviour-neutral for existing commands.
- Add focused tests for subcommand args, option scoping and metadata.
- `brew pin` should cover casks now that upgrades skip both package types.
- Cask pin records keep list, info and upgrade output consistent.
- `auto_updates true` casks need a warning because app updaters bypass Homebrew.
- Keep `livecheck` resources out of PyPI resource rewrites so
manually managed downloads are not removed.
- Add generated `mirror` stanzas as Ruby source so raw URLs do not
trip AST parsing when opening bump PRs.
- Cover the regressions without adding new integration specs.
- Keep public API validation in the same `brew style` path that
contributors already run locally.
- Remove the CI-only script so list drift fails before a workflow-only
syntax job.
- Tie cookbook and documentation checks to the cops that own their rules.
- Let scripts and CI snippets declare temporary formula tools with `--formulae`
- Keep provider lookup available when `--formulae` is omitted
- Preserve `--skip-update` for cached executable database use
- Normalise comma-separated `--formulae` entries before installing
- Avoid Homebrew command completions for arbitrary executable names
- Explain why `brew bundle check --verbose` is useful when the fast
check fails and describe the output as unmet dependencies.
- Pass `--check` through to `brew bundle exec`, `sh` and `env` so
the documented option is honoured.
- Cover `--check` and `HOMEBREW_BUNDLE_CHECK` dispatch in
`cmd/bundle` tests.
- Document `version_file:` because projects use it to sync runtime
version files.
- Directs readers to the shared `Homebrew/.github` policy so scope
changes live in one place.
- Uses the default-branch `HEAD` link to avoid pinning the branch name.
- Keep `lib/cps` and `share/cps` as merged prefix dirs so
multiple formulae can ship `.cps` metadata without conflicts.
- Include `.cps` in pretty library listings.
- Document CMake discovery for keg-only dependencies.
- Record `HOMEBREW_VERSION`, bottle tag and generation time in
internal package payloads so consumers can identify the file loaded.
- Cover the generated `metadata` payload for a representative tag.
- Isolate the spec from API-generation globals so randomised suites keep
normal path placeholders.
- Explain `brew bundle dump` as the existing installed-state snapshot
workflow so users do not look for a separate command.
- Document restoring from a `Brewfile` in command help and generated
manpages.
- avoid forcing casks with arch-specific macOS requirements into a
bare top-level marker that cannot express their real minimum OS
- preserve per-arch minimum OS data so audit does not report a false
missing minimum after style autocorrection
- keep mixed macOS/Linux casks from losing macOS CI coverage when
runner selection samples Linux runners for the same architecture
- Formula installs should reject forbidden formulae and taps before
Source API or bottle fetches can be queued.
- This mirrors the cask fail-fast path and avoids network work when
policy already prevents installation.