Repository navigation
Conversation
cheat2001
left a comment
There was a problem hiding this comment.
Thanks for building the whole thing out, and the engine tests are thorough, the stalled socket one included. Three things before it goes in.
Pull all skips any repository that has an untracked file. The toolbar Pull fast-forwards fine with unrelated local changes, and the safe checkout already refuses a real conflict, so in a normal work folder most repos would come back as "local changes". Drop the clean tree gate and let the checkout decide.
The hooks, submodule and LFS skips are stricter than the rest of the app. The toolbar Pull runs none of those either, and nothing tells the user why this one is different. Align it with Pull or drop the guards.
The summary dialog needs the app's flat look: tone on the badges (failed red, updated green), rows without a border each, a counts line that doesn't wrap, and the pull entry should use the same arrow icon the toolbar uses, not the pull request one. There's also one inline comment in group_update.rs, the codebase keeps those in CLAUDE.md.
As the issue said, this one lands after 0.23.0, so no rush.
|
I take care about your findings in the evening. After 0.23 is perfectly fine. Happy I could help |
7c91b4f to
a7ae152
Compare
|
Addressed the review feedback, with the latest fixes in
Validation at |
|
Took it for a spin in the installed app, this is good now. The pull behaves like the toolbar one, the summary reads cleanly in both themes, and the cancel receipts are a nice touch. Two small things and I merge:
No need to touch anything else. |
|
Nice - I take care in the afternoon |
|
done |
|
The latest CI run at The failure is in the existing signing unit test The likely cause is a temporary-directory collision between parallel signing tests. Their fixture names use only the process ID and timestamp, so repeated timestamps on Windows can give two tests the same directory. This is an inference from the fixture and lock error; the log does not prove the collision. An atomic sequence number in the fixture name would guarantee uniqueness. This test helper is unchanged by this PR, and the latest commit only changes the Fetch all icon and trims CLAUDE.md. The failure is separate from the earlier Windows group-update fixture issues. |
The fixture named its folder by process id and timestamp alone, and two signing tests running in parallel on the Windows CI runner got the same folder and fought over .git/config.lock (the red Windows job on PR #70's last run). An atomic counter in the name makes it unique per call.
|
Released in 0.24.0. Thanks for sticking with the review rounds, the cancel receipts and the summary turned out really nice. |
What & why
Updating a repository group currently requires opening each repository separately. The start-page group header menu now offers Fetch all and Pull all (fast-forward only), with a live per-repository summary of moved refs, old/new commit IDs, commit counts, unchanged repositories, skips with reasons, and failures. Operations run sequentially and continue after individual failures. Fetch pruning respects
remote.<name>.prunefirst, falling back tofetch.pruneonly when the per-remote key is absent; an explicit remote false prevents pruning.Cancel run cancels the native run token, stops queued repositories, releases the app's busy state, and enables closing the dialog without waiting for a stalled network read. Downloading objects is separated from applying refs; ref updates and fast-forward checkout share a cancellation mutex. After cancellation acknowledges, no further ref or working-tree updates are allowed. Completed changes are retained. A blocked transport can still wind down in the background; this is cooperative cancellation, not a hard socket timeout. Cancellation intentionally waits for a running local checkout/ref-write phase to finish, which preserves the acknowledgement guarantee; the code documents this wait. The native guard records completed checkout outcomes and lightweight fetch progress before releasing the mutex. Moved-ref discovery and commit counting happen outside the write guard when the final response or cancellation receipt is built, rather than after every remote. One open repository handle serves the fetch loop and its final summary. Receipt inspection failures are isolated to the affected row, preserving its fetch counts and earlier errors plus an inspection diagnostic, and retaining all other completed receipts. Cancellation still inspects moved refs and counts commits before returning; making that optional work asynchronous remains outside this fix. Fetch receipts retain successful remotes and error details together; cancelling cannot turn earlier failures into a generic Cancelled row. Queued repositories explicitly say they never started. Cancel returns completed-result receipts, so a checkout that finishes while cancellation waits still counts as Updated even if its original IPC response is delayed. Each frontend row settles once from the response or cancellation acknowledgement; late successes and errors are consumed without changing it. Leaving the page also cancels the run. Registry entries record last use; one-hour stale entries are cancelled and pruned on later registry activity without blocking or interrupting an active checkout.
Rust returns an explicit
partialstatus when some remotes succeed and others fail, including when successful remotes move no refs. A sharedclassify()function drives both badges and counters, so each repository is counted exactly once. Changes and failure details remain visible.Pull uses the checked-out branch's configured upstream and never merges or rebases. It reads the merge source through git2's
branch_upstream_mergeAPI. Named upstreams resolve the tracking ref independently of its existence and fetch the exact source into it, and verifies the ref-update callback including unchanged refs. URL/path upstreams use anonymous remotes with a temporary private ref removed in the same guarded write phase, preserving branch configuration. Named upstreams outside the configured fetch refspec use that same temporary destination while keeping both the fetch configuration and existing tracking refs unchanged. A missing local tracking ref can therefore be restored, while a deleted remote branch is reported as a missing configured upstream rather than “no upstream”. Detached/unborn HEADs, bare repositories, unfinished operations, and divergent branches are skipped. Safe checkout preserves unrelated untracked files and staged or unstaged edits, and refuses conflicting changes. Safe checkout precedes the branch-ref update, after checking for changes during fetch.Group pull uses the same libgit2 checkout behavior as toolbar Pull, including its existing handling of hooks, submodules, and external filters such as Git LFS. There are no additional compatibility guards or blanket clean-tree requirements. If checkout succeeds but updating the branch ref fails, the error explicitly describes that state and includes both commit IDs for inspection. Integration-test fixtures explicitly use unsigned commits and the expected branch name to isolate developer Git defaults.
Unchanged fetch badges use the same wording as the counts. The summary uses the app's flat layout: borderless rows, green Updated and red Failed badges, and a single non-wrapping counts line. The pull menu entry uses the toolbar's ArrowDownToLine icon. Cancellation's local-write wait is documented in CLAUDE.md, with no inline source comment.
Closes #69. Intended to land after 0.23.0, as requested by the maintainer.
Screenshots
Uses existing design tokens without changing the theme palette.
Validation
tsc/vitestexecutables because the available pnpm launcher could not resolve the pinned version.cargo fmt --checkandcargo clippy --all-targets -- -D warningspassed.Url::from_file_pathfor portable drive letters, slashes, and escaping. All 109 integration tests, formatting, and clippy pass locally on Linux; the Windows CI rerun is pending. The multi-remote cancellation bound is five seconds, with the socket kept open and the worker still running, to allow slower CI hosts. Both registry-expiry unit tests passed.busyand preventing late results from reopening the dialog), plus assertions for badge tones, borderless rows, non-wrapping counts, the toolbar pull icon, and dark/light screenshots. The new cancellation regression uses an acknowledged successful checkout with a delayed inactive-run error and verifies the Updated count and row remain stable.signing_is_off_unless_config_enables_it,ssh_format_without_a_key_is_a_clear_error,openpgp_falls_back_to_the_committer_identity). Signing code is unchanged.Checklist
cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo testpass (full unit-test limitation noted above)tests/git_engine.rstracked()wrapper where undoable (fetch/pull follow the existing network-operation behavior)CLAUDE.mdupdated if conventions/architecture changed