v0.21.4
What's new
Fixed
- The overflow menus open where you can see them.
Internal
- The test suite cleans up after itself.
Full notes
Fixed
- The overflow menus open where you can see them. Four controls did nothing at all when clicked
(#15): the file viewer's View options⋮,
which is the only home word wrap has ever had, the Changed-files and History view-options
sliders, the branch switcher, and the recent commit messages history button. Every one of
them really did open.aria-expandedwenttrue, every item was in the DOM, nothing was logged,
and the menu was drawn attranslate(0, -200%), two menu-heights above the top of the window. On
a 1600x900 desktop the file viewer's menu measured its top edge at -594px. Neither the markup
nor the console said anything was wrong, which is how it survived four releases and one previous
fix attempt.
The cause is one line of nesting. reka'sMenuRoot,PopoverRootandTooltipRooteach render a
PopperRoot, whichprovides the anchor its popper positions against, and every trigger
registers itself throughPopperAnchor, whichinjects the nearest one. With the menu
wrapped around its tooltip, the menu's own trigger sat inside the tooltip and handed its
anchor to the tooltip's root, while the menu's content, which sits outside the tooltip, injected
a root that no longer had one. Floating UI never received a reference element, so it never
positioned anything. The earlier attempt added an inert<span>between the twoas-child
triggers. That is a real and separate bug, but it could not touch this one: this half is
provide/injectnesting, not DOM attribute merging. Each menu now lives inside its
tooltip's trigger, so its own root is the nearest for both halves. A newcheck:popperguardrail
fails the build on the old shape, because no component test can catch it: jsdom has no layout, so
an off-screen menu passes every assertion an on-screen one does.
Internal
- The test suite cleans up after itself. Nothing shipped to users changes, since the daemon's
own scratch directories were always removed infinallyblocks, but running the suite leaked
directories on developer machines, in two separate ways, and had done since the scratch helper
was introduced. Locally that came to 1,673,606 files across 46,854 directories in.testtmp/
between 2026-07-27 and 2026-08-15, plus 1,408 directories and 31,774 files in the real
%TEMP%from two days of runs. Only a few gigabytes; the damage is the file count, which slows
every tool that walks the working tree and takes an age to delete once grown. CI never noticed
because GitHub runners are destroyed after each job, so the entire cost landed on contributors.
First cause:tests/helpers/scratch.tsmoved scratch out of the OS temp directory (it had to,
becauseisUnderTempDirrefuses to import a repo from there) and, in doing so, silently gave up
the reaping the OS had been doing for free, without replacing it..testtmp/is gitignored, so no
git-based check could see it either. Scratch now lives under a per-run subdirectory that is torn
down when the run ends, and a run killed before its teardown is swept by the next run rather than
left forever. Second cause: the migration to that helper was never finished. Sixteen test files
still built fixtures directly under%TEMP%with no cleanup, and%TEMP%\gm-*repositories are
the exact shape of the ~115 junk rowsisUnderTempDirandpruneTempReposexist to clean up. All
sixteen now usemkScratchDir.tests/db-temp-guard.test.tsstill uses a real temp path, because
proving the guard fires there requires one, but it now records every directory it creates and
removes them. A newcheck:testscratchguardrail fails the build if a test reaches for the OS
temp directory again.
Install
Download the bundle for your platform, extract the whole folder, and run the RepoYeti executable.
No install step or runtime is required; keep the bundled web folder beside the executable.
| Platform | Asset |
|---|---|
| Linux (x64) | repoyeti-linux-x64.tar.gz |
| macOS (Apple silicon) | repoyeti-macos-arm64.tar.gz |
| Windows (x64) | repoyeti-windows-x64.zip |
Source checkouts can update in-app. Portable-bundle installs update by downloading and extracting
the newer archive; nothing is installed without your say-so.
Full history: CHANGELOG.md
Full Changelog: v0.21.3...v0.21.4