Two defects in the in-place progress line introduced with the reporting
work:
- started() only ran for repositories that actually synced, but
finished() decrements for every repository that records a result. Any
repository skipped by the eligibility or pre-sync checks therefore
decremented a counter it had never incremented, so the running "active"
count went negative and was displayed as such. Count a repository as
active before the skip checks can exit.
- clear() mutates the line width but ran under outputMu, while draw()
mutates the same field under the progress mutex. With parallel jobs one
worker could erase the line while another repainted it. Route clear()
through the same lock, keeping outputMu around the surrounding writes.
Verified by reverting the first fix and watching the new test report
"active = -3".
🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
hub sync silently dropped any local branch whose upstream it could not
resolve: it cleared its internal remote branch while leaving the "gone"
flag false, so neither the update nor the delete path ran. A run could
then print "Already up to date" having done nothing, which is why a
workspace-wide sync looked like it worked when it did not.
- report unmatched branches as UNTRACKED with the reason, so
"Already up to date" is only said when it is true
- resolve the remote default branch via `git ls-remote --symref` when
refs/remotes/<remote>/HEAD is missing, so merged branches whose
upstream was deleted are still cleaned up
- make --create-missing opt-in, keeping hub's default of never creating
a local branch that does not already exist
- summarise runs as changed/unchanged with per-action counts, and list
deletions and failures in full instead of leaving them in scrollback
- restore per-command flag help, which the custom Usage had dropped
- add an in-place CLI progress line, drawn only to a terminal so piped
and --json output stay free of cursor control
- group the TUI selection screen by outcome so blocked and dirty
repositories are visible before a run starts
🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
- emit start and finish events from the concurrent sync worker pool
- show elapsed time, a progress bar, active repositories, result counts, and the latest result
- retain failures, skips, protected branches, and divergence warnings after the run
- focus the first failed repository and add f to cycle through repositories requiring attention
- add progress and summary tests, document the new controls, and set version 0.3.1
- add sync.go to fetch and prune the selected upstream, github, origin, or sole remote
- fast-forward the current branch with merge --ff-only and inactive branches with update-ref
- protect a dirty current branch and branches checked out in linked worktrees
- warn without changing divergent branches
- delete gone-upstream branches only after confirming they are merged into the remote default branch
- allow dirty repositories by default and retain the all-clean policy behind --strict
- return per-branch results in CLI, JSON, and TUI output
- add bare-remote integration tests, the hub MIT notice, and version 0.3.0
- replace the POSIX shell fixture with a compiled Go helper named hub or hub.exe
- prepend the helper directory to PATH in TestMain so tests cannot invoke an installed hub binary
- add PowerShell build, install, and Windows path examples to the README
- ignore the generated stack-sync.exe binary
- discover nested Git repositories and skip dependency and build directories
- add scan and sync commands with root, exclude, jobs, timeout, JSON, strict, and confirmation options
- block detached heads, missing remotes, active Git operations, and dirty worktrees
- exclude nested repositories from their parent's dirty-worktree check
- recheck repository safety before running hub sync
- add discovery, safety, sync, JSON, and output tests
- set the embedded version to 0.1.1 and document installation and usage