fix: run gettext after dialyzer so they stop sharing _build - #97
Merged
Conversation
Picks up the fix for CVE-2026-64941, an open redirect in Phoenix.LiveView.validate_local_url!/2 via ASCII tab, LF and CR. Pulls phoenix 1.8.10 alongside it as a co-requisite.
`mix gettext.extract --check-up-to-date` force-recompiles the project so the gettext macros re-expand. A forced recompile empties `_build/dev/lib/bb_example_wx200/ebin` and `.../consolidated` for a second or two before refilling them, and `ex_check` was running that tool alongside `mix dialyzer`. Elixir's build lock serialises the two compiles, but not dialyzer's beam reads, which happen after it releases the lock. When the wipe lands in that phase, dialyzer either fails to read a consolidated protocol beam or enumerates an empty ebin and halts with "No .beam files to analyze". Making `gettext` depend on `dialyzer` moves the forced recompile to the end of the run, when nothing else is reading the build directory.
This was referenced Aug 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Make the
gettexttool in.check.exsdepend ondialyzeras well asex_unit, somix gettext.extractno longer runs alongsidemix dialyzer.Why
mix gettext.extract --check-up-to-datere-expands the gettext macros byforce-recompiling the project (
mix compile --force-elixir+mix compile.elixir --force). A forced recompile empties_build/dev/lib/bb_example_wx200/ebinand.../consolidatedbefore refillingthem. Measured locally, that window is about two seconds:
ex_checkwas running that tool in parallel withmix dialyzer. Elixir's buildlock serialises the two compiles, but dialyzer reads beams after it releases
the lock — first when checking the PLT, then when it globs the ebin to build its
file list. If the wipe lands in either phase, dialyzer fails:
This is what has been failing the
bb_example_wx200job in bb's TestSubprojects workflow (beam-bots/bb#245). That workflow deletes
_build/*/*.plt.hashbeforemix check, which forces dialyxir's full PLTre-check — turning a sub-second exposure into a ~20 second one, so the collision
happens nearly every run there.
bb_example_so101has the same pair of toolsand fails the same way (a fix for it is on its own branch).
Verification
Locally, with
BB_VERSION=localand the PLT hash deleted to match bb's CI:Before —
mix gettext.extractoverlappingmix dialyzerreproduces thefailure above byte for byte, including the same
Elixir.Collectable.beamandthe empty
files: [].After —
mix check --no-retryputs the forced recompile in the last threeseconds of the run, after dialyzer has finished:
mix check --no-retrypasses;reusefails only on this machine, wherepipxisn't on the asdf path.
The
deps: [:ex_unit, :dialyzer]restates:ex_unitbecauseex_checkreplacesthe option rather than merging it.