Repository navigation
Arbor v0.2.0 (Alpha) — Squash merges recognised, every deletion shown first, and a stress-tested core
This release comes out of a round of stress testing: the real application driven with mouse and keyboard through every feature on real Git repositories, the command line interrupted, raced and misused, and the result reviewed twice more before it went out. It fixes what that found, and adds what was most missed.
Recommendations
- A squashed or rebased branch counts as merged without asking GitHub. Until now a branch was merged only when the default branch had its very commits, so most pull requests, which are squashed, were never recommended unless the GitHub check was on. Arbor now finds the commit a branch was squashed into, or the copies of its commits, and says which. A match has to be exact: Git's own comparison passes over white space, so each is confirmed by one that does not. Nothing is written to the repository. It needs Git 2.39 on the machine being scanned.
- A worktree with refs of its own (
refs/worktree), with a path that is not valid text, or whose repository names a filter program Arbor will not run, is never a clean delete.
Deleting
- Deleting several worktrees shows every one of them first, with its full path, size and what deleting it means. The native dialog it replaces had room for five and said "and 25 more". Where nothing would be discarded that review is the only question; where something would, the question about discarding is still asked by name.
- Ticks survive a search, another view or a closed folder, so a selection can be gathered over several searches. The selection bar says how many are not shown, and anything out of view is always listed before it is deleted.
- A long deletion can be stopped. Arbor finishes the worktree it is on and leaves the rest.
- The Git command that deletes is no longer limited to thirty seconds and is no longer interrupted, by Stop, by quitting or by Ctrl-C. Either one could leave a worktree half deleted.
- A worktree with a read-only folder in it, or inside one, is refused whole before anything is touched. Git would otherwise delete what it could and forget the worktree.
- A clean worktree that is only locked or detached is no longer asked about as "Discard local files".
- What a deletion reports is more exact: a folder that had already gone is not counted as space recovered, and the branch a detached worktree's commits were kept on is named.
The window
- With no SSH host added there is only This computer: no "All hosts", and no extra level in the list.
- The sort order and the machine showing are remembered. Sorting by size or last activity orders the folders too, so the first row is the largest or the stalest there is.
- A saved list from an earlier day says so above its rows, with Refresh beside it.
- A narrow window keeps each row's age and size, on its second line.
- A folder that does not exist is refused in Settings and in setup before it is saved. Settings has its own Stop for a scan that is in its way.
- The menu bar's commands are disabled when the buttons that do the same are.
- Keyboard: Page Up and Page Down, Down from the search into its results, a Keyboard Shortcuts page in the Help menu, and the keyboard is no longer left on nothing after setup, after the last row is deleted, or on Stop.
- Screen readers: each row has one short name, a search says how many rows it left, and an error is not read out again each time the list is sorted.
- Names with characters that hide or reverse text are shown with a mark in the list, as they already were in the review.
- The list is several times faster with a thousand worktrees and more.
The command line
--older-than 30dforlistandclean, checked again at the moment of removal, for unattended use.--sort name|size|activity, and--strictto fail when a scan was incomplete.- The table fits the terminal, sizes are aligned and written as the app writes them, a clean worktree that is not merged is called "not merged", and the last line says what can be done next.
- Usage errors exit with status 2; failures while working stay 1.
arbor remove PATHrefuses a path that is itself a symbolic link. A malformed--excludeis an error, not a crash.--headgiven empty is refused.
Scanning
- Looking at a worktree runs nothing that its repository names: filter programs in a repository's own configuration are now switched off for Arbor's Git commands, as hooks and the file-system monitor already were. Git LFS still runs.
Tests
- 87 scenarios drive the real application on real repositories (
npm run test:e2e), a stress suite does the same for the command line (npm run test:stress), and both run in CI.