• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

elixir-gettext / gettext / 888917e1e9e6af5b0f6c79bf7e502ab5532278ef-PR-436
93%
main: 93%

Build:
Build:
LAST BUILD BRANCH: parallel-locale-merge
DEFAULT BRANCH: main
Ran 10 Jun 2026 02:10PM UTC
Jobs 1
Files 18
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

10 Jun 2026 11:33AM UTC coverage: 92.693% (+0.02%) from 92.672%
888917e1e9e6af5b0f6c79bf7e502ab5532278ef-PR-436

Pull #436

github

oliver-kriska
Parallelize locale merging in mix gettext.merge

mix gettext.merge processes locales sequentially, but each locale's
merge is fully independent: every locale task writes only to its own
<pot_dir>/<locale>/LC_MESSAGES/*.po files, the POT files at the root of
pot_dir are only read, and Gettext.Merger is stateless (pure functions
over Expo structs). Switch merge_all_locale_dirs/3 to Task.async_stream
over locales, mirroring the existing Task.async_stream over POT files
within a locale in merge_dirs/5.

The return value change (list -> :ok via Stream.run/1) is safe: the
only caller is merge_messages_dir/3, whose result is discarded in
run/1. The --locale single-locale path is untouched. A crashed locale
task raises out of Stream.run/1, matching the sequential version's
failure behavior. Mix.shell() output is GenServer-backed, so concurrent
lines serialize correctly; the only observable change is that progress
lines from different locales can interleave, as already happens in
Gettext.Compiler's parallel paths.

Benchmark on a 16-locale / 11-domain Phoenix app (160 PO files, ~4,700
msgids, Elixir 1.20.1 / OTP 29, Apple Silicon):

    mix gettext.merge priv/gettext --no-fuzzy

    before: 9.4s wall (55% CPU)
    after:  1.9-2.4s wall (341-381% CPU)

~4.9x speedup with byte-identical output files (clean git status over
committed PO state after both runs). The win scales with locale count.
Pull Request #436: Parallelize locale merging in mix gettext.merge

3 of 3 new or added lines in 1 file covered. (100.0%)

647 of 698 relevant lines covered (92.69%)

26.7 hits per line

Jobs
ID Job ID Ran Files Coverage
1 888917e1e9e6af5b0f6c79bf7e502ab5532278ef-PR-436.1 10 Jun 2026 02:10PM UTC 18
92.69
GitHub Action Run
Source Files on build 888917e1e9e6af5b0f6c79bf7e502ab5532278ef-PR-436
  • Tree
  • List 18
  • Changed 1
  • Source Changed 0
  • Coverage Changed 1
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Pull Request #436
  • PR Base - main (#7D09152F...)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc