`Cask::Migrator.migrate_if_needed` determined the token to migrate from
the new cask's installed caskfile, but that lookup checks the new token
before any old tokens. When both the old and the new cask were installed,
it always found the new cask's own caskfile, decided nothing needed
migrating and left the old cask's Caskroom directory in place. That
directory then loaded as the cask it was renamed to, so the same cask was
listed, reported as outdated and upgraded twice.
Instead, migrate every old token that still has its own Caskroom
directory. When the new cask is already installed under its own token the
old cask is a separate installation that cannot be moved to the new
token, so uninstall it (loaded from its own installed caskfile, so that
its own artifacts are the ones removed) and leave behind the same symlink
that a migration would.
Casks that are renamed into each other can share artifacts, so skip any
artifact that the new cask installs too: uninstalling those would remove
them from the new cask, which stays installed.
Also deduplicate `Cask::Caskroom.casks` so that an old token which has
not been migrated yet cannot list the same cask twice.
pip_report odies unless $CHILD_STATUS.success?. The new specs stub
popen_read, so $? reflects an unrelated prior subprocess and the specs
SystemExit on some orderings. Force success with a leading `true`, as
the existing filter spec already does.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A package specified with extras (e.g. foo[bar]) must keep them so the
extra's dependencies still resolve. Pass the exempt main package as a
PEP 508 direct reference (name[extras] @ url) rather than a bare URL.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
`brew style` needs to install Homebrew/core formulae to run, but
portable Ruby PRs run on Tier 3 machines resulting in attempting to
source build multiple formulae and failing.
For now, skip `brew style` when bottles are not available (i.e. for
macOS machines). We can consider splitting workflow to 2 separate
runners if we want to test this, i.e. bottling on Tier 3 while running
further tests on Tier 1.
- Avoid repeated Gatekeeper prompts by inheriting approval only when
the new app satisfies the old app's designated requirement.
- Preserve quarantine provenance and validate identities through
Security.framework without invoking `codesign`.
- Keep relocated bottles on the current `codesign` path; link its
eventual removal to `Homebrew/ruby-macho#997` pure-Ruby signing.
- Keep `release!` for explicit no-quarantine downloads and remove the
FFI rollout TODOs only after their trials are complete.
- Allow Bubblewrap user namespaces in generated GitHub Actions
container jobs.
- Report the matching container configuration when a GitHub Actions
container prevents sandbox setup.