0.23.0

Released 2026-10-28

Changed

  • config.platform.php no longer chooses the PHP that runs. From 0.19 to 0.22, viv run, viv exec and viv x used the static PHP build matching config.platform.php even with a php on PATH, and viv install, viv update, viv require, viv remove, viv new, viv diagnose and viv lock merge read extensions from it. Composer uses that key only to tell the solver which PHP to resolve for, so a project with its own PHP, such as a CI job with Xdebug for coverage, lost that PHP's extensions. viv now uses the php on PATH, and the project's static build comes from a new key, extra.viv.php (8.4 or 8.4.17), which makes every one of those commands use the matching build in place of the php on PATH, installing it on first use except with --offline. viv php install <version> writes extra.viv.php and leaves config.platform.php alone. If you relied on the managed build in 0.19 to 0.22, run viv php install <version> or add extra.viv.php to composer.json; the config.platform.php that viv php install wrote earlier still pins the PHP version the solver resolves for, so you may want to remove it. With no extra.viv.php and no php on PATH, the warning and the refusal note say to set extra.viv.php or run viv php install <version> (#397)

Fixed

  • A php that does not answer the platform probe no longer blocks viv install, viv update, viv require, viv remove and viv lock merge for as long as it runs. viv kills that php after 30 seconds and fails with an error that names the php path, the limit and VIV_PHP_PROBE_TIMEOUT; viv lock merge reports it in its conflict-marker warning. A slow php.ini or a broken extension can make php hang, which is one possible cause of the 87-minute viv lock merge hang. Set VIV_PHP_PROBE_TIMEOUT to a number of seconds to change the limit, or to 0 to turn it off; any other value is an error. viv diagnose still waits on php -r for its own php: line without a limit (#368)
  • viv lock merge gives up after 10 minutes instead of blocking git merge for as long as it runs; one run hung for 87 minutes without a known cause. On timeout it prints one line on stderr that names VIV_LOCK_MERGE_TIMEOUT, exits 1 and leaves the ours file (%A) as git passed it, so git reports a conflict. Set VIV_LOCK_MERGE_TIMEOUT to a number of seconds to change the limit, or to 0 to turn it off; any other value is an error. The limit does not kill child processes, but the platform probe kills a hung php itself after 30 seconds, so only a lower VIV_LOCK_MERGE_TIMEOUT leaves one running after viv exits (#368)
  • The x86_64-unknown-linux-gnu release binary, and the .deb built from it, runs on x86_64 CPUs without AVX. The 0.22.0 build died with SIGILL (exit 132) on viv --version on such a CPU, such as an Intel Pentium J5005, because the release runner's newer GCC compiled the C code of aws-lc-sys with AVX instructions. The release workflow now compiles that C code for baseline x86-64, builds on Ubuntu 24.04, and runs each x86_64 Linux binary under qemu-x86_64 -cpu Nehalem (SSE4.2, no AVX) before packaging it. The musl binary was not affected (#396)