Vendor the pacman-packages block - #3050
Conversation
pacman satisfies a declared name from any installed provider, but mise matches names exactly, so a provider-satisfied declaration reads as missing and pacman is handed a conflicting install. Vendor the shared block so the packages phase skips declarations pacman already considers satisfied, keeping the fleet's setup shape identical across apps. fizzy declares no mysql client, so the block is inert here today; it is vendored for shape parity.
Re-vendors the corrected pacman-packages block. Reading the status run through a process substitution swallowed its failure, so a broken run reported every declared package installed instead of aborting, and a pacman error read as "missing" rather than as a failure to answer.
There was a problem hiding this comment.
Copilot wasn't able to review any files in this pull request.
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Re-vendors the corrected pacman-packages block. mise bootstrap packages status takes no --manager and reports every manager, so failing on its exit status let an unrelated manager's failure abort a pacman run. Abort only when pacman rows are missing too.
|
Updated — re-vendors the corrected
Vendored copy re-audits |
Re-vendors the corrected pacman-packages block. status renders a pin as name@version, which is not the dependency syntax pacman -T reads, and pacman cannot install a pinned version — so a satisfied pin read as missing and pacman was handed an operand it cannot resolve.
|
Updated — re-vendors the corrected
No repo in the fleet pins a pacman package today, so this is latent rather than active. Vendored copy re-audits |
Re-vendors the corrected pacman-packages block. status takes no --manager and gives up on the first manager that errors, so an unrelated manager could abort a pacman run. Scope the query with the setting's own env var so excluded managers are never queried.
|
Updated — re-vendors the corrected
Vendored copy re-audits |
Vendors the shared
pacman-packagesblock so any already-installed provider is accepted.Why
pacmansatisfies a declared name from any installed provider, and answers under the provider's name. mise matches names exactly, so a provider-satisfied declaration reads as missing and mise hands pacman a package that conflicts with the provider already installed —mariadb-clients,mariadb-lts-clientsandpercona-server-clientsall providemysql-clientsand all own/usr/bin/mysql, so pacman refuses to add a second andbin/setupaborts.Reported upstream as jdx/mise#12181 and fixed by jdx/mise#12183, which is merged to mise master but not in any release yet (latest is v2026.8.8, from before the merge).
Why the block is still needed after that lands
The provides are asymmetric.
percona-server-clientsprovidesmariadb-clients, but nothing provides percona's own name:So declaring percona is unsatisfiable for anyone already running mariadb-clients, no matter how well mise resolves provides. The block tests the
mysql-clientsvirtual instead, which every provider satisfies.Declaring the virtual directly instead was considered and rejected: on a fresh box
pacman -S --noconfirm mysql-clientsresolves to mariadb-clients, so it would silently stop being percona on new machines.Shape
The block is canonical in shipyard (
share/setup-blocks/pacman-packagesv1) and vendored here byte-for-byte, per the standalone constraint — app setups run on fresh machines before any shipyard checkout exists. It defines functions only, at column 0, so the same bytes vendor into every app regardless of how each one indents its call site.bin/audit-fleet-setupcovers it.Verified
audit_blockreportscleanagainst the canonical copy.bash -n bin/setuppasses.test/mise-floor-test'sexpected_split, andmise bootstrap packages applystill appears exactly twice (one in the block, one in the else arm).test/pacman-packages-testin shipyard, which runs the extracted canonical bytes against pacman/mise shims — including the asymmetry case. That test was mutation-checked: deleting themysql-clientsrewrite makes it fail.bin/setupwas not run end to end.fizzy declares no mysql client, so the block is inert here today —
pacman:mariadb-libsis the connector library, which percona neither provides nor conflicts with. It is vendored for shape parity:test/mise-floor-testasserts every app's pacman split is identical, so fizzy has to move with the fleet.Depends on basecamp/shipyard#175, which carries the canonical block and its test.