Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
3d5bafa
fix(sync[hang]) Prevent indefinite blocking on credential prompts and…
tony Apr 7, 2026
e2ed5ec
deps(libvcs) Bump to 0.40.0a0 for timeout + fast set_remotes
tony Apr 24, 2026
9376e9d
feat(sync[timeout]) Per-repo watchdog with copyable rerun recipe
tony Apr 24, 2026
a45cfd8
feat(sync[log-file]) Persist debug log to tempdir, npm/pnpm-style sur…
tony Apr 24, 2026
8c3defc
feat(sync[indicator]) Spinner in TTY, heartbeat line in pipes
tony Apr 24, 2026
1bce936
fix(sync[output]) Deduplicate log-file hint; drop emojis from new UI
tony Apr 24, 2026
5d425b2
fix(sync[output]) Restore Braille spinner, fix line-bleed and Ctrl-C
tony Apr 24, 2026
b561d7f
feat(sync[indicator]) Colourise the Braille spinner cell
tony Apr 24, 2026
d48ca42
fix(sync[interrupt]) Catch Ctrl-C during config load, not just the loop
tony Apr 24, 2026
3e484dd
cli(sync[sigint]) Re-raise SIGINT under SIG_DFL so shell chains abort
tony Apr 24, 2026
89649a8
fix(log[verbosity]) Stop libvcs DEBUG leaking through the terminal ha…
tony Apr 25, 2026
79fd4c3
feat(sync[panel]) 3-line collapsing live-trail for git progress output
tony Apr 25, 2026
0eb04f2
fix(sync[indicator]) Match permanent line: Syncing + cyan name in spi…
tony Apr 25, 2026
d650c97
fix(sync[indicator]) Atomic spinner→permanent transition; close rende…
tony Apr 25, 2026
ae7bb7a
fix(sync[indicator]) Collapse panel rows via DL instead of erase
tony Apr 25, 2026
4986a07
deps(libvcs) Pin to released 0.40.0 stable
tony Apr 25, 2026
fa654a4
docs(CHANGES) Drop ``a0`` from the libvcs dependency-bump line
tony Apr 25, 2026
832b35f
fix(sync) Lazy-format the no-repo-found debug message
tony Apr 25, 2026
c8247fb
fix(sync) Swap StreamHandler.stream under handler.lock
tony Apr 25, 2026
477e0cd
fix(sync) Drop the no-prompt env cache so monkeypatch reaches subprocess
tony Apr 25, 2026
93338c2
docs(sync) Reword --verbose help to mention libvcs verbosity ladder
tony Apr 25, 2026
fd354e3
style(sync) Use the Unicode arrow consistently in CLI ornament
tony Apr 25, 2026
fc6f8a4
perf(sync[indicator]) Skip the lock on whitespace-only panel chunks
tony Apr 25, 2026
8f3c265
docs(sync) Add doctests on public-ish progress + resolver helpers
tony Apr 25, 2026
cc720d3
fix(sync) Reject --panel-lines values other than -1, 0, or positive
tony Apr 25, 2026
ff6f02c
fix(sync) Reject --timeout values <= 0
tony Apr 25, 2026
cf3f805
docs(log) Comment the libvcs-floor invariant in setup_file_logger
tony Apr 25, 2026
3e2d4a2
docs(sync) Comment the _SyncInterruptedAfterSummary catch invariant
tony Apr 25, 2026
d2110fb
fix(sync) Silence the libvcs terminal stream during human-mode sync
tony Apr 25, 2026
7b5c3a2
fix(log) Group debug logs under vcspull/ (vcspull-test/ for tests)
tony Apr 25, 2026
c69879e
docs(CHANGES) Note libvcs sync-time silencing and the new log dir layout
tony Apr 25, 2026
2c22011
docs(CHANGES) Tighten the unreleased section to product-level prose
tony Apr 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,55 @@ $ uvx --from 'vcspull' --prerelease allow vcspull
_Notes on upcoming releases will be added here_
<!-- END PLACEHOLDER - ADD NEW CHANGELOG ENTRIES BELOW THIS LINE -->

### Breaking changes

- Bump minimum libvcs from 0.39.0 to 0.40.0 (#544)

### What's new

#### `vcspull sync`: per-repo timeout

A stuck repository no longer freezes the whole batch. Each repo runs
under a 10-second wall-clock deadline; override with `--timeout
SECONDS` or `VCSPULL_SYNC_TIMEOUT_SECONDS`. The summary lists any
timed-out repos with a copy-pasteable rerun command. (#544)

#### `vcspull sync`: live status indicator

The active repo is now visible while sync runs. In a terminal you get
a spinner with the repo name and elapsed time; in pipes you get a
start line plus a periodic "still syncing" heartbeat. Disabled under
`--json`, `--ndjson`, and `--color=never`. (#544)

#### `vcspull sync`: streaming output trail

Git's streaming output now appears in a 3-line trail above the
spinner and collapses to the permanent `✓ Synced` line when the repo
finishes. Tunable with `--panel-lines` (`0` hides, `-1` unbounded) or
`VCSPULL_PROGRESS_LINES`. (#544)

#### `vcspull sync`: per-invocation debug log

Every run drops a debug log under `$TMPDIR/vcspull/` (npm/pnpm style),
surfaced to the terminal only when something failed or timed out.
Override with `--log-file PATH`; disable with `--no-log-file`. (#544)

#### `vcspull sync`: Ctrl-C aborts shell chains

`vcspull sync` now exits via signal on Ctrl-C, so chained invocations
like `vcspull sync ~/a; vcspull sync ~/b` stop on the first interrupt
instead of running the whole list. Matches `git clone; git fetch`. (#544)

#### `vcspull`: quieter default output

libvcs's per-repo log crumbs no longer print at the default verbosity.
Pass `-v` for INFO-level libvcs activity (`Updating to 'main'.`); pass
`-vv` for DEBUG. The debug log file always captures DEBUG regardless. (#544)

### Bug fixes

- Sync no longer hangs on credential prompts or slow fetches (#544)

### Documentation

- Visual improvements to API docs from [gp-sphinx](https://gp-sphinx.git-pull.com)-based Sphinx packages (#542)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ keywords = [
]
homepage = "https://vcspull.git-pull.com"
dependencies = [
"libvcs~=0.39.0",
"libvcs>=0.40.0,<0.41.0",
"colorama>=0.3.9",
"PyYAML>=6.0"
]
Expand Down
13 changes: 12 additions & 1 deletion src/vcspull/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,14 @@ def cli(_args: list[str] | None = None) -> None:
) = subparsers
args = parser.parse_args(_args)

setup_logger(log=log, level=args.log_level.upper())
# ``args.verbosity`` is only set by the sync subcommand; default 0
# everywhere else. The sync ``-v`` ladder (0 → libvcs WARNING; 1 → INFO;
# 2+ → DEBUG) is documented in :func:`vcspull.log.setup_logger`.
setup_logger(
log=log,
level=args.log_level.upper(),
verbosity=getattr(args, "verbosity", 0),
)

if args.subparser_name is None:
parser.print_help()
Expand All @@ -466,6 +473,10 @@ def cli(_args: list[str] | None = None) -> None:
sync_all=getattr(args, "sync_all", False),
parser=sync_parser,
include_worktrees=getattr(args, "include_worktrees", False),
timeout=getattr(args, "timeout", None),
log_file=getattr(args, "log_file", None),
no_log_file=getattr(args, "no_log_file", False),
panel_lines=getattr(args, "panel_lines", None),
)
elif args.subparser_name == "list":
list_repos(
Expand Down
Loading
Loading