From 9823d489785f4aca1e3340279ddb0fc1d5bb902f Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Fri, 9 Oct 2026 14:26:05 +0200 Subject: [PATCH 01/10] feat: add group fetch and fast-forward-only pull actions --- CHANGELOG.md | 7 + CLAUDE.md | 19 +- apps/desktop/src-tauri/src/commands.rs | 8 + apps/desktop/src-tauri/src/core/remote.rs | 193 +++++++++++++++++- apps/desktop/src-tauri/src/core/types.rs | 18 ++ apps/desktop/src-tauri/src/lib.rs | 4 +- apps/desktop/src-tauri/tests/git_engine.rs | 172 ++++++++++++++++ apps/desktop/src/core/ipc.ts | 8 + .../features/repository/GroupUpdateDialog.tsx | 75 +++++++ .../src/features/repository/WelcomePage.tsx | 39 ++++ .../src/features/repository/groupUpdate.ts | 22 ++ packages/core/src/git/types.ts | 13 ++ tests/e2e/smoke.spec.ts | 51 +++++ tests/unit/groupUpdate.test.ts | 17 ++ 14 files changed, 640 insertions(+), 6 deletions(-) create mode 100644 apps/desktop/src/features/repository/GroupUpdateDialog.tsx create mode 100644 apps/desktop/src/features/repository/groupUpdate.ts create mode 100644 tests/unit/groupUpdate.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c9776f7..a3453be7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ All notable changes to AngKorGit are documented here. The format follows ## [Unreleased] +### Added +- Right-click a group header on the start page to **Fetch all** or **Pull all + (fast-forward only)**. A live summary lists moved refs and commit ranges, unchanged + repositories, skipped repositories with reasons, and failures. Pull follows each + checked-out branch's configured upstream and skips local changes, detached HEADs, + unfinished operations, and diverged history. (#69) + ## [0.23.0] — 2026-10-13 The working-copy release. Folders in the file tree stage and unstage as one, the diff --git a/CLAUDE.md b/CLAUDE.md index 65076423..c4930ec0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1040,12 +1040,23 @@ features/ │ │ body grows to max-h-96 with groups. data-group-header=, │ │ data-group-section, data-recent-row=, data-group-tile │ │ are the e2e hooks. HEADER MENU (right-click or "…"): Open all +│ │ Fetch all / Pull all (fast-forward only) / Open all │ │ in tabs / Close its tabs / Move up / Move down / │ │ Edit group… / Ungroup… — repository/groups.ts openRepoGroup (ipc.pathsExist │ │ first, skips missing folders and says so in the toast │ │ description, addRepoTab for every present path, opens the │ │ first only when the current repo is not in the group, then -│ │ ensureRepoRoute), closeRepoGroup, deleteRepoGroup (confirm +│ │ ensureRepoRoute). GroupUpdateDialog + groupUpdate.ts run group +│ │ fetch/pull sequentially (shared worktree refs), block other app +│ │ operations through useRepo.busy, and show live per-repo results. +│ │ ipc.groupUpdate → repository_group_update → remote::group_update: +│ │ fetch attempts every remote and compares remote/tag refs even on +│ │ partial failure; pull uses only the configured HEAD upstream, +│ │ skips dirty/untracked trees, detached/unborn HEAD, bare repos, +│ │ unfinished operations and divergence, safe-checks out before +│ │ moving the ref, and never invokes merge/rebase. Results carry +│ │ status/message + RefMovement name/oldOid/newOid/commits. +│ │ closeRepoGroup, deleteRepoGroup (confirm │ │ only when the group has repos; the repos stay in recents), │ │ plural(count, noun) handles -y → -ies. DRAG: rows are │ │ draggable only while groups exist and no search is active; @@ -3559,10 +3570,10 @@ update CLAUDE.md or docs/ — never the code. | Suite | Location | Coverage | | --- | --- | --- | -| Rust integration (92) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | +| Rust integration (95) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | | Rust module (78) | `apps/desktop/src-tauri/src/cli.rs` (7), `src/state.rs` (1), `src/editors.rs` (4), `src/fonts.rs` (1), `src/ai_cli.rs` (10), `src/error.rs` (7), `src/core/remote.rs` (18), `src/terminal.rs` (3), `src/core/accounts.rs` (7), `src/core/sign.rs` (7), `src/forge.rs` (7), `src/proc.rs` (1), `src/watcher.rs` (4) | AI-CLI runner: program allowlist (incl. Cursor's `agent` and `cursor-agent` names), stdout capture via fake agent script, {OUTPUT_FILE} substitution, kill-on-timeout, Cursor version-folder keys and the .cmd launcher → newest node.exe/index.js resolution (none for other agents or a missing versions dir) · error mapping: HTTP status extraction from libgit2 messages, 401/402/403 explanations, unmapped codes kept verbatim, io NotFound → not_found while other io errors stay io · forge proxy: api-subdomain host allowlist (dot-anchored), per-provider auth headers, bitbucket email requirement, unknown provider rejected, missing-token vs no-account message · SSH key resolution: `~` expansion, configured key ordered ahead of defaults, dedupe when the configured key IS a default, blank config ignored, generation never targeting an existing key · push refspec shapes (plain/force/tags never forced) · rejection message quotes the server lines after the ref list (sideband lines trimmed, de-duplicated, "remote:" and rule lines dropped, capped at 12) · repo account-binding parse (valid/malformed) · accounts: upsert keeps both same-host accounts + default flags, one default per host, preferred-before-default candidate order, port-loose host match, ssh URLs ignored · signing config: off by default, ssh setup read from git config, empty-string values read as unset, ssh-without-key and x509 are clear errors, openpgp falls back to the committer identity, literal-key detection, ~ expansion · proc: no bare `Command::new` anywhere outside proc.rs (G31) · recents: new paths go on top in order, an existing path moves instead of duplicating, the list caps at RECENT_LIMIT · watcher: metadata filter unchanged for main repos, `worktrees/*/HEAD|gitdir|locked` relevant while `worktrees/*/index` is noise, a linked worktree watches its own gitdir + the shared commondir, main repos need no extra roots | -| Unit (267) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | -| E2E (114) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | +| Unit (268) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | +| E2E (115) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | ## 9.5 Open-source & community files diff --git a/apps/desktop/src-tauri/src/commands.rs b/apps/desktop/src-tauri/src/commands.rs index 47531655..f80ee897 100644 --- a/apps/desktop/src-tauri/src/commands.rs +++ b/apps/desktop/src-tauri/src/commands.rs @@ -497,6 +497,14 @@ pub async fn remote_fetch( blocking(move || remote::fetch(&path, &remote, tags, prune)).await } +#[tauri::command] +pub async fn repository_group_update( + path: String, + pull: bool, +) -> AppResult { + blocking(move || remote::group_update(&path, pull)).await +} + #[tauri::command] pub async fn remote_pull( path: String, diff --git a/apps/desktop/src-tauri/src/core/remote.rs b/apps/desktop/src-tauri/src/core/remote.rs index bdad5237..f4c6225c 100644 --- a/apps/desktop/src-tauri/src/core/remote.rs +++ b/apps/desktop/src-tauri/src/core/remote.rs @@ -11,7 +11,7 @@ use git2::{ use crate::error::{AppError, AppResult}; -use super::types::{GeneratedKey, OpOutcome, RemoteInfo}; +use super::types::{GeneratedKey, GroupUpdateResult, OpOutcome, RefMovement, RemoteInfo}; static CREDENTIAL_PREFS: OnceLock> = OnceLock::new(); @@ -458,6 +458,197 @@ pub fn fetch(path: &str, remote_name: &str, tags: bool, prune: bool) -> AppResul }) } +// This deliberately does not call pull/merge: group pulls must never merge or rebase. +pub fn group_update(path: &str, pull: bool) -> AppResult { + if !Path::new(path).is_dir() { + return Ok(GroupUpdateResult { + status: "skipped".into(), + message: "Repository folder no longer exists".into(), + changes: Vec::new(), + }); + } + let repo = super::repo::open(path)?; + let result = |status: &str, message: String| GroupUpdateResult { + status: status.into(), + message, + changes: Vec::new(), + }; + if !pull { + let names: Vec = repo.remotes()?.iter().flatten().map(String::from).collect(); + if names.is_empty() { + return Ok(result("skipped", "No remotes configured".into())); + } + let before = fetched_refs(&repo)?; + let mut failures = Vec::new(); + for name in &names { + if let Err(error) = fetch(path, name, false, false) { + failures.push(format!("{name}: {error}")); + } + } + let after = fetched_refs(&repo)?; + let mut keys: Vec<_> = before.keys().chain(after.keys()).cloned().collect(); + keys.sort(); + keys.dedup(); + let changes = keys + .into_iter() + .filter_map(|name| { + let old = before.get(&name).copied(); + let new = after.get(&name).copied(); + if old == new { + return None; + } + Some(RefMovement { + name, + old_oid: old.map(|oid| oid.to_string()), + new_oid: new.map(|oid| oid.to_string()), + commits: old + .zip(new) + .and_then(|(old, new)| repo.graph_ahead_behind(new, old).ok()) + .map(|(ahead, _)| ahead), + }) + }) + .collect(); + return Ok(GroupUpdateResult { + status: if failures.is_empty() { "ok" } else { "failed" }.into(), + message: if failures.is_empty() { + format!("Fetched {} remote(s)", names.len()) + } else { + format!( + "Fetched {} of {} remotes. Failed: {}", + names.len() - failures.len(), + names.len(), + failures.join("; ") + ) + }, + changes, + }); + } + if repo.is_bare() { + return Ok(result( + "skipped", + "Bare repository has no working tree".into(), + )); + } + if repo.state() != git2::RepositoryState::Clean { + return Ok(result( + "skipped", + "An unfinished Git operation is in progress".into(), + )); + } + if repo.head_detached()? { + return Ok(result("skipped", "HEAD is detached".into())); + } + let head = match repo.head() { + Ok(head) => head, + Err(error) if error.code() == git2::ErrorCode::UnbornBranch => { + return Ok(result("skipped", "Branch has no commits yet".into())); + } + Err(error) => return Err(error.into()), + }; + let refname = head + .name() + .ok_or_else(|| AppError::other("Invalid HEAD name"))? + .to_string(); + let branch_name = head.shorthand().unwrap_or(&refname).to_string(); + let branch = repo.find_branch(&branch_name, git2::BranchType::Local)?; + let upstream = match branch.upstream() { + Ok(upstream) => upstream, + Err(_) => return Ok(result("skipped", format!("{branch_name} has no upstream"))), + }; + let upstream_ref = upstream + .get() + .name() + .ok_or_else(|| AppError::other("Invalid upstream name"))? + .to_string(); + let remote = repo.branch_upstream_remote(&refname)?; + let remote = remote + .as_str() + .ok_or_else(|| AppError::other("Invalid upstream remote"))?; + let mut options = git2::StatusOptions::new(); + options.include_untracked(true).recurse_untracked_dirs(true); + if !repo.statuses(Some(&mut options))?.is_empty() { + return Ok(result( + "skipped", + "Working tree has local changes (including untracked files)".into(), + )); + } + let old = head.peel_to_commit()?.id(); + if remote != "." { + fetch(path, remote, false, false)?; + } + // Re-read the configured ref after fetching, never guess a same-named branch. + let target = repo.find_reference(&upstream_ref)?.peel_to_commit()?; + let new = target.id(); + let (ahead, behind) = repo.graph_ahead_behind(old, new)?; + if behind == 0 { + return Ok(result( + "up_to_date", + if ahead == 0 { + format!("{branch_name} is already up to date") + } else { + format!("{branch_name} is ahead by {ahead} commit(s); nothing to pull") + }, + )); + } + if ahead > 0 { + return Ok(result("skipped", format!("{branch_name} has diverged ({ahead} ahead, {behind} behind); fast-forward unavailable"))); + } + // A network fetch can take a while; an external Git client may have changed + // HEAD or the working tree in the meantime. Do not apply the stale plan. + let current = repo.head()?; + if current.name() != Some(refname.as_str()) + || current.target() != Some(old) + || repo.state() != git2::RepositoryState::Clean + { + return Ok(result( + "skipped", + "Repository changed during fetch; try again".into(), + )); + } + if !repo.statuses(Some(&mut options))?.is_empty() { + return Ok(result( + "skipped", + "Working tree changed during fetch; try again".into(), + )); + } + let mut checkout = CheckoutBuilder::new(); + checkout.safe(); + if let Err(error) = repo.checkout_tree(target.as_object(), Some(&mut checkout)) { + if error.code() == git2::ErrorCode::Conflict { + return Ok(result( + "skipped", + format!("Local changes prevent checkout: {error}"), + )); + } + return Err(error.into()); + } + repo.find_reference(&refname)? + .set_target(new, &format!("pull: fast-forward to {upstream_ref}"))?; + Ok(GroupUpdateResult { + status: "ok".into(), + message: format!("Fast-forwarded {branch_name} by {behind} commit(s)"), + changes: vec![RefMovement { + name: branch_name, + old_oid: Some(old.to_string()), + new_oid: Some(new.to_string()), + commits: Some(behind), + }], + }) +} + +fn fetched_refs(repo: &Repository) -> AppResult> { + let mut refs = HashMap::new(); + for reference in repo.references()? { + let reference = reference?; + if reference.is_remote() || reference.is_tag() { + if let (Some(name), Some(oid)) = (reference.name(), reference.target()) { + refs.insert(name.to_string(), oid); + } + } + } + Ok(refs) +} + pub fn pull(path: &str, remote_name: &str, mode: Option<&str>) -> AppResult { fetch(path, remote_name, false, false)?; diff --git a/apps/desktop/src-tauri/src/core/types.rs b/apps/desktop/src-tauri/src/core/types.rs index c04c5d2b..5de751ae 100644 --- a/apps/desktop/src-tauri/src/core/types.rs +++ b/apps/desktop/src-tauri/src/core/types.rs @@ -279,3 +279,21 @@ pub struct GeneratedKey { pub path: String, pub public_key: String, } + +/// Result of a group action for one repository, including partial fetch failures. +#[derive(Serialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct GroupUpdateResult { + pub status: String, + pub message: String, + pub changes: Vec, +} + +#[derive(Serialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct RefMovement { + pub name: String, + pub old_oid: Option, + pub new_oid: Option, + pub commits: Option, +} diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 0a4e7b08..a260f86e 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -39,7 +39,8 @@ pub mod test_api { tag_delete, tag_list, }; pub use crate::core::remote::{ - add as remote_add, checkout_remote_ref, fetch, list as remote_list, pull, push, + add as remote_add, checkout_remote_ref, fetch, group_update, list as remote_list, pull, + push, }; pub use crate::core::repo::{ cleanup_state, discover, info as repo_info, init, ref_fingerprint, set_config, status, @@ -185,6 +186,7 @@ pub fn run() { commands::remote_remove, commands::remote_fetch, commands::remote_pull, + commands::repository_group_update, commands::remote_pull_branch, commands::remote_push, commands::remote_push_tag, diff --git a/apps/desktop/src-tauri/tests/git_engine.rs b/apps/desktop/src-tauri/tests/git_engine.rs index ace69bb3..e246d8e0 100644 --- a/apps/desktop/src-tauri/tests/git_engine.rs +++ b/apps/desktop/src-tauri/tests/git_engine.rs @@ -22,6 +22,12 @@ impl TempRepo { std::fs::create_dir_all(&dir).unwrap(); let path = dir.to_str().unwrap(); core::init(path).unwrap(); + // Tests use master and unsigned commits regardless of the developer's Git defaults. + git2::Repository::open(path) + .unwrap() + .set_head("refs/heads/master") + .unwrap(); + core::set_config(Some(path), "commit.gpgsign", "false", false).unwrap(); core::set_config(Some(path), "user.name", "Test User", false).unwrap(); core::set_config(Some(path), "user.email", "test@angkorgit.dev", false).unwrap(); core::set_config(Some(path), "core.autocrlf", "false", false).unwrap(); @@ -2508,6 +2514,7 @@ fn clone_of(origin: &std::path::Path, local: &TempRepo, suffix: &str) -> TempRep .unwrap(); assert!(status.success()); let clone = TempRepo { dir }; + core::set_config(Some(clone.path()), "commit.gpgsign", "false", false).unwrap(); core::set_config(Some(clone.path()), "user.name", "Other User", false).unwrap(); core::set_config( Some(clone.path()), @@ -3024,3 +3031,168 @@ fn scan_finds_every_repository_and_skips_noise() { assert!(core::scan_repositories(root.join("missing").to_str().unwrap(), 4).is_err()); let _ = std::fs::remove_dir_all(&root); } + +#[test] +fn group_pull_fast_forwards_configured_upstream_without_merging() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "group"); + // A differently named local branch must still follow its configured upstream. + let repo = git2::Repository::open(other.path()).unwrap(); + repo.find_branch("master", git2::BranchType::Local) + .unwrap() + .rename("topic", false) + .unwrap(); + core::set_config(Some(other.path()), "pull.rebase", "true", false).unwrap(); + local.write("a.txt", "updated\n"); + let new = commit_all(&local, "updated"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let result = core::group_update(other.path(), true).unwrap(); + assert_eq!(result.status, "ok"); + assert_eq!(result.changes[0].name, "topic"); + assert_eq!(result.changes[0].old_oid.as_deref(), Some(old.as_str())); + assert_eq!(result.changes[0].new_oid.as_deref(), Some(new.as_str())); + assert_eq!(result.changes[0].commits, Some(1)); + assert_eq!(other.read("a.txt"), "updated\n"); + assert_eq!(head_summary_and_parents(&other).1, 1); + assert_eq!( + core::group_update(other.path(), true).unwrap().status, + "up_to_date" + ); + // Divergence must not use merge or configured rebase. + other.write("mine.txt", "mine\n"); + let mine = commit_all(&other, "mine"); + local.write("a.txt", "remote again\n"); + commit_all(&local, "remote again"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let result = core::group_update(other.path(), true).unwrap(); + assert_eq!(result.status, "skipped"); + assert!(result.message.contains("diverged")); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), mine); + assert_eq!(repo.state(), git2::RepositoryState::Clean); + std::fs::remove_dir_all(origin).unwrap(); +} + +#[test] +fn group_pull_skips_dirty_detached_missing_upstream_and_unfinished_repos() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "group-skip"); + local.write("a.txt", "remote\n"); + commit_all(&local, "remote"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + for staged in [false, true] { + other.write("a.txt", "dirty\n"); + if staged { + core::stage_all(other.path()).unwrap(); + } + let result = core::group_update(other.path(), true).unwrap(); + assert_eq!(result.status, "skipped"); + assert!(result.message.contains("local changes")); + assert_eq!(other.read("a.txt"), "dirty\n"); + } + let repo = git2::Repository::open(other.path()).unwrap(); + repo.reset( + &repo + .find_object(git2::Oid::from_str(&old).unwrap(), None) + .unwrap(), + git2::ResetType::Hard, + None, + ) + .unwrap(); + other.write("new.txt", "keep\n"); + assert_eq!( + core::group_update(other.path(), true).unwrap().status, + "skipped" + ); + std::fs::remove_file(other.dir.join("new.txt")).unwrap(); + std::fs::write(repo.path().join("MERGE_HEAD"), &old).unwrap(); + assert!(core::group_update(other.path(), true) + .unwrap() + .message + .contains("unfinished")); + std::fs::remove_file(repo.path().join("MERGE_HEAD")).unwrap(); + repo.set_head_detached(git2::Oid::from_str(&old).unwrap()) + .unwrap(); + assert!(core::group_update(other.path(), true) + .unwrap() + .message + .contains("detached")); + repo.set_head("refs/heads/master").unwrap(); + repo.find_branch("master", git2::BranchType::Local) + .unwrap() + .set_upstream(None) + .unwrap(); + assert!(core::group_update(other.path(), true) + .unwrap() + .message + .contains("no upstream")); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), old); + assert_eq!( + core::group_update(other.dir.join("missing").to_str().unwrap(), true) + .unwrap() + .status, + "skipped" + ); + std::fs::remove_dir_all(origin).unwrap(); +} + +#[test] +fn group_fetch_reports_moved_refs_and_continues_after_remote_failure() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "group-fetch"); + core::remote_add( + other.path(), + "broken", + other.dir.join("missing.git").to_str().unwrap(), + ) + .unwrap(); + local.write("a.txt", "new\n"); + let new = commit_all(&local, "new"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let result = core::group_update(other.path(), false).unwrap(); + assert_eq!(result.status, "failed"); + assert!(result.message.contains("broken")); + let moved = result + .changes + .iter() + .find(|r| r.name == "refs/remotes/origin/master") + .unwrap(); + assert_eq!(moved.old_oid.as_deref(), Some(old.as_str())); + assert_eq!(moved.new_oid.as_deref(), Some(new.as_str())); + assert_eq!(other.read("a.txt"), "base\n"); + assert_eq!( + git2::Repository::open(other.path()) + .unwrap() + .head() + .unwrap() + .target() + .unwrap() + .to_string(), + old + ); + assert!(core::group_update(other.path(), false) + .unwrap() + .changes + .is_empty()); + let empty = TempRepo::new(); + assert_eq!( + core::group_update(empty.path(), false).unwrap().status, + "skipped" + ); + assert!(core::group_update(empty.path(), true) + .unwrap() + .message + .contains("no commits")); + std::fs::remove_dir_all(origin).unwrap(); +} diff --git a/apps/desktop/src/core/ipc.ts b/apps/desktop/src/core/ipc.ts index 11478fec..b17003f5 100644 --- a/apps/desktop/src/core/ipc.ts +++ b/apps/desktop/src/core/ipc.ts @@ -1,4 +1,5 @@ import type { + GroupUpdateResult, BranchInfo, CliAgentInfo, CliRunRequest, @@ -467,6 +468,13 @@ export const ipc = { } return invoke('remote_fetch', { path, remote, tags, prune }); }, + async groupUpdate(path: string, pull: boolean): Promise { + if (!isTauri()) { + await delay(400); + return { status: 'up_to_date', message: pull ? 'main is already up to date (demo)' : 'Fetched origin; no refs moved (demo)', changes: [] }; + } + return invoke('repository_group_update', { path, pull }); + }, async pull(path: string, remote: string, mode?: 'merge' | 'rebase'): Promise { if (!isTauri()) { await delay(400); diff --git a/apps/desktop/src/features/repository/GroupUpdateDialog.tsx b/apps/desktop/src/features/repository/GroupUpdateDialog.tsx new file mode 100644 index 00000000..9be03dd1 --- /dev/null +++ b/apps/desktop/src/features/repository/GroupUpdateDialog.tsx @@ -0,0 +1,75 @@ +import { + Badge, + Button, + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, + Spinner, +} from '@angkorgit/design-system'; +import { shortenHome } from '@/shared/utils'; +import type { GroupRepositoryResult } from './groupUpdate'; + +export interface GroupUpdateProgress { + name: string; + pull: boolean; + total: number; + results: GroupRepositoryResult[]; + running: boolean; +} + +export function GroupUpdateDialog({ progress, onClose }: { + progress: GroupUpdateProgress | null; + onClose: () => void; +}) { + if (!progress) return null; + const { name, pull, total, results, running } = progress; + const moved = results.filter((r) => r.changes.length > 0).length; + const unchanged = results.filter( + (r) => (r.status === 'ok' || r.status === 'up_to_date') && r.changes.length === 0, + ).length; + const skipped = results.filter((r) => r.status === 'skipped').length; + const failed = results.filter((r) => r.status === 'failed').length; + return ( + { if (!open && !running) onClose(); }}> + { if (running) e.preventDefault(); }} + onInteractOutside={(e) => e.preventDefault()} + > + + {pull ? 'Pull all (fast-forward only)' : 'Fetch all'} — {name} + + {pull ? 'Pulls the checked-out branch from its upstream. Repositories with local changes are skipped.' : 'Fetches every configured remote in the group.'} + + +
+ {running && } + {running ? `${results.length} of ${total} repositories complete` : `${total} repositories complete`} · {moved} updated · {unchanged} {pull ? 'up to date' : 'unchanged'} · {skipped} skipped · {failed} failed +
+
+ {results.map((result) => ( +
+
+ {result.repo.name} + {result.status === 'failed' ? 'Failed' : result.status === 'skipped' ? 'Skipped' : result.changes.length > 0 ? 'Updated' : pull ? 'Up to date' : 'Fetched'} +
+

{shortenHome(result.repo.path)}

+

{result.message}

+ {result.changes.map((change) => ( +

+ {change.name.replace(/^refs\/(remotes|heads|tags)\//, '')}: {change.oldOid?.slice(0, 7) ?? 'new'} → {change.newOid?.slice(0, 7) ?? 'deleted'} + {change.commits !== null && ` (${change.commits} commit${change.commits === 1 ? '' : 's'})`} +

+ ))} + {!pull && result.status === 'ok' && result.changes.length === 0 &&

No refs moved.

} +
+ ))} +
+ +
+
+ ); +} diff --git a/apps/desktop/src/features/repository/WelcomePage.tsx b/apps/desktop/src/features/repository/WelcomePage.tsx index c31d43f5..8d10979d 100644 --- a/apps/desktop/src/features/repository/WelcomePage.tsx +++ b/apps/desktop/src/features/repository/WelcomePage.tsx @@ -16,11 +16,13 @@ import { ChevronRight, Clock, Copy, + Download, FolderGit2, FolderOpen, FolderSearch, FolderTree, GitBranchPlus, + GitPullRequestArrow, MoreHorizontal, Pencil, Search, @@ -59,6 +61,8 @@ import { CloneDialog } from './CloneDialog'; import { RepoShortcutDialog } from './RepoShortcutDialog'; import { RepoGroupDialog } from './RepoGroupDialog'; import { GroupDot, GroupTile, RepoGroupSubmenu } from './RepoGroupMenu'; +import { GroupUpdateDialog, type GroupUpdateProgress } from './GroupUpdateDialog'; +import { updateGroupRepositories } from './groupUpdate'; import { closeRepoGroup, deleteRepoGroup, openRepoGroup } from './groups'; import { ScanRepositoriesDialog, startRepositoryScan } from './ScanRepositoriesDialog'; import { SettingsDialog } from '@/features/settings/SettingsDialog'; @@ -83,6 +87,8 @@ export function WelcomePage() { const groupOf = useSettings((s) => s.repoGroupOf); const setRepoGroup = useSettings((s) => s.setRepoGroup); const moveRepoGroup = useSettings((s) => s.moveRepoGroup); + const busy = useRepo((s) => s.busy); + const [groupProgress, setGroupProgress] = useState(null); const [query, setQuery] = useState(''); const [activePath, setActivePath] = useState(null); const [missing, setMissing] = useState>(new Set()); @@ -94,6 +100,25 @@ export function WelcomePage() { const [groupDrop, setGroupDrop] = useState<{ id: string; position: RepoGroupDropPosition } | null>(null); const [version, setVersion] = useState(''); + async function updateGroup(group: RepoGroup, repos: RecentRepository[], pull: boolean) { + if (useRepo.getState().busy || useRepo.getState().opening || repos.length === 0) return; + useRepo.getState().setBusy(pull ? 'Pulling group…' : 'Fetching group…'); + setGroupProgress({ name: group.name, pull, total: repos.length, results: [], running: true }); + try { + await updateGroupRepositories(repos, (path) => ipc.groupUpdate(path, pull), (result) => { + setGroupProgress((current) => current ? { ...current, results: [...current.results, result] } : current); + }); + if (repos.some((r) => r.path === useRepo.getState().repo?.path)) { + await useRepo.getState().refresh(); + } + } catch (error) { + toast.error(`Could not refresh repository: ${(error as { message?: string })?.message ?? error}`); + } finally { + useRepo.getState().setBusy(null); + setGroupProgress((current) => current ? { ...current, running: false } : current); + } + } + useEffect(() => { void appVersion() .then(setVersion) @@ -616,6 +641,19 @@ export function WelcomePage() { {groupMenu.group.name} + void updateGroup(groupMenu.group, groupMenu.repos, false)} + > + Fetch all + + void updateGroup(groupMenu.group, groupMenu.repos, true)} + > + Pull all (fast-forward only) + + @@ -671,6 +709,7 @@ export function WelcomePage() { )} + setGroupProgress(null)} /> void openRepository(path)} /> diff --git a/apps/desktop/src/features/repository/groupUpdate.ts b/apps/desktop/src/features/repository/groupUpdate.ts new file mode 100644 index 00000000..f74e0b31 --- /dev/null +++ b/apps/desktop/src/features/repository/groupUpdate.ts @@ -0,0 +1,22 @@ +import type { GroupUpdateResult, RecentRepository } from '@angkorgit/core'; + +export interface GroupRepositoryResult extends GroupUpdateResult { + repo: RecentRepository; +} + +// Sequential writes keep linked worktrees (which share refs) from racing each other. +export async function updateGroupRepositories( + repos: readonly RecentRepository[], + update: (path: string) => Promise, + onResult: (result: GroupRepositoryResult) => void, +): Promise { + for (const repo of repos) { + let result: GroupUpdateResult; + try { + result = await update(repo.path); + } catch (error) { + result = { status: 'failed', message: (error as { message?: string })?.message ?? String(error), changes: [] }; + } + onResult({ ...result, repo }); + } +} diff --git a/packages/core/src/git/types.ts b/packages/core/src/git/types.ts index 5c66f9e2..f73997b1 100644 --- a/packages/core/src/git/types.ts +++ b/packages/core/src/git/types.ts @@ -244,3 +244,16 @@ export interface FileBlame { lines: string[]; hunks: BlameHunk[]; } + +export interface GroupUpdateResult { + status: 'ok' | 'up_to_date' | 'skipped' | 'failed'; + message: string; + changes: RefMovement[]; +} + +export interface RefMovement { + name: string; + oldOid: string | null; + newOid: string | null; + commits: number | null; +} diff --git a/tests/e2e/smoke.spec.ts b/tests/e2e/smoke.spec.ts index 0ad2f375..ecf313f1 100644 --- a/tests/e2e/smoke.spec.ts +++ b/tests/e2e/smoke.spec.ts @@ -2778,6 +2778,20 @@ test('repositories can be grouped on the welcome page and a group opens as tabs' const frontend = page.locator('[data-group-header]', { hasText: 'Frontend' }); await expect(frontend).toBeVisible(); await expect(frontend.getByText('1', { exact: true })).toBeVisible(); + await frontend.click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Fetch all', exact: true }).click(); + await expect(dialog.getByRole('heading', { name: 'Fetch all — Frontend' })).toBeVisible(); + await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeEnabled(); + await expect(dialog.locator('[data-group-update-results]')).toContainText('temple-ui'); + await expect(dialog).toContainText('0 skipped · 0 failed'); + await dialog.getByRole('button', { name: 'Done', exact: true }).click(); + await frontend.click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Pull all (fast-forward only)', exact: true }).click(); + await expect(dialog.getByRole('heading', { name: 'Pull all (fast-forward only) — Frontend' })).toBeVisible(); + await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeEnabled(); + await expect(dialog).toContainText('Up to date'); + await dialog.getByRole('button', { name: 'Done', exact: true }).click(); + const other = page.locator('[data-group-header]', { hasText: 'Other' }); await expect(other.getByText('3', { exact: true })).toBeVisible(); @@ -3049,3 +3063,40 @@ test('stepping through changes marks the active one and counts it in the header' await expect(count).toHaveText(/^\d+ of \d+ changes$/); await expect(activeRows().first()).toBeVisible(); }); + + +test('group pull summary shows moved refs, skips, failures and unchanged repositories', async ({ page }) => { + await page.goto('/'); + await expect(page.getByText('Recent repositories')).toBeVisible({ timeout: 10_000 }); + await page.evaluate(async () => { + const [{ ipc }, { useSettings }, { useRepo }] = await Promise.all([ + import('/src/core/ipc.ts'), import('/src/features/settings/store.ts'), import('/src/features/repository/store.ts'), + ]); + const repos = ['updated', 'skipped', 'failed', 'current'].map((name) => ({ path: `/projects/${name}`, name, lastOpenedAt: 0 })); + useRepo.setState({ recents: repos }); + useSettings.getState().addRepoGroup('Projects', 0, repos.map((r) => r.path)); + ipc.groupUpdate = async (path, pull) => { + if (!pull) throw new Error('Expected fast-forward pull'); + await new Promise((resolve) => setTimeout(resolve, 250)); + if (path.endsWith('/failed')) throw { message: 'Authentication failed' }; + if (path.endsWith('/skipped')) return { status: 'skipped', message: 'main has diverged; fast-forward unavailable', changes: [] }; + if (path.endsWith('/current')) return { status: 'up_to_date', message: 'main is already up to date', changes: [] }; + return { status: 'ok', message: 'Fast-forwarded main by 2 commits', changes: [{ name: 'main', oldOid: '1234567890', newOid: 'abcdef0123', commits: 2 }] }; + }; + }); + await page.locator('[data-group-header]', { hasText: 'Projects' }).click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Pull all (fast-forward only)', exact: true }).click(); + const dialog = page.getByRole('dialog'); + await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeDisabled(); + await page.keyboard.press('Escape'); + await expect(dialog).toBeVisible(); + await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeEnabled(); + await expect(dialog.getByRole('status')).toContainText('1 updated · 1 up to date · 1 skipped · 1 failed'); + await expect(dialog).toContainText('main: 1234567 → abcdef0 (2 commits)'); + await expect(dialog).toContainText('main has diverged'); + await expect(dialog).toContainText('Authentication failed'); + await expect(dialog).toContainText('main is already up to date'); + await page.screenshot({ path: '/tmp/angkorgit-group-summary.png' }); + await dialog.getByRole('button', { name: 'Done', exact: true }).click(); + await expect(dialog).toBeHidden(); +}); diff --git a/tests/unit/groupUpdate.test.ts b/tests/unit/groupUpdate.test.ts new file mode 100644 index 00000000..2c2d73b3 --- /dev/null +++ b/tests/unit/groupUpdate.test.ts @@ -0,0 +1,17 @@ +import { expect, it } from 'vitest'; +import { updateGroupRepositories, type GroupRepositoryResult } from '../../apps/desktop/src/features/repository/groupUpdate'; + +it('runs in order, preserves partial results, and continues after a repository fails', async () => { + const repos = ['missing', 'updated', 'failed', 'current'].map((name) => ({ name, path: `/${name}`, lastOpenedAt: 0 })); + const results: GroupRepositoryResult[] = []; + const calls: string[] = []; + await updateGroupRepositories(repos, async (path) => { + calls.push(path); + if (path === '/failed') throw { message: 'Authentication failed' }; + return { status: path === '/missing' ? 'skipped' : path === '/current' ? 'up_to_date' : 'ok', message: path, changes: [] }; + }, (result) => results.push(result)); + expect(calls).toEqual(repos.map((r) => r.path)); + expect(results.map((r) => r.status)).toEqual(['skipped', 'ok', 'failed', 'up_to_date']); + expect(results[2].message).toBe('Authentication failed'); + expect(results.map((r) => r.repo)).toEqual(repos); +}); From 789c6a2eeb18162086c9468551d1293e70792391 Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Fri, 9 Oct 2026 14:30:17 +0200 Subject: [PATCH 02/10] docs: add group update summary screenshot --- docs/assets/group-update-summary.png | Bin 0 -> 108801 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/group-update-summary.png diff --git a/docs/assets/group-update-summary.png b/docs/assets/group-update-summary.png new file mode 100644 index 0000000000000000000000000000000000000000..df8a464be6786abb1c75816f6c05fa3760e0f609 GIT binary patch literal 108801 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�@{x5vs79*%$DU0aE|ZN_j72 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 Q{4p?iy85}Sb4q9e03mnjSO5S3 literal 0 HcmV?d00001 From 0759c9d636f5e123670f120951ff42ca61b91aa6 Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Mon, 12 Oct 2026 17:01:24 +0200 Subject: [PATCH 03/10] fix: make group updates cancellable and handle partial results --- CHANGELOG.md | 7 +- CLAUDE.md | 38 ++- apps/desktop/src-tauri/src/commands.rs | 19 +- .../src-tauri/src/core/group_update.rs | 79 ++++++ apps/desktop/src-tauri/src/core/mod.rs | 1 + apps/desktop/src-tauri/src/core/remote.rs | 240 ++++++++++++++++-- apps/desktop/src-tauri/src/core/types.rs | 1 - apps/desktop/src-tauri/src/lib.rs | 11 +- apps/desktop/src-tauri/tests/git_engine.rs | 214 +++++++++++++++- apps/desktop/src/core/ipc.ts | 16 +- .../features/repository/GroupUpdateDialog.tsx | 30 ++- .../src/features/repository/WelcomePage.tsx | 59 ++++- .../src/features/repository/groupUpdate.ts | 34 ++- docs/assets/group-update-cancel-summary.png | Bin 0 -> 108766 bytes packages/core/src/git/types.ts | 2 +- tests/e2e/smoke.spec.ts | 45 ++++ tests/unit/groupUpdate.test.ts | 43 +++- 17 files changed, 761 insertions(+), 78 deletions(-) create mode 100644 apps/desktop/src-tauri/src/core/group_update.rs create mode 100644 docs/assets/group-update-cancel-summary.png diff --git a/CHANGELOG.md b/CHANGELOG.md index a3453be7..5d7aeeb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,12 @@ All notable changes to AngKorGit are documented here. The format follows (fast-forward only)**. A live summary lists moved refs and commit ranges, unchanged repositories, skipped repositories with reasons, and failures. Pull follows each checked-out branch's configured upstream and skips local changes, detached HEADs, - unfinished operations, and diverged history. (#69) + unfinished operations, and diverged history. Cancel stops the remaining batch, + prevents later ref/worktree updates, and releases the app even if a network read is + stalled; completed updates are kept. Partial fetches have a single outcome in the + summary. Missing upstream refs are reported separately from unconfigured upstreams. + Repositories requiring hooks, submodule updates, or external filters such as Git LFS + are skipped with guidance to use Git CLI. (#69) ## [0.23.0] — 2026-10-13 diff --git a/CLAUDE.md b/CLAUDE.md index c4930ec0..abfe4a96 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1047,15 +1047,29 @@ features/ │ │ description, addRepoTab for every present path, opens the │ │ first only when the current repo is not in the group, then │ │ ensureRepoRoute). GroupUpdateDialog + groupUpdate.ts run group -│ │ fetch/pull sequentially (shared worktree refs), block other app -│ │ operations through useRepo.busy, and show live per-repo results. -│ │ ipc.groupUpdate → repository_group_update → remote::group_update: -│ │ fetch attempts every remote and compares remote/tag refs even on -│ │ partial failure; pull uses only the configured HEAD upstream, -│ │ skips dirty/untracked trees, detached/unborn HEAD, bare repos, -│ │ unfinished operations and divergence, safe-checks out before -│ │ moving the ref, and never invokes merge/rebase. Results carry -│ │ status/message + RefMovement name/oldOid/newOid/commits. +│ │ fetch/pull sequentially (shared worktree refs) and show live +│ │ per-repo results. classify() is shared by counters and badges: +│ │ partial fetches are one Partial outcome, never Updated + Failed. +│ │ groupStart/groupCancel/groupFinish manage a native runId token. +│ │ remote::group_update_controlled separates remote.download from +│ │ update_tips; core/group_update.rs guards ref and checkout writes +│ │ with the cancellation mutex. Cancel acknowledges without waiting +│ │ on socket I/O, aborts the frontend wait and remaining repos, and +│ │ releases useRepo.busy; already completed changes are retained. +│ │ Network reads may wind down in the background, but no ref or +│ │ working-tree updates run after cancellation acknowledges. Late results replace the +│ │ current repo result only for the same runId; unmount cancels too. +│ │ Pull reads branch_upstream_name BEFORE fetch (a missing tracking +│ │ ref can be restored), fetching the exact configured merge ref +│ │ into that tracking ref, requiring its update callback (with +│ │ REPORT_UNCHANGED) so stale refs never hide a deleted upstream. +│ │ It skips dirty/untracked trees, detached/unborn HEAD, bare repos, +│ │ unfinished operations, divergence, active post-merge/post-checkout +│ │ hooks (including core.hooksPath), submodules and external filters +│ │ (including LFS and .gitattributes in the target commit). The last +│ │ three require Git CLI; libgit2's checkout does not provide those +│ │ semantics. Safe checkout precedes the ref update and never invokes +│ │ merge/rebase. Results: status/message + name/oldOid/newOid/commits. │ │ closeRepoGroup, deleteRepoGroup (confirm │ │ only when the group has repos; the repos stay in recents), │ │ plural(count, noun) handles -y → -ies. DRAG: rows are @@ -3570,10 +3584,10 @@ update CLAUDE.md or docs/ — never the code. | Suite | Location | Coverage | | --- | --- | --- | -| Rust integration (95) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | +| Rust integration (101) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | | Rust module (78) | `apps/desktop/src-tauri/src/cli.rs` (7), `src/state.rs` (1), `src/editors.rs` (4), `src/fonts.rs` (1), `src/ai_cli.rs` (10), `src/error.rs` (7), `src/core/remote.rs` (18), `src/terminal.rs` (3), `src/core/accounts.rs` (7), `src/core/sign.rs` (7), `src/forge.rs` (7), `src/proc.rs` (1), `src/watcher.rs` (4) | AI-CLI runner: program allowlist (incl. Cursor's `agent` and `cursor-agent` names), stdout capture via fake agent script, {OUTPUT_FILE} substitution, kill-on-timeout, Cursor version-folder keys and the .cmd launcher → newest node.exe/index.js resolution (none for other agents or a missing versions dir) · error mapping: HTTP status extraction from libgit2 messages, 401/402/403 explanations, unmapped codes kept verbatim, io NotFound → not_found while other io errors stay io · forge proxy: api-subdomain host allowlist (dot-anchored), per-provider auth headers, bitbucket email requirement, unknown provider rejected, missing-token vs no-account message · SSH key resolution: `~` expansion, configured key ordered ahead of defaults, dedupe when the configured key IS a default, blank config ignored, generation never targeting an existing key · push refspec shapes (plain/force/tags never forced) · rejection message quotes the server lines after the ref list (sideband lines trimmed, de-duplicated, "remote:" and rule lines dropped, capped at 12) · repo account-binding parse (valid/malformed) · accounts: upsert keeps both same-host accounts + default flags, one default per host, preferred-before-default candidate order, port-loose host match, ssh URLs ignored · signing config: off by default, ssh setup read from git config, empty-string values read as unset, ssh-without-key and x509 are clear errors, openpgp falls back to the committer identity, literal-key detection, ~ expansion · proc: no bare `Command::new` anywhere outside proc.rs (G31) · recents: new paths go on top in order, an existing path moves instead of duplicating, the list caps at RECENT_LIMIT · watcher: metadata filter unchanged for main repos, `worktrees/*/HEAD|gitdir|locked` relevant while `worktrees/*/index` is noise, a linked worktree watches its own gitdir + the shared commondir, main repos need no extra roots | -| Unit (268) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | -| E2E (115) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | +| Unit (271) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | +| E2E (116) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | ## 9.5 Open-source & community files diff --git a/apps/desktop/src-tauri/src/commands.rs b/apps/desktop/src-tauri/src/commands.rs index f80ee897..1512d6d2 100644 --- a/apps/desktop/src-tauri/src/commands.rs +++ b/apps/desktop/src-tauri/src/commands.rs @@ -501,8 +501,25 @@ pub async fn remote_fetch( pub async fn repository_group_update( path: String, pull: bool, + runId: String, ) -> AppResult { - blocking(move || remote::group_update(&path, pull)).await + let control = crate::core::group_update::control(&runId)?; + blocking(move || remote::group_update_controlled(&path, pull, &control)).await +} + +#[tauri::command] +pub fn repository_group_start(runId: String) -> AppResult<()> { + crate::core::group_update::start(&runId) +} + +#[tauri::command] +pub async fn repository_group_cancel(runId: String) -> AppResult<()> { + blocking(move || crate::core::group_update::cancel(&runId)).await +} + +#[tauri::command] +pub async fn repository_group_finish(runId: String) -> AppResult<()> { + blocking(move || crate::core::group_update::finish(&runId)).await } #[tauri::command] diff --git a/apps/desktop/src-tauri/src/core/group_update.rs b/apps/desktop/src-tauri/src/core/group_update.rs new file mode 100644 index 00000000..3c96520f --- /dev/null +++ b/apps/desktop/src-tauri/src/core/group_update.rs @@ -0,0 +1,79 @@ +use std::collections::HashMap; +use std::sync::{Arc, Mutex, OnceLock}; + +use crate::error::{AppError, AppResult}; + +#[derive(Default)] +pub struct GroupUpdateControl { + cancelled: Mutex, +} + +impl GroupUpdateControl { + pub fn cancel(&self) -> AppResult<()> { + *self + .cancelled + .lock() + .map_err(|_| AppError::other("Group update lock poisoned"))? = true; + Ok(()) + } + + pub fn is_cancelled(&self) -> bool { + self.cancelled + .lock() + .map(|cancelled| *cancelled) + .unwrap_or(true) + } + + pub fn with_active(&self, action: impl FnOnce() -> AppResult) -> AppResult { + let cancelled = self + .cancelled + .lock() + .map_err(|_| AppError::other("Group update lock poisoned"))?; + if *cancelled { + return Err(AppError::other("Group update cancelled")); + } + action() + } +} + +type Runs = HashMap>; +static RUNS: OnceLock> = OnceLock::new(); + +fn runs() -> &'static Mutex { + RUNS.get_or_init(|| Mutex::new(HashMap::new())) +} + +pub fn start(id: &str) -> AppResult<()> { + let mut runs = runs() + .lock() + .map_err(|_| AppError::other("Group update registry poisoned"))?; + if runs.contains_key(id) { + return Err(AppError::other("Group update already exists")); + } + runs.insert(id.into(), Arc::new(GroupUpdateControl::default())); + Ok(()) +} + +pub fn control(id: &str) -> AppResult> { + runs() + .lock() + .map_err(|_| AppError::other("Group update registry poisoned"))? + .get(id) + .cloned() + .ok_or_else(|| AppError::other("Group update is no longer active")) +} + +pub fn cancel(id: &str) -> AppResult<()> { + control(id)?.cancel() +} + +pub fn finish(id: &str) -> AppResult<()> { + let control = runs() + .lock() + .map_err(|_| AppError::other("Group update registry poisoned"))? + .remove(id); + if let Some(control) = control { + control.cancel()?; + } + Ok(()) +} diff --git a/apps/desktop/src-tauri/src/core/mod.rs b/apps/desktop/src-tauri/src/core/mod.rs index 84ceec1b..96d54be3 100644 --- a/apps/desktop/src-tauri/src/core/mod.rs +++ b/apps/desktop/src-tauri/src/core/mod.rs @@ -6,6 +6,7 @@ pub mod commit; pub mod conflict; pub mod diff; pub mod files; +pub mod group_update; pub mod history; pub mod misc; pub mod remote; diff --git a/apps/desktop/src-tauri/src/core/remote.rs b/apps/desktop/src-tauri/src/core/remote.rs index f4c6225c..3205cc3d 100644 --- a/apps/desktop/src-tauri/src/core/remote.rs +++ b/apps/desktop/src-tauri/src/core/remote.rs @@ -1,7 +1,7 @@ use std::cell::RefCell; use std::collections::{HashMap, HashSet}; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::{Mutex, OnceLock, RwLock}; use git2::{ @@ -11,6 +11,7 @@ use git2::{ use crate::error::{AppError, AppResult}; +use super::group_update::GroupUpdateControl; use super::types::{GeneratedKey, GroupUpdateResult, OpOutcome, RefMovement, RemoteInfo}; static CREDENTIAL_PREFS: OnceLock> = OnceLock::new(); @@ -458,8 +459,32 @@ pub fn fetch(path: &str, remote_name: &str, tags: bool, prune: bool) -> AppResul }) } -// This deliberately does not call pull/merge: group pulls must never merge or rebase. pub fn group_update(path: &str, pull: bool) -> AppResult { + group_update_controlled(path, pull, &GroupUpdateControl::default()) +} + +pub fn group_update_controlled( + path: &str, + pull: bool, + control: &GroupUpdateControl, +) -> AppResult { + let result = group_update_inner(path, pull, control); + if control.is_cancelled() { + return Ok(GroupUpdateResult { + status: "cancelled".into(), + message: "Cancelled; completed updates were kept".into(), + changes: result.map(|result| result.changes).unwrap_or_default(), + }); + } + result +} + +fn group_update_inner( + path: &str, + pull: bool, + control: &GroupUpdateControl, +) -> AppResult { + control.with_active(|| Ok(()))?; if !Path::new(path).is_dir() { return Ok(GroupUpdateResult { status: "skipped".into(), @@ -481,7 +506,10 @@ pub fn group_update(path: &str, pull: bool) -> AppResult { let before = fetched_refs(&repo)?; let mut failures = Vec::new(); for name in &names { - if let Err(error) = fetch(path, name, false, false) { + if control.is_cancelled() { + break; + } + if let Err(error) = group_fetch(path, name, control, None) { failures.push(format!("{name}: {error}")); } } @@ -550,16 +578,19 @@ pub fn group_update(path: &str, pull: bool) -> AppResult { .ok_or_else(|| AppError::other("Invalid HEAD name"))? .to_string(); let branch_name = head.shorthand().unwrap_or(&refname).to_string(); - let branch = repo.find_branch(&branch_name, git2::BranchType::Local)?; - let upstream = match branch.upstream() { - Ok(upstream) => upstream, - Err(_) => return Ok(result("skipped", format!("{branch_name} has no upstream"))), + let upstream_ref = match repo.branch_upstream_name(&refname) { + Ok(name) => name + .as_str() + .ok_or_else(|| AppError::other("Invalid upstream name"))? + .to_string(), + Err(error) if error.code() == git2::ErrorCode::NotFound => { + return Ok(result( + "skipped", + format!("{branch_name} has no upstream configured"), + )); + } + Err(error) => return Err(error.into()), }; - let upstream_ref = upstream - .get() - .name() - .ok_or_else(|| AppError::other("Invalid upstream name"))? - .to_string(); let remote = repo.branch_upstream_remote(&refname)?; let remote = remote .as_str() @@ -574,10 +605,30 @@ pub fn group_update(path: &str, pull: bool) -> AppResult { } let old = head.peel_to_commit()?.id(); if remote != "." { - fetch(path, remote, false, false)?; + let merge_ref = repo + .config()? + .get_string(&format!("branch.{branch_name}.merge"))?; + if let Err(error) = group_fetch(path, remote, control, Some((&merge_ref, &upstream_ref))) { + if matches!(&error, AppError::Git(error) if error.code() == git2::ErrorCode::NotFound) { + return Ok(result( + "skipped", + format!("Configured upstream {upstream_ref} is missing on remote {remote}"), + )); + } + return Err(error); + } } - // Re-read the configured ref after fetching, never guess a same-named branch. - let target = repo.find_reference(&upstream_ref)?.peel_to_commit()?; + control.with_active(|| Ok(()))?; + let target = match repo.find_reference(&upstream_ref) { + Ok(reference) => reference.peel_to_commit()?, + Err(error) if error.code() == git2::ErrorCode::NotFound => { + return Ok(result( + "skipped", + format!("Configured upstream {upstream_ref} is missing after fetch"), + )); + } + Err(error) => return Err(error.into()), + }; let new = target.id(); let (ahead, behind) = repo.graph_ahead_behind(old, new)?; if behind == 0 { @@ -593,8 +644,6 @@ pub fn group_update(path: &str, pull: bool) -> AppResult { if ahead > 0 { return Ok(result("skipped", format!("{branch_name} has diverged ({ahead} ahead, {behind} behind); fast-forward unavailable"))); } - // A network fetch can take a while; an external Git client may have changed - // HEAD or the working tree in the meantime. Do not apply the stale plan. let current = repo.head()?; if current.name() != Some(refname.as_str()) || current.target() != Some(old) @@ -611,19 +660,26 @@ pub fn group_update(path: &str, pull: bool) -> AppResult { "Working tree changed during fetch; try again".into(), )); } - let mut checkout = CheckoutBuilder::new(); - checkout.safe(); - if let Err(error) = repo.checkout_tree(target.as_object(), Some(&mut checkout)) { - if error.code() == git2::ErrorCode::Conflict { + if let Some(reason) = unsupported_group_checkout(&repo, &target.tree()?)? { + return Ok(result("skipped", reason)); + } + let checkout = control.with_active(|| { + let mut checkout = CheckoutBuilder::new(); + checkout.safe(); + repo.checkout_tree(target.as_object(), Some(&mut checkout))?; + repo.find_reference(&refname)? + .set_target(new, &format!("pull: fast-forward to {upstream_ref}"))?; + Ok(()) + }); + if let Err(error) = checkout { + if matches!(&error, AppError::Git(error) if error.code() == git2::ErrorCode::Conflict) { return Ok(result( "skipped", format!("Local changes prevent checkout: {error}"), )); } - return Err(error.into()); + return Err(error); } - repo.find_reference(&refname)? - .set_target(new, &format!("pull: fast-forward to {upstream_ref}"))?; Ok(GroupUpdateResult { status: "ok".into(), message: format!("Fast-forwarded {branch_name} by {behind} commit(s)"), @@ -636,6 +692,142 @@ pub fn group_update(path: &str, pull: bool) -> AppResult { }) } +fn group_fetch( + path: &str, + name: &str, + control: &GroupUpdateControl, + upstream: Option<(&str, &str)>, +) -> AppResult<()> { + control.with_active(|| Ok(()))?; + let repo = super::repo::open(path)?; + prime_account_bindings(Some(&repo)); + let mut remote = repo.find_remote(name)?; + let mut callbacks = make_callbacks(); + callbacks.transfer_progress(|_| !control.is_cancelled()); + callbacks.sideband_progress(|_| !control.is_cancelled()); + let mut options = FetchOptions::new(); + options.remote_callbacks(callbacks); + let refspecs: Vec = upstream + .map(|(source, target)| format!("+{source}:{target}")) + .into_iter() + .collect(); + remote.download(&refspecs, Some(&mut options))?; + remote.disconnect()?; + control.with_active(|| { + let received = AtomicBool::new(upstream.is_none()); + let mut updates = RemoteCallbacks::new(); + updates.update_tips(|name, _, _| { + if upstream.is_some_and(|(_, target)| name == target) { + received.store(true, Ordering::SeqCst); + } + true + }); + remote.update_tips( + Some(&mut updates), + git2::RemoteUpdateFlags::UPDATE_FETCHHEAD | git2::RemoteUpdateFlags::REPORT_UNCHANGED, + AutotagOption::Unspecified, + None, + )?; + if !received.load(Ordering::SeqCst) { + return Err(git2::Error::new( + git2::ErrorCode::NotFound, + git2::ErrorClass::Reference, + "Configured upstream was not received from the remote", + ) + .into()); + } + if repo + .config()? + .get_bool(&format!("remote.{name}.prune")) + .unwrap_or(false) + || repo.config()?.get_bool("fetch.prune").unwrap_or(false) + { + remote.prune(None)?; + } + Ok(()) + }) +} + +fn unsupported_group_checkout(repo: &Repository, tree: &git2::Tree) -> AppResult> { + let config = repo.config()?; + let hooks = config + .get_path("core.hooksPath") + .ok() + .map(|path| { + if path.is_absolute() { + path + } else { + repo.workdir().unwrap_or(repo.path()).join(path) + } + }) + .unwrap_or_else(|| repo.commondir().join("hooks")); + for hook in ["post-merge", "post-checkout"] { + if executable_hook(&hooks.join(hook)) { + return Ok(Some(format!( + "Repository uses {hook}; pull with Git CLI so hooks run" + ))); + } + } + if !repo.submodules()?.is_empty() { + return Ok(Some( + "Repository uses submodules; pull with Git CLI to update them".into(), + )); + } + let mut reason = None; + let mut error = None; + let walked = tree.walk(git2::TreeWalkMode::PreOrder, |root, entry| { + let path = format!("{root}{}", entry.name().unwrap_or("")); + if entry.filemode() == 0o160000 || entry.name() == Some(".gitmodules") { + reason = Some("Repository uses submodules; pull with Git CLI to update them".into()); + return git2::TreeWalkResult::Abort; + } + if entry.kind() != Some(git2::ObjectType::Blob) { return git2::TreeWalkResult::Ok; } + let check = || -> AppResult { + let attr = repo.get_attr_bytes(Path::new(&path), "filter", git2::AttrCheckFlags::FILE_THEN_INDEX)?; + if matches!(git2::AttrValue::from_bytes(attr), git2::AttrValue::String(_) | git2::AttrValue::Bytes(_)) { return Ok(true); } + if entry.name() == Some(".gitattributes") { + let blob = repo.find_blob(entry.id())?; + let text = String::from_utf8_lossy(blob.content()); + return Ok(text.lines().filter(|line| !line.trim_start().starts_with('#')).any(|line| line.split_whitespace().skip(1).any(|attr| attr.starts_with("filter=")))); + } + Ok(false) + }; + match check() { + Ok(true) => { + reason = Some("Repository uses external filters (such as Git LFS); pull with Git CLI so files are processed".into()); + git2::TreeWalkResult::Abort + } + Ok(false) => git2::TreeWalkResult::Ok, + Err(err) => { error = Some(err); git2::TreeWalkResult::Abort } + } + }); + if let Some(error) = error { + return Err(error); + } + if reason.is_none() { + walked?; + } + Ok(reason) +} + +fn executable_hook(path: &Path) -> bool { + let Ok(metadata) = path.metadata() else { + return false; + }; + if !metadata.is_file() { + return false; + } + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + metadata.permissions().mode() & 0o111 != 0 + } + #[cfg(not(unix))] + { + true + } +} + fn fetched_refs(repo: &Repository) -> AppResult> { let mut refs = HashMap::new(); for reference in repo.references()? { diff --git a/apps/desktop/src-tauri/src/core/types.rs b/apps/desktop/src-tauri/src/core/types.rs index 5de751ae..5eddae2c 100644 --- a/apps/desktop/src-tauri/src/core/types.rs +++ b/apps/desktop/src-tauri/src/core/types.rs @@ -280,7 +280,6 @@ pub struct GeneratedKey { pub public_key: String, } -/// Result of a group action for one repository, including partial fetch failures. #[derive(Serialize, Debug)] #[serde(rename_all = "camelCase")] pub struct GroupUpdateResult { diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index a260f86e..5d613deb 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -30,6 +30,10 @@ pub mod test_api { file_diff_with, }; pub use crate::core::files::{file_contents, index_files, tree_files}; + pub use crate::core::group_update::{ + cancel as group_update_cancel, control as group_update_control, + finish as group_update_finish, start as group_update_start, GroupUpdateControl, + }; pub use crate::core::history::{ file_history, list as history, position as history_position, search as history_search, unpushed, @@ -39,8 +43,8 @@ pub mod test_api { tag_delete, tag_list, }; pub use crate::core::remote::{ - add as remote_add, checkout_remote_ref, fetch, group_update, list as remote_list, pull, - push, + add as remote_add, checkout_remote_ref, fetch, group_update, group_update_controlled, + list as remote_list, pull, push, }; pub use crate::core::repo::{ cleanup_state, discover, info as repo_info, init, ref_fingerprint, set_config, status, @@ -187,6 +191,9 @@ pub fn run() { commands::remote_fetch, commands::remote_pull, commands::repository_group_update, + commands::repository_group_start, + commands::repository_group_cancel, + commands::repository_group_finish, commands::remote_pull_branch, commands::remote_push, commands::remote_push_tag, diff --git a/apps/desktop/src-tauri/tests/git_engine.rs b/apps/desktop/src-tauri/tests/git_engine.rs index e246d8e0..f93014fa 100644 --- a/apps/desktop/src-tauri/tests/git_engine.rs +++ b/apps/desktop/src-tauri/tests/git_engine.rs @@ -22,7 +22,6 @@ impl TempRepo { std::fs::create_dir_all(&dir).unwrap(); let path = dir.to_str().unwrap(); core::init(path).unwrap(); - // Tests use master and unsigned commits regardless of the developer's Git defaults. git2::Repository::open(path) .unwrap() .set_head("refs/heads/master") @@ -3040,7 +3039,6 @@ fn group_pull_fast_forwards_configured_upstream_without_merging() { let origin = bare_origin(&local); core::push(local.path(), "origin", None, false, false, true).unwrap(); let other = clone_of(&origin, &local, "group"); - // A differently named local branch must still follow its configured upstream. let repo = git2::Repository::open(other.path()).unwrap(); repo.find_branch("master", git2::BranchType::Local) .unwrap() @@ -3062,7 +3060,6 @@ fn group_pull_fast_forwards_configured_upstream_without_merging() { core::group_update(other.path(), true).unwrap().status, "up_to_date" ); - // Divergence must not use merge or configured rebase. other.write("mine.txt", "mine\n"); let mine = commit_all(&other, "mine"); local.write("a.txt", "remote again\n"); @@ -3196,3 +3193,214 @@ fn group_fetch_reports_moved_refs_and_continues_after_remote_failure() { .contains("no commits")); std::fs::remove_dir_all(origin).unwrap(); } + +#[test] +fn group_pull_restores_missing_tracking_refs_and_reports_deleted_upstreams() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "missing-upstream"); + let repo = git2::Repository::open(other.path()).unwrap(); + repo.find_reference("refs/remotes/origin/master") + .unwrap() + .delete() + .unwrap(); + assert!(repo + .find_branch("master", git2::BranchType::Local) + .unwrap() + .upstream() + .is_err()); + assert_eq!( + core::group_update(other.path(), true).unwrap().status, + "up_to_date" + ); + git2::Repository::open_bare(&origin) + .unwrap() + .find_reference("refs/heads/master") + .unwrap() + .delete() + .unwrap(); + let result = core::group_update(other.path(), true).unwrap(); + assert_eq!(result.status, "skipped"); + assert!( + result + .message + .contains("Configured upstream refs/remotes/origin/master is missing"), + "{}", + result.message + ); + assert!(!result.message.contains("no upstream")); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), old); + std::fs::remove_dir_all(origin).unwrap(); +} + +#[test] +fn group_pull_skips_submodules_and_external_filters_before_checkout() { + for (file, content, reason) in [ + ( + ".gitmodules", + "[submodule \"sub\"]\npath = sub\nurl = ../sub.git\n", + "submodules", + ), + ( + ".gitattributes", + "*.txt filter=lfs diff=lfs -text\n", + "external filters", + ), + ] { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "unsupported"); + local.write(file, content); + local.write( + "a.txt", + "version https://git-lfs.github.com/spec/v1\noid sha256:123\nsize 1\n", + ); + commit_all(&local, "special checkout"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let result = core::group_update(other.path(), true).unwrap(); + assert_eq!(result.status, "skipped", "{}", result.message); + assert!(result.message.contains(reason), "{}", result.message); + assert_eq!(other.read("a.txt"), "base\n"); + assert_eq!( + git2::Repository::open(other.path()) + .unwrap() + .head() + .unwrap() + .target() + .unwrap() + .to_string(), + old + ); + std::fs::remove_dir_all(origin).unwrap(); + } +} + +#[test] +fn group_pull_skips_active_hooks_in_the_configured_directory() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "hooks"); + let repo = git2::Repository::open(other.path()).unwrap(); + let hooks = repo.path().join("custom-hooks"); + std::fs::create_dir_all(&hooks).unwrap(); + core::set_config( + Some(other.path()), + "core.hooksPath", + hooks.to_str().unwrap(), + false, + ) + .unwrap(); + local.write("a.txt", "updated\n"); + commit_all(&local, "updated"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + for name in ["post-checkout", "post-merge"] { + let hook = hooks.join(name); + std::fs::write(&hook, "#!/bin/sh\nexit 0\n").unwrap(); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + std::fs::set_permissions(&hook, std::fs::Permissions::from_mode(0o755)).unwrap(); + } + let result = core::group_update(other.path(), true).unwrap(); + assert_eq!(result.status, "skipped"); + assert!(result.message.contains(name)); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), old); + std::fs::remove_file(hook).unwrap(); + } + assert_eq!(core::group_update(other.path(), true).unwrap().status, "ok"); + std::fs::remove_dir_all(origin).unwrap(); +} + +#[test] +fn group_cancel_prevents_all_future_updates() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let control = core::GroupUpdateControl::default(); + control.cancel().unwrap(); + assert!(control + .with_active::<()>(|| panic!("cancelled action must not run")) + .is_err()); + let result = core::group_update_controlled(local.path(), true, &control).unwrap(); + assert_eq!(result.status, "cancelled"); + assert_eq!( + git2::Repository::open(local.path()) + .unwrap() + .head() + .unwrap() + .target() + .unwrap() + .to_string(), + old + ); +} + +#[test] +fn group_cancel_acknowledges_a_stalled_remote_without_waiting_for_the_socket() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap(); + core::remote_add( + local.path(), + "origin", + &format!("http://{}/repo.git", listener.local_addr().unwrap()), + ) + .unwrap(); + let (accepted_tx, accepted_rx) = std::sync::mpsc::channel(); + let (release_tx, release_rx) = std::sync::mpsc::channel(); + let server = std::thread::spawn(move || { + let (socket, _) = listener.accept().unwrap(); + drop(listener); + accepted_tx.send(()).unwrap(); + release_rx + .recv_timeout(std::time::Duration::from_secs(10)) + .unwrap(); + drop(socket); + }); + let control = std::sync::Arc::new(core::GroupUpdateControl::default()); + let worker_control = control.clone(); + let path = local.path().to_string(); + let worker = + std::thread::spawn(move || core::group_update_controlled(&path, false, &worker_control)); + accepted_rx + .recv_timeout(std::time::Duration::from_secs(5)) + .unwrap(); + let start = std::time::Instant::now(); + control.cancel().unwrap(); + assert!(start.elapsed() < std::time::Duration::from_secs(1)); + assert!(!worker.is_finished()); + release_tx.send(()).unwrap(); + server.join().unwrap(); + assert_eq!(worker.join().unwrap().unwrap().status, "cancelled"); + let repo = git2::Repository::open(local.path()).unwrap(); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), old); + assert!(repo.find_reference("refs/remotes/origin/master").is_err()); +} + +#[test] +fn group_run_registry_keeps_cancellation_on_in_flight_handles_after_finish() { + let local = TempRepo::new(); + let id = local.path(); + core::group_update_start(id).unwrap(); + assert!(core::group_update_start(id).is_err()); + let control = core::group_update_control(id).unwrap(); + assert!(!control.is_cancelled()); + core::group_update_cancel(id).unwrap(); + assert!(control.is_cancelled()); + core::group_update_finish(id).unwrap(); + assert!(core::group_update_control(id).is_err()); + assert!(control + .with_active::<()>(|| panic!("finished handles cannot mutate")) + .is_err()); + core::group_update_finish(id).unwrap(); +} diff --git a/apps/desktop/src/core/ipc.ts b/apps/desktop/src/core/ipc.ts index b17003f5..bcc1fcb0 100644 --- a/apps/desktop/src/core/ipc.ts +++ b/apps/desktop/src/core/ipc.ts @@ -468,12 +468,24 @@ export const ipc = { } return invoke('remote_fetch', { path, remote, tags, prune }); }, - async groupUpdate(path: string, pull: boolean): Promise { + async groupStart(runId: string): Promise { + if (!isTauri()) return; + return invoke('repository_group_start', { runId }); + }, + async groupCancel(runId: string): Promise { + if (!isTauri()) return; + return invoke('repository_group_cancel', { runId }); + }, + async groupFinish(runId: string): Promise { + if (!isTauri()) return; + return invoke('repository_group_finish', { runId }); + }, + async groupUpdate(path: string, pull: boolean, runId: string): Promise { if (!isTauri()) { await delay(400); return { status: 'up_to_date', message: pull ? 'main is already up to date (demo)' : 'Fetched origin; no refs moved (demo)', changes: [] }; } - return invoke('repository_group_update', { path, pull }); + return invoke('repository_group_update', { path, pull, runId }); }, async pull(path: string, remote: string, mode?: 'merge' | 'rebase'): Promise { if (!isTauri()) { diff --git a/apps/desktop/src/features/repository/GroupUpdateDialog.tsx b/apps/desktop/src/features/repository/GroupUpdateDialog.tsx index 9be03dd1..0e65c175 100644 --- a/apps/desktop/src/features/repository/GroupUpdateDialog.tsx +++ b/apps/desktop/src/features/repository/GroupUpdateDialog.tsx @@ -10,28 +10,31 @@ import { Spinner, } from '@angkorgit/design-system'; import { shortenHome } from '@/shared/utils'; -import type { GroupRepositoryResult } from './groupUpdate'; +import { classify, type GroupResultKind, type GroupRepositoryResult } from './groupUpdate'; export interface GroupUpdateProgress { + runId: string; name: string; pull: boolean; total: number; results: GroupRepositoryResult[]; running: boolean; + cancelling: boolean; } -export function GroupUpdateDialog({ progress, onClose }: { +export function GroupUpdateDialog({ progress, onClose, onCancel }: { progress: GroupUpdateProgress | null; onClose: () => void; + onCancel: () => void; }) { if (!progress) return null; - const { name, pull, total, results, running } = progress; - const moved = results.filter((r) => r.changes.length > 0).length; - const unchanged = results.filter( - (r) => (r.status === 'ok' || r.status === 'up_to_date') && r.changes.length === 0, - ).length; - const skipped = results.filter((r) => r.status === 'skipped').length; - const failed = results.filter((r) => r.status === 'failed').length; + const { name, pull, total, results, running, cancelling } = progress; + const counts: Record = { updated: 0, unchanged: 0, skipped: 0, failed: 0, partial: 0, cancelled: 0 }; + for (const result of results) counts[classify(result)]++; + const labels: Record = { + updated: 'Updated', unchanged: pull ? 'Up to date' : 'Fetched', skipped: 'Skipped', + failed: 'Failed', partial: 'Partial', cancelled: 'Cancelled', + }; return ( { if (!open && !running) onClose(); }}>
{running && } - {running ? `${results.length} of ${total} repositories complete` : `${total} repositories complete`} · {moved} updated · {unchanged} {pull ? 'up to date' : 'unchanged'} · {skipped} skipped · {failed} failed + {cancelling ? 'Cancelling…' : running ? `${results.length} of ${total} repositories complete` : `${total} repositories complete`} · {counts.updated} updated · {counts.unchanged} {pull ? 'up to date' : 'unchanged'} · {counts.skipped} skipped · {counts.failed} failed{counts.partial > 0 && ` · ${counts.partial} partial`}{counts.cancelled > 0 && ` · ${counts.cancelled} cancelled`}
{results.map((result) => (
{result.repo.name} - {result.status === 'failed' ? 'Failed' : result.status === 'skipped' ? 'Skipped' : result.changes.length > 0 ? 'Updated' : pull ? 'Up to date' : 'Fetched'} + {labels[classify(result)]}

{shortenHome(result.repo.path)}

{result.message}

@@ -68,7 +71,10 @@ export function GroupUpdateDialog({ progress, onClose }: {
))}
- + + {running && } + +
); diff --git a/apps/desktop/src/features/repository/WelcomePage.tsx b/apps/desktop/src/features/repository/WelcomePage.tsx index 8d10979d..6f7d451e 100644 --- a/apps/desktop/src/features/repository/WelcomePage.tsx +++ b/apps/desktop/src/features/repository/WelcomePage.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { chordText, groupRepos, @@ -88,6 +88,7 @@ export function WelcomePage() { const setRepoGroup = useSettings((s) => s.setRepoGroup); const moveRepoGroup = useSettings((s) => s.moveRepoGroup); const busy = useRepo((s) => s.busy); + const groupRun = useRef<{ id: string; controller: AbortController; cancelling: boolean; ready: Promise } | null>(null); const [groupProgress, setGroupProgress] = useState(null); const [query, setQuery] = useState(''); const [activePath, setActivePath] = useState(null); @@ -100,22 +101,58 @@ export function WelcomePage() { const [groupDrop, setGroupDrop] = useState<{ id: string; position: RepoGroupDropPosition } | null>(null); const [version, setVersion] = useState(''); + useEffect(() => () => { + const run = groupRun.current; + if (run) void run.ready.then(() => ipc.groupCancel(run.id)).then(() => run.controller.abort()).catch(() => undefined); + }, []); + + async function cancelGroup() { + const run = groupRun.current; + if (!run || run.cancelling) return; + run.cancelling = true; + setGroupProgress((current) => current?.runId === run.id ? { ...current, cancelling: true } : current); + try { + await run.ready; + await ipc.groupCancel(run.id); + run.controller.abort(); + } catch (error) { + run.cancelling = false; + setGroupProgress((current) => current?.runId === run.id ? { ...current, cancelling: false } : current); + toast.error(`Could not cancel group: ${(error as { message?: string })?.message ?? error}`); + } + } + async function updateGroup(group: RepoGroup, repos: RecentRepository[], pull: boolean) { - if (useRepo.getState().busy || useRepo.getState().opening || repos.length === 0) return; + if (groupRun.current || useRepo.getState().busy || useRepo.getState().opening || repos.length === 0) return; + const id = crypto.randomUUID(); + const run = { id, controller: new AbortController(), cancelling: false, ready: ipc.groupStart(id) }; + groupRun.current = run; useRepo.getState().setBusy(pull ? 'Pulling group…' : 'Fetching group…'); - setGroupProgress({ name: group.name, pull, total: repos.length, results: [], running: true }); + setGroupProgress({ runId: run.id, name: group.name, pull, total: repos.length, results: [], running: true, cancelling: false }); try { - await updateGroupRepositories(repos, (path) => ipc.groupUpdate(path, pull), (result) => { - setGroupProgress((current) => current ? { ...current, results: [...current.results, result] } : current); - }); + await run.ready; + await updateGroupRepositories(repos, (path) => ipc.groupUpdate(path, pull, run.id), (result) => { + setGroupProgress((current) => { + if (current?.runId !== run.id) return current; + const existing = current.results.some((r) => r.repo.path === result.repo.path); + return { ...current, results: existing + ? current.results.map((r) => r.repo.path === result.repo.path ? result : r) + : [...current.results, result] }; + }); + }, run.controller.signal); if (repos.some((r) => r.path === useRepo.getState().repo?.path)) { - await useRepo.getState().refresh(); + if (run.controller.signal.aborted) void useRepo.getState().refresh().catch(() => undefined); + else await useRepo.getState().refresh(); } } catch (error) { - toast.error(`Could not refresh repository: ${(error as { message?: string })?.message ?? error}`); + toast.error(`Group update failed: ${(error as { message?: string })?.message ?? error}`); } finally { - useRepo.getState().setBusy(null); - setGroupProgress((current) => current ? { ...current, running: false } : current); + await ipc.groupFinish(run.id).catch(() => undefined); + if (groupRun.current === run) { + groupRun.current = null; + useRepo.getState().setBusy(null); + } + setGroupProgress((current) => current?.runId === run.id ? { ...current, running: false, cancelling: false } : current); } } @@ -709,7 +746,7 @@ export function WelcomePage() { )} - setGroupProgress(null)} /> + setGroupProgress(null)} onCancel={() => void cancelGroup()} /> void openRepository(path)} /> diff --git a/apps/desktop/src/features/repository/groupUpdate.ts b/apps/desktop/src/features/repository/groupUpdate.ts index f74e0b31..06b33027 100644 --- a/apps/desktop/src/features/repository/groupUpdate.ts +++ b/apps/desktop/src/features/repository/groupUpdate.ts @@ -4,19 +4,41 @@ export interface GroupRepositoryResult extends GroupUpdateResult { repo: RecentRepository; } -// Sequential writes keep linked worktrees (which share refs) from racing each other. +export type GroupResultKind = 'updated' | 'unchanged' | 'skipped' | 'failed' | 'partial' | 'cancelled'; + +export function classify(result: GroupUpdateResult): GroupResultKind { + if (result.status === 'cancelled') return 'cancelled'; + if (result.status === 'failed') return result.changes.length > 0 ? 'partial' : 'failed'; + if (result.status === 'skipped') return 'skipped'; + return result.changes.length > 0 ? 'updated' : 'unchanged'; +} + export async function updateGroupRepositories( repos: readonly RecentRepository[], update: (path: string) => Promise, onResult: (result: GroupRepositoryResult) => void, + signal?: AbortSignal, ): Promise { for (const repo of repos) { - let result: GroupUpdateResult; - try { - result = await update(repo.path); - } catch (error) { - result = { status: 'failed', message: (error as { message?: string })?.message ?? String(error), changes: [] }; + const cancelled: GroupUpdateResult = { status: 'cancelled', message: 'Cancelled; completed updates are kept', changes: [] }; + if (signal?.aborted) { + onResult({ ...cancelled, repo }); + continue; } + const pending = Promise.resolve().then(() => signal?.aborted ? cancelled : update(repo.path)).catch((error): GroupUpdateResult => ({ + status: 'failed', message: (error as { message?: string })?.message ?? String(error), changes: [], + })); + let onAbort: (() => void) | undefined; + const aborted = new Promise((resolve) => { + onAbort = () => resolve(cancelled); + signal?.addEventListener('abort', onAbort, { once: true }); + if (signal?.aborted) onAbort(); + }); + const result = await Promise.race([pending, aborted]); + if (onAbort) signal?.removeEventListener('abort', onAbort); onResult({ ...result, repo }); + if (result === cancelled) { + void pending.then((settled) => onResult({ ...settled, repo })); + } } } diff --git a/docs/assets/group-update-cancel-summary.png b/docs/assets/group-update-cancel-summary.png new file mode 100644 index 0000000000000000000000000000000000000000..de1f03d0345d83d3309f3a9400295c16b68ea098 GIT binary patch literal 108766 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

#sk47p>C*m2guRFgehfj==sf+VKA>RXpY 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 E0NDd;-T(jq literal 0 HcmV?d00001 diff --git a/packages/core/src/git/types.ts b/packages/core/src/git/types.ts index f73997b1..7f97106a 100644 --- a/packages/core/src/git/types.ts +++ b/packages/core/src/git/types.ts @@ -246,7 +246,7 @@ export interface FileBlame { } export interface GroupUpdateResult { - status: 'ok' | 'up_to_date' | 'skipped' | 'failed'; + status: 'ok' | 'up_to_date' | 'skipped' | 'failed' | 'cancelled'; message: string; changes: RefMovement[]; } diff --git a/tests/e2e/smoke.spec.ts b/tests/e2e/smoke.spec.ts index ecf313f1..a032743f 100644 --- a/tests/e2e/smoke.spec.ts +++ b/tests/e2e/smoke.spec.ts @@ -3100,3 +3100,48 @@ test('group pull summary shows moved refs, skips, failures and unchanged reposit await dialog.getByRole('button', { name: 'Done', exact: true }).click(); await expect(dialog).toBeHidden(); }); + + +test('group fetch classifies partial failures once and cancellation releases a hanging run', async ({ page }) => { + await page.goto('/'); + await expect(page.getByText('Recent repositories')).toBeVisible({ timeout: 10_000 }); + await page.evaluate(async () => { + const [{ ipc }, { useSettings }, { useRepo }] = await Promise.all([ + import('/src/core/ipc.ts'), import('/src/features/settings/store.ts'), import('/src/features/repository/store.ts'), + ]); + const repos = ['partial', 'slow', 'remaining'].map((name) => ({ path: `/projects/${name}`, name, lastOpenedAt: 0 })); + useRepo.setState({ recents: repos }); + useSettings.getState().addRepoGroup('Projects', 0, repos.map((r) => r.path)); + const tracker = window as unknown as { __groupCalls: string[]; __finishGroup: () => void }; + tracker.__groupCalls = []; + ipc.groupUpdate = async (path) => { + tracker.__groupCalls.push(path); + if (path.endsWith('/partial')) return { + status: 'failed', message: 'origin fetched; backup authentication failed', + changes: [{ name: 'origin/main', oldOid: '1234567890', newOid: 'abcdef0123', commits: 2 }], + }; + return new Promise((resolve) => { tracker.__finishGroup = () => resolve({ status: 'cancelled', message: 'Cancelled', changes: [] }); }); + }; + }); + await page.locator('[data-group-header]', { hasText: 'Projects' }).click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Fetch all', exact: true }).click(); + const dialog = page.getByRole('dialog'); + await expect(dialog).toContainText('Partial'); + await expect(dialog.getByRole('status')).toContainText('0 updated · 0 unchanged · 0 skipped · 0 failed · 1 partial'); + await dialog.getByRole('button', { name: 'Cancel run', exact: true }).click(); + await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeEnabled(); + await expect(dialog.getByRole('status')).toContainText('1 partial · 2 cancelled'); + await page.screenshot({ path: '/tmp/angkorgit-group-cancel-summary.png' }); + await page.evaluate(async () => { + const { useRepo } = await import('/src/features/repository/store.ts'); + if (useRepo.getState().busy !== null) throw new Error('Cancellation kept the app busy'); + const tracker = window as unknown as { __groupCalls: string[] }; + if (tracker.__groupCalls.join(',') !== '/projects/partial,/projects/slow') throw new Error('Started a repository after cancellation'); + }); + await dialog.getByRole('button', { name: 'Done', exact: true }).click(); + await expect(dialog).toBeHidden(); + await page.evaluate(() => (window as unknown as { __finishGroup: () => void }).__finishGroup()); + await expect(dialog).toBeHidden(); + await page.locator('[data-group-header]', { hasText: 'Projects' }).click({ button: 'right' }); + await expect(page.getByRole('menuitem', { name: 'Fetch all', exact: true })).toBeEnabled(); +}); diff --git a/tests/unit/groupUpdate.test.ts b/tests/unit/groupUpdate.test.ts index 2c2d73b3..fea754be 100644 --- a/tests/unit/groupUpdate.test.ts +++ b/tests/unit/groupUpdate.test.ts @@ -1,5 +1,5 @@ -import { expect, it } from 'vitest'; -import { updateGroupRepositories, type GroupRepositoryResult } from '../../apps/desktop/src/features/repository/groupUpdate'; +import { expect, it, vi } from 'vitest'; +import { classify, updateGroupRepositories, type GroupRepositoryResult } from '../../apps/desktop/src/features/repository/groupUpdate'; it('runs in order, preserves partial results, and continues after a repository fails', async () => { const repos = ['missing', 'updated', 'failed', 'current'].map((name) => ({ name, path: `/${name}`, lastOpenedAt: 0 })); @@ -15,3 +15,42 @@ it('runs in order, preserves partial results, and continues after a repository f expect(results[2].message).toBe('Authentication failed'); expect(results.map((r) => r.repo)).toEqual(repos); }); + +it('gives partial success one outcome shared by counters and badges', () => { + const changes = [{ name: 'origin/main', oldOid: 'one', newOid: 'two', commits: 1 }]; + expect(classify({ status: 'failed', message: 'origin fetched, backup failed', changes })).toBe('partial'); + expect(classify({ status: 'failed', message: 'offline', changes: [] })).toBe('failed'); + expect(classify({ status: 'ok', message: 'fetched', changes })).toBe('updated'); + expect(classify({ status: 'ok', message: 'fetched', changes: [] })).toBe('unchanged'); + expect(classify({ status: 'up_to_date', message: 'current', changes: [] })).toBe('unchanged'); + expect(classify({ status: 'skipped', message: 'dirty', changes: [] })).toBe('skipped'); + expect(classify({ status: 'cancelled', message: 'stopped', changes })).toBe('cancelled'); +}); + +it('cancels a hanging operation without starting the remaining repositories and retains late results', async () => { + const repos = ['slow', 'next'].map((name) => ({ name, path: `/${name}`, lastOpenedAt: 0 })); + const controller = new AbortController(); + let finish!: (result: GroupRepositoryResult) => void; + const pending = new Promise((resolve) => { finish = resolve; }); + const update = vi.fn(() => pending); + const results: GroupRepositoryResult[] = []; + const run = updateGroupRepositories(repos, update, (result) => results.push(result), controller.signal); + await Promise.resolve(); + controller.abort(); + await run; + expect(update).toHaveBeenCalledTimes(1); + expect(results.map((r) => r.status)).toEqual(['cancelled', 'cancelled']); + finish({ repo: repos[0], status: 'cancelled', message: 'Kept completed remote fetch', changes: [{ name: 'origin/main', oldOid: 'one', newOid: 'two', commits: 1 }] }); + await vi.waitFor(() => expect(results).toHaveLength(3)); + expect(results[2].changes).toHaveLength(1); +}); + +it('does not start any operation when already cancelled', async () => { + const controller = new AbortController(); + controller.abort(); + const update = vi.fn(); + const results: GroupRepositoryResult[] = []; + await updateGroupRepositories([{ name: 'repo', path: '/repo', lastOpenedAt: 0 }], update, (r) => results.push(r), controller.signal); + expect(update).not.toHaveBeenCalled(); + expect(results[0].status).toBe('cancelled'); +}); From a7ae1520adf8efbf5d9a780c00104e5c40754208 Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Mon, 12 Oct 2026 17:35:32 +0200 Subject: [PATCH 04/10] fix: refine group checkout checks and run cleanup --- CHANGELOG.md | 6 +- CLAUDE.md | 31 +++-- .../src-tauri/src/core/group_update.rs | 118 ++++++++++++++++-- apps/desktop/src-tauri/src/core/remote.rs | 65 ++++++++-- apps/desktop/src-tauri/tests/git_engine.rs | 69 +++++++++- .../src/features/repository/groupUpdate.ts | 19 ++- packages/core/src/git/types.ts | 2 +- tests/e2e/smoke.spec.ts | 2 +- tests/unit/groupUpdate.test.ts | 16 ++- 9 files changed, 281 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d7aeeb3..b62bc58e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,11 @@ All notable changes to AngKorGit are documented here. The format follows unfinished operations, and diverged history. Cancel stops the remaining batch, prevents later ref/worktree updates, and releases the app even if a network read is stalled; completed updates are kept. Partial fetches have a single outcome in the - summary. Missing upstream refs are reported separately from unconfigured upstreams. + summary, including when a remote succeeds without moving refs. Missing upstream + refs are reported separately from unconfigured upstreams. Attribute checks inspect + changed file paths while retaining incoming attribute-rule checks. Ref-update errors + after checkout explicitly explain the working-tree/branch mismatch; abandoned run + entries expire on later registry activity. Repositories requiring hooks, submodule updates, or external filters such as Git LFS are skipped with guidance to use Git CLI. (#69) diff --git a/CLAUDE.md b/CLAUDE.md index abfe4a96..9cbfb531 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1039,7 +1039,7 @@ features/ │ │ "Drag a repository here, or move one from its menu."; the │ │ body grows to max-h-96 with groups. data-group-header=, │ │ data-group-section, data-recent-row=, data-group-tile -│ │ are the e2e hooks. HEADER MENU (right-click or "…"): Open all +│ │ are the e2e hooks. HEADER MENU (right-click or "…"): │ │ Fetch all / Pull all (fast-forward only) / Open all │ │ in tabs / Close its tabs / Move up / Move down / │ │ Edit group… / Ungroup… — repository/groups.ts openRepoGroup (ipc.pathsExist @@ -1049,16 +1049,25 @@ features/ │ │ ensureRepoRoute). GroupUpdateDialog + groupUpdate.ts run group │ │ fetch/pull sequentially (shared worktree refs) and show live │ │ per-repo results. classify() is shared by counters and badges: -│ │ partial fetches are one Partial outcome, never Updated + Failed. +│ │ Rust returns an explicit partial status when some remotes fail +│ │ but others succeed, even when no refs move; counters never overlap. │ │ groupStart/groupCancel/groupFinish manage a native runId token. │ │ remote::group_update_controlled separates remote.download from │ │ update_tips; core/group_update.rs guards ref and checkout writes │ │ with the cancellation mutex. Cancel acknowledges without waiting │ │ on socket I/O, aborts the frontend wait and remaining repos, and │ │ releases useRepo.busy; already completed changes are retained. +│ │ Cancel intentionally waits for an active local checkout/ref-write +│ │ phase to finish; the button can show Cancelling… during that phase. +│ │ Registry entries record last use: one-hour stale runs are cancelled +│ │ and pruned on subsequent registry activity using try_lock, so expiry +│ │ never waits for or interrupts an active local checkout. Expired +│ │ download handles remain cancelled after their registry entry goes. │ │ Network reads may wind down in the background, but no ref or -│ │ working-tree updates run after cancellation acknowledges. Late results replace the -│ │ current repo result only for the same runId; unmount cancels too. +│ │ working-tree updates run after cancellation acknowledges. The batch +│ │ runner tags the race winner and records whether work started, so a +│ │ synthetic cancellation is delivered once. Real late results replace +│ │ the repo row only for the same runId; unmount cancels too. │ │ Pull reads branch_upstream_name BEFORE fetch (a missing tracking │ │ ref can be restored), fetching the exact configured merge ref │ │ into that tracking ref, requiring its update callback (with @@ -1068,8 +1077,12 @@ features/ │ │ hooks (including core.hooksPath), submodules and external filters │ │ (including LFS and .gitattributes in the target commit). The last │ │ three require Git CLI; libgit2's checkout does not provide those -│ │ semantics. Safe checkout precedes the ref update and never invokes -│ │ merge/rebase. Results: status/message + name/oldOid/newOid/commits. +│ │ semantics. Attribute lookups cover only non-deleted paths in the +│ │ old→new tree diff; the full target tree still supplies .gitattributes +│ │ and submodule checks. Safe checkout precedes the ref update; a ref +│ │ failure explicitly reports that checkout completed and gives both +│ │ commit IDs for inspection. Never merges/rebases. Results carry +│ │ status/message + name/oldOid/newOid/commits. │ │ closeRepoGroup, deleteRepoGroup (confirm │ │ only when the group has repos; the repos stay in recents), │ │ plural(count, noun) handles -y → -ies. DRAG: rows are @@ -3584,9 +3597,9 @@ update CLAUDE.md or docs/ — never the code. | Suite | Location | Coverage | | --- | --- | --- | -| Rust integration (101) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | -| Rust module (78) | `apps/desktop/src-tauri/src/cli.rs` (7), `src/state.rs` (1), `src/editors.rs` (4), `src/fonts.rs` (1), `src/ai_cli.rs` (10), `src/error.rs` (7), `src/core/remote.rs` (18), `src/terminal.rs` (3), `src/core/accounts.rs` (7), `src/core/sign.rs` (7), `src/forge.rs` (7), `src/proc.rs` (1), `src/watcher.rs` (4) | AI-CLI runner: program allowlist (incl. Cursor's `agent` and `cursor-agent` names), stdout capture via fake agent script, {OUTPUT_FILE} substitution, kill-on-timeout, Cursor version-folder keys and the .cmd launcher → newest node.exe/index.js resolution (none for other agents or a missing versions dir) · error mapping: HTTP status extraction from libgit2 messages, 401/402/403 explanations, unmapped codes kept verbatim, io NotFound → not_found while other io errors stay io · forge proxy: api-subdomain host allowlist (dot-anchored), per-provider auth headers, bitbucket email requirement, unknown provider rejected, missing-token vs no-account message · SSH key resolution: `~` expansion, configured key ordered ahead of defaults, dedupe when the configured key IS a default, blank config ignored, generation never targeting an existing key · push refspec shapes (plain/force/tags never forced) · rejection message quotes the server lines after the ref list (sideband lines trimmed, de-duplicated, "remote:" and rule lines dropped, capped at 12) · repo account-binding parse (valid/malformed) · accounts: upsert keeps both same-host accounts + default flags, one default per host, preferred-before-default candidate order, port-loose host match, ssh URLs ignored · signing config: off by default, ssh setup read from git config, empty-string values read as unset, ssh-without-key and x509 are clear errors, openpgp falls back to the committer identity, literal-key detection, ~ expansion · proc: no bare `Command::new` anywhere outside proc.rs (G31) · recents: new paths go on top in order, an existing path moves instead of duplicating, the list caps at RECENT_LIMIT · watcher: metadata filter unchanged for main repos, `worktrees/*/HEAD|gitdir|locked` relevant while `worktrees/*/index` is noise, a linked worktree watches its own gitdir + the shared commondir, main repos need no extra roots | -| Unit (271) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | +| Rust integration (103) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | +| Rust module (79) | `apps/desktop/src-tauri/src/cli.rs` (7), `src/state.rs` (1), `src/editors.rs` (4), `src/fonts.rs` (1), `src/ai_cli.rs` (10), `src/error.rs` (7), `src/core/remote.rs` (18), `src/terminal.rs` (3), `src/core/accounts.rs` (7), `src/core/sign.rs` (7), `src/forge.rs` (7), `src/proc.rs` (1), `src/watcher.rs` (4) | AI-CLI runner: program allowlist (incl. Cursor's `agent` and `cursor-agent` names), stdout capture via fake agent script, {OUTPUT_FILE} substitution, kill-on-timeout, Cursor version-folder keys and the .cmd launcher → newest node.exe/index.js resolution (none for other agents or a missing versions dir) · error mapping: HTTP status extraction from libgit2 messages, 401/402/403 explanations, unmapped codes kept verbatim, io NotFound → not_found while other io errors stay io · forge proxy: api-subdomain host allowlist (dot-anchored), per-provider auth headers, bitbucket email requirement, unknown provider rejected, missing-token vs no-account message · SSH key resolution: `~` expansion, configured key ordered ahead of defaults, dedupe when the configured key IS a default, blank config ignored, generation never targeting an existing key · push refspec shapes (plain/force/tags never forced) · rejection message quotes the server lines after the ref list (sideband lines trimmed, de-duplicated, "remote:" and rule lines dropped, capped at 12) · repo account-binding parse (valid/malformed) · accounts: upsert keeps both same-host accounts + default flags, one default per host, preferred-before-default candidate order, port-loose host match, ssh URLs ignored · signing config: off by default, ssh setup read from git config, empty-string values read as unset, ssh-without-key and x509 are clear errors, openpgp falls back to the committer identity, literal-key detection, ~ expansion · proc: no bare `Command::new` anywhere outside proc.rs (G31) · recents: new paths go on top in order, an existing path moves instead of duplicating, the list caps at RECENT_LIMIT · watcher: metadata filter unchanged for main repos, `worktrees/*/HEAD|gitdir|locked` relevant while `worktrees/*/index` is noise, a linked worktree watches its own gitdir + the shared commondir, main repos need no extra roots | +| Unit (272) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | | E2E (116) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | ## 9.5 Open-source & community files diff --git a/apps/desktop/src-tauri/src/core/group_update.rs b/apps/desktop/src-tauri/src/core/group_update.rs index 3c96520f..633b3d78 100644 --- a/apps/desktop/src-tauri/src/core/group_update.rs +++ b/apps/desktop/src-tauri/src/core/group_update.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex, OnceLock}; +use std::time::{Duration, Instant}; use crate::error::{AppError, AppResult}; @@ -25,6 +26,7 @@ impl GroupUpdateControl { } pub fn with_active(&self, action: impl FnOnce() -> AppResult) -> AppResult { + // Cancel waits for this local write phase to finish so no writes can occur after its acknowledgement. let cancelled = self .cancelled .lock() @@ -36,44 +38,138 @@ impl GroupUpdateControl { } } -type Runs = HashMap>; +struct Run { + control: Arc, + last_used: Instant, +} + +type Runs = HashMap; static RUNS: OnceLock> = OnceLock::new(); +const RUN_TTL: Duration = Duration::from_secs(60 * 60); fn runs() -> &'static Mutex { RUNS.get_or_init(|| Mutex::new(HashMap::new())) } +fn prune_expired(runs: &mut Runs, now: Instant) { + runs.retain(|_, run| { + if now.saturating_duration_since(run.last_used) < RUN_TTL { + return true; + } + match run.control.cancelled.try_lock() { + Ok(mut cancelled) => { + *cancelled = true; + false + } + Err(std::sync::TryLockError::WouldBlock) => true, + Err(std::sync::TryLockError::Poisoned(_)) => false, + } + }); +} + pub fn start(id: &str) -> AppResult<()> { let mut runs = runs() .lock() .map_err(|_| AppError::other("Group update registry poisoned"))?; + let now = Instant::now(); + prune_expired(&mut runs, now); if runs.contains_key(id) { return Err(AppError::other("Group update already exists")); } - runs.insert(id.into(), Arc::new(GroupUpdateControl::default())); + runs.insert( + id.into(), + Run { + control: Arc::new(GroupUpdateControl::default()), + last_used: now, + }, + ); Ok(()) } pub fn control(id: &str) -> AppResult> { - runs() + let mut runs = runs() .lock() - .map_err(|_| AppError::other("Group update registry poisoned"))? - .get(id) - .cloned() - .ok_or_else(|| AppError::other("Group update is no longer active")) + .map_err(|_| AppError::other("Group update registry poisoned"))?; + let now = Instant::now(); + let control = runs.get_mut(id).map(|run| { + run.last_used = now; + run.control.clone() + }); + prune_expired(&mut runs, now); + control.ok_or_else(|| AppError::other("Group update is no longer active")) } pub fn cancel(id: &str) -> AppResult<()> { - control(id)?.cancel() + let mut runs = runs() + .lock() + .map_err(|_| AppError::other("Group update registry poisoned"))?; + let now = Instant::now(); + let control = runs.get_mut(id).map(|run| { + run.last_used = now; + run.control.clone() + }); + prune_expired(&mut runs, now); + drop(runs); + if let Some(control) = control { + control.cancel()?; + } + Ok(()) } pub fn finish(id: &str) -> AppResult<()> { - let control = runs() + let mut runs = runs() .lock() - .map_err(|_| AppError::other("Group update registry poisoned"))? - .remove(id); + .map_err(|_| AppError::other("Group update registry poisoned"))?; + let control = runs.remove(id).map(|run| run.control); + prune_expired(&mut runs, Instant::now()); + drop(runs); if let Some(control) = control { control.cancel()?; } Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn stale_runs_are_removed_and_cancel_their_in_flight_downloads() { + let now = Instant::now(); + let control = Arc::new(GroupUpdateControl::default()); + let mut runs = HashMap::from([( + "stale".into(), + Run { + control: control.clone(), + last_used: now - RUN_TTL, + }, + )]); + prune_expired(&mut runs, now); + assert!(runs.is_empty()); + assert!(control.is_cancelled()); + assert!(control + .with_active::<()>(|| panic!("expired run cannot mutate")) + .is_err()); + } + + #[test] + fn expiry_never_blocks_or_interrupts_an_active_checkout() { + let now = Instant::now(); + let control = Arc::new(GroupUpdateControl::default()); + let mut runs = HashMap::from([( + "active".into(), + Run { + control: control.clone(), + last_used: now - RUN_TTL, + }, + )]); + let guard = control.cancelled.lock().unwrap(); + prune_expired(&mut runs, now); + assert_eq!(runs.len(), 1); + assert!(!*guard); + drop(guard); + prune_expired(&mut runs, now); + assert!(runs.is_empty()); + assert!(control.is_cancelled()); + } +} diff --git a/apps/desktop/src-tauri/src/core/remote.rs b/apps/desktop/src-tauri/src/core/remote.rs index 3205cc3d..9e633bfd 100644 --- a/apps/desktop/src-tauri/src/core/remote.rs +++ b/apps/desktop/src-tauri/src/core/remote.rs @@ -505,12 +505,14 @@ fn group_update_inner( } let before = fetched_refs(&repo)?; let mut failures = Vec::new(); + let mut succeeded = 0; for name in &names { if control.is_cancelled() { break; } - if let Err(error) = group_fetch(path, name, control, None) { - failures.push(format!("{name}: {error}")); + match group_fetch(path, name, control, None) { + Ok(()) => succeeded += 1, + Err(error) => failures.push(format!("{name}: {error}")), } } let after = fetched_refs(&repo)?; @@ -537,13 +539,20 @@ fn group_update_inner( }) .collect(); return Ok(GroupUpdateResult { - status: if failures.is_empty() { "ok" } else { "failed" }.into(), + status: if failures.is_empty() { + "ok" + } else if succeeded > 0 { + "partial" + } else { + "failed" + } + .into(), message: if failures.is_empty() { format!("Fetched {} remote(s)", names.len()) } else { format!( "Fetched {} of {} remotes. Failed: {}", - names.len() - failures.len(), + succeeded, names.len(), failures.join("; ") ) @@ -660,15 +669,25 @@ fn group_update_inner( "Working tree changed during fetch; try again".into(), )); } - if let Some(reason) = unsupported_group_checkout(&repo, &target.tree()?)? { + let old_tree = repo.find_commit(old)?.tree()?; + if let Some(reason) = unsupported_group_checkout(&repo, &old_tree, &target.tree()?)? { return Ok(result("skipped", reason)); } let checkout = control.with_active(|| { let mut checkout = CheckoutBuilder::new(); checkout.safe(); repo.checkout_tree(target.as_object(), Some(&mut checkout))?; - repo.find_reference(&refname)? - .set_target(new, &format!("pull: fast-forward to {upstream_ref}"))?; + repo.find_reference(&refname) + .and_then(|mut reference| { + reference.set_target(new, &format!("pull: fast-forward to {upstream_ref}")) + }) + .map_err(|error| { + AppError::other(format!( + "Checkout completed, but branch update failed for {branch_name}: {error}. \ + The working tree is at {new}; the branch may still point at {old}. \ + Inspect HEAD and working-tree changes before retrying." + )) + })?; Ok(()) }); if let Err(error) = checkout { @@ -748,7 +767,11 @@ fn group_fetch( }) } -fn unsupported_group_checkout(repo: &Repository, tree: &git2::Tree) -> AppResult> { +fn unsupported_group_checkout( + repo: &Repository, + old_tree: &git2::Tree, + tree: &git2::Tree, +) -> AppResult> { let config = repo.config()?; let hooks = config .get_path("core.hooksPath") @@ -775,16 +798,13 @@ fn unsupported_group_checkout(repo: &Repository, tree: &git2::Tree) -> AppResult } let mut reason = None; let mut error = None; - let walked = tree.walk(git2::TreeWalkMode::PreOrder, |root, entry| { - let path = format!("{root}{}", entry.name().unwrap_or("")); + let walked = tree.walk(git2::TreeWalkMode::PreOrder, |_, entry| { if entry.filemode() == 0o160000 || entry.name() == Some(".gitmodules") { reason = Some("Repository uses submodules; pull with Git CLI to update them".into()); return git2::TreeWalkResult::Abort; } if entry.kind() != Some(git2::ObjectType::Blob) { return git2::TreeWalkResult::Ok; } let check = || -> AppResult { - let attr = repo.get_attr_bytes(Path::new(&path), "filter", git2::AttrCheckFlags::FILE_THEN_INDEX)?; - if matches!(git2::AttrValue::from_bytes(attr), git2::AttrValue::String(_) | git2::AttrValue::Bytes(_)) { return Ok(true); } if entry.name() == Some(".gitattributes") { let blob = repo.find_blob(entry.id())?; let text = String::from_utf8_lossy(blob.content()); @@ -807,7 +827,26 @@ fn unsupported_group_checkout(repo: &Repository, tree: &git2::Tree) -> AppResult if reason.is_none() { walked?; } - Ok(reason) + if reason.is_some() { + return Ok(reason); + } + let diff = repo.diff_tree_to_tree(Some(old_tree), Some(tree), None)?; + for delta in diff.deltas() { + if delta.status() == git2::Delta::Deleted { + continue; + } + if let Some(path) = delta.new_file().path() { + let attr = + repo.get_attr_bytes(path, "filter", git2::AttrCheckFlags::FILE_THEN_INDEX)?; + if matches!( + git2::AttrValue::from_bytes(attr), + git2::AttrValue::String(_) | git2::AttrValue::Bytes(_) + ) { + return Ok(Some("Repository uses external filters (such as Git LFS); pull with Git CLI so files are processed".into())); + } + } + } + Ok(None) } fn executable_hook(path: &Path) -> bool { diff --git a/apps/desktop/src-tauri/tests/git_engine.rs b/apps/desktop/src-tauri/tests/git_engine.rs index f93014fa..d108aad0 100644 --- a/apps/desktop/src-tauri/tests/git_engine.rs +++ b/apps/desktop/src-tauri/tests/git_engine.rs @@ -3158,7 +3158,7 @@ fn group_fetch_reports_moved_refs_and_continues_after_remote_failure() { let new = commit_all(&local, "new"); core::push(local.path(), "origin", None, false, false, true).unwrap(); let result = core::group_update(other.path(), false).unwrap(); - assert_eq!(result.status, "failed"); + assert_eq!(result.status, "partial"); assert!(result.message.contains("broken")); let moved = result .changes @@ -3178,10 +3178,9 @@ fn group_fetch_reports_moved_refs_and_continues_after_remote_failure() { .to_string(), old ); - assert!(core::group_update(other.path(), false) - .unwrap() - .changes - .is_empty()); + let unchanged_partial = core::group_update(other.path(), false).unwrap(); + assert_eq!(unchanged_partial.status, "partial"); + assert!(unchanged_partial.changes.is_empty()); let empty = TempRepo::new(); assert_eq!( core::group_update(empty.path(), false).unwrap().status, @@ -3404,3 +3403,63 @@ fn group_run_registry_keeps_cancellation_on_in_flight_handles_after_finish() { .is_err()); core::group_update_finish(id).unwrap(); } + +#[test] +fn group_pull_checks_filters_only_on_changed_paths() { + let local = TempRepo::new(); + for i in 0..1000 { + local.write(&format!("unchanged-{i}.txt"), "unchanged\n"); + } + local.write("README.md", "base\n"); + commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "changed-attrs"); + let repo = git2::Repository::open(other.path()).unwrap(); + std::fs::write( + repo.path().join("info/attributes"), + "*.txt filter=external\n", + ) + .unwrap(); + local.write("README.md", "updated\n"); + let updated = commit_all(&local, "update readme"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + assert_eq!(core::group_update(other.path(), true).unwrap().status, "ok"); + assert_eq!(other.read("README.md"), "updated\n"); + local.write("unchanged-1.txt", "requires filter\n"); + commit_all(&local, "update filtered file"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let result = core::group_update(other.path(), true).unwrap(); + assert_eq!(result.status, "skipped"); + assert!(result.message.contains("external filters")); + assert_eq!(other.read("unchanged-1.txt"), "unchanged\n"); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), updated); + std::fs::remove_dir_all(origin).unwrap(); +} + +#[test] +fn group_pull_explains_when_checkout_succeeds_but_branch_update_fails() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "locked-ref"); + let repo = git2::Repository::open(other.path()).unwrap(); + std::fs::write(repo.path().join("refs/heads/master.lock"), "locked").unwrap(); + local.write("a.txt", "updated\n"); + let new = commit_all(&local, "updated"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let error = core::group_update(other.path(), true) + .unwrap_err() + .to_string(); + assert!( + error.contains("Checkout completed, but branch update failed"), + "{error}" + ); + assert!(error.contains(&old)); + assert!(error.contains(&new)); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), old); + assert_eq!(other.read("a.txt"), "updated\n"); + std::fs::remove_dir_all(origin).unwrap(); +} diff --git a/apps/desktop/src/features/repository/groupUpdate.ts b/apps/desktop/src/features/repository/groupUpdate.ts index 06b33027..1d9c9819 100644 --- a/apps/desktop/src/features/repository/groupUpdate.ts +++ b/apps/desktop/src/features/repository/groupUpdate.ts @@ -8,7 +8,8 @@ export type GroupResultKind = 'updated' | 'unchanged' | 'skipped' | 'failed' | ' export function classify(result: GroupUpdateResult): GroupResultKind { if (result.status === 'cancelled') return 'cancelled'; - if (result.status === 'failed') return result.changes.length > 0 ? 'partial' : 'failed'; + if (result.status === 'partial') return 'partial'; + if (result.status === 'failed') return 'failed'; if (result.status === 'skipped') return 'skipped'; return result.changes.length > 0 ? 'updated' : 'unchanged'; } @@ -25,7 +26,12 @@ export async function updateGroupRepositories( onResult({ ...cancelled, repo }); continue; } - const pending = Promise.resolve().then(() => signal?.aborted ? cancelled : update(repo.path)).catch((error): GroupUpdateResult => ({ + let updateStarted = false; + const pending = Promise.resolve().then(() => { + if (signal?.aborted) return cancelled; + updateStarted = true; + return update(repo.path); + }).catch((error): GroupUpdateResult => ({ status: 'failed', message: (error as { message?: string })?.message ?? String(error), changes: [], })); let onAbort: (() => void) | undefined; @@ -34,10 +40,13 @@ export async function updateGroupRepositories( signal?.addEventListener('abort', onAbort, { once: true }); if (signal?.aborted) onAbort(); }); - const result = await Promise.race([pending, aborted]); + const winner = await Promise.race([ + pending.then((result) => ({ source: 'pending' as const, result })), + aborted.then((result) => ({ source: 'abort' as const, result })), + ]); if (onAbort) signal?.removeEventListener('abort', onAbort); - onResult({ ...result, repo }); - if (result === cancelled) { + onResult({ ...winner.result, repo }); + if (winner.source === 'abort' && updateStarted) { void pending.then((settled) => onResult({ ...settled, repo })); } } diff --git a/packages/core/src/git/types.ts b/packages/core/src/git/types.ts index 7f97106a..310329da 100644 --- a/packages/core/src/git/types.ts +++ b/packages/core/src/git/types.ts @@ -246,7 +246,7 @@ export interface FileBlame { } export interface GroupUpdateResult { - status: 'ok' | 'up_to_date' | 'skipped' | 'failed' | 'cancelled'; + status: 'ok' | 'up_to_date' | 'skipped' | 'failed' | 'partial' | 'cancelled'; message: string; changes: RefMovement[]; } diff --git a/tests/e2e/smoke.spec.ts b/tests/e2e/smoke.spec.ts index a032743f..ebb31da8 100644 --- a/tests/e2e/smoke.spec.ts +++ b/tests/e2e/smoke.spec.ts @@ -3117,7 +3117,7 @@ test('group fetch classifies partial failures once and cancellation releases a h ipc.groupUpdate = async (path) => { tracker.__groupCalls.push(path); if (path.endsWith('/partial')) return { - status: 'failed', message: 'origin fetched; backup authentication failed', + status: 'partial', message: 'origin fetched; backup authentication failed', changes: [{ name: 'origin/main', oldOid: '1234567890', newOid: 'abcdef0123', commits: 2 }], }; return new Promise((resolve) => { tracker.__finishGroup = () => resolve({ status: 'cancelled', message: 'Cancelled', changes: [] }); }); diff --git a/tests/unit/groupUpdate.test.ts b/tests/unit/groupUpdate.test.ts index fea754be..ab46052d 100644 --- a/tests/unit/groupUpdate.test.ts +++ b/tests/unit/groupUpdate.test.ts @@ -18,7 +18,8 @@ it('runs in order, preserves partial results, and continues after a repository f it('gives partial success one outcome shared by counters and badges', () => { const changes = [{ name: 'origin/main', oldOid: 'one', newOid: 'two', commits: 1 }]; - expect(classify({ status: 'failed', message: 'origin fetched, backup failed', changes })).toBe('partial'); + expect(classify({ status: 'partial', message: 'origin fetched, backup failed', changes })).toBe('partial'); + expect(classify({ status: 'partial', message: 'origin unchanged, backup failed', changes: [] })).toBe('partial'); expect(classify({ status: 'failed', message: 'offline', changes: [] })).toBe('failed'); expect(classify({ status: 'ok', message: 'fetched', changes })).toBe('updated'); expect(classify({ status: 'ok', message: 'fetched', changes: [] })).toBe('unchanged'); @@ -54,3 +55,16 @@ it('does not start any operation when already cancelled', async () => { expect(update).not.toHaveBeenCalled(); expect(results[0].status).toBe('cancelled'); }); + +it('delivers one cancellation when aborted before the pending microtask starts', async () => { + const controller = new AbortController(); + const update = vi.fn(); + const onResult = vi.fn(); + const run = updateGroupRepositories([{ name: 'repo', path: '/repo', lastOpenedAt: 0 }], update, onResult, controller.signal); + controller.abort(); + await run; + await Promise.resolve(); + expect(update).not.toHaveBeenCalled(); + expect(onResult).toHaveBeenCalledTimes(1); + expect(onResult.mock.calls[0][0].status).toBe('cancelled'); +}); From ed25eb8a3332a0d867c4d92c025508e47717f145 Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Tue, 13 Oct 2026 17:50:25 +0200 Subject: [PATCH 05/10] fix: align group pull and summary with toolbar behavior --- CHANGELOG.md | 12 +- CLAUDE.md | 26 ++-- .../src-tauri/src/core/group_update.rs | 1 - apps/desktop/src-tauri/src/core/remote.rs | 118 -------------- apps/desktop/src-tauri/tests/git_engine.rs | 146 ++++++++++-------- .../features/repository/GroupUpdateDialog.tsx | 20 ++- .../src/features/repository/WelcomePage.tsx | 4 +- docs/assets/group-update-cancel-summary.png | Bin 108766 -> 112678 bytes docs/assets/group-update-summary-light.png | Bin 0 -> 76741 bytes docs/assets/group-update-summary.png | Bin 108801 -> 118448 bytes tests/e2e/smoke.spec.ts | 13 ++ 11 files changed, 126 insertions(+), 214 deletions(-) create mode 100644 docs/assets/group-update-summary-light.png diff --git a/CHANGELOG.md b/CHANGELOG.md index b62bc58e..71703e08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,17 +10,17 @@ All notable changes to AngKorGit are documented here. The format follows - Right-click a group header on the start page to **Fetch all** or **Pull all (fast-forward only)**. A live summary lists moved refs and commit ranges, unchanged repositories, skipped repositories with reasons, and failures. Pull follows each - checked-out branch's configured upstream and skips local changes, detached HEADs, - unfinished operations, and diverged history. Cancel stops the remaining batch, + checked-out branch's configured upstream and skips detached HEADs, unfinished + operations, diverged history, and local changes that conflict with safe checkout. + Unrelated untracked files and staged or unstaged edits are preserved. Cancel stops the remaining batch, prevents later ref/worktree updates, and releases the app even if a network read is stalled; completed updates are kept. Partial fetches have a single outcome in the summary, including when a remote succeeds without moving refs. Missing upstream - refs are reported separately from unconfigured upstreams. Attribute checks inspect - changed file paths while retaining incoming attribute-rule checks. Ref-update errors + refs are reported separately from unconfigured upstreams. Ref-update errors after checkout explicitly explain the working-tree/branch mismatch; abandoned run entries expire on later registry activity. - Repositories requiring hooks, submodule updates, or external filters such as Git LFS - are skipped with guidance to use Git CLI. (#69) + Group pull uses the same checkout behavior as toolbar Pull. The summary has flat + rows, toned badges, and a single-line counts strip. (#69) ## [0.23.0] — 2026-10-13 diff --git a/CLAUDE.md b/CLAUDE.md index 9cbfb531..ec9af18f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1072,17 +1072,21 @@ features/ │ │ ref can be restored), fetching the exact configured merge ref │ │ into that tracking ref, requiring its update callback (with │ │ REPORT_UNCHANGED) so stale refs never hide a deleted upstream. -│ │ It skips dirty/untracked trees, detached/unborn HEAD, bare repos, -│ │ unfinished operations, divergence, active post-merge/post-checkout -│ │ hooks (including core.hooksPath), submodules and external filters -│ │ (including LFS and .gitattributes in the target commit). The last -│ │ three require Git CLI; libgit2's checkout does not provide those -│ │ semantics. Attribute lookups cover only non-deleted paths in the -│ │ old→new tree diff; the full target tree still supplies .gitattributes -│ │ and submodule checks. Safe checkout precedes the ref update; a ref -│ │ failure explicitly reports that checkout completed and gives both -│ │ commit IDs for inspection. Never merges/rebases. Results carry -│ │ status/message + name/oldOid/newOid/commits. +│ │ It skips detached/unborn HEAD, bare repos, unfinished operations +│ │ and divergence. Safe checkout alone decides whether local changes +│ │ conflict; unrelated untracked, staged and unstaged changes survive. +│ │ Hooks, submodules and external filters have exactly the toolbar +│ │ Pull behavior: libgit2 checkout, no extra compatibility skips or +│ │ hook/submodule/filter processing. Owner request before merging #70. +│ │ Safe checkout precedes the ref update; a ref failure explicitly +│ │ reports that checkout completed and gives both commit IDs for +│ │ inspection. Never merges/rebases. Results carry status/message + +│ │ name/oldOid/newOid/commits. GroupUpdateDialog uses flat borderless +│ │ rows, token-toned badges (success for Updated, danger for Failed, +│ │ primary for Partial), and one non-wrapping scrollable counts line. +│ │ Pull uses ArrowDownToLine, matching the toolbar. The mutex holds +│ │ through a local write phase; cancellation waits for it to finish +│ │ before acknowledging. Keep this rationale here, not in source. │ │ closeRepoGroup, deleteRepoGroup (confirm │ │ only when the group has repos; the repos stay in recents), │ │ plural(count, noun) handles -y → -ies. DRAG: rows are diff --git a/apps/desktop/src-tauri/src/core/group_update.rs b/apps/desktop/src-tauri/src/core/group_update.rs index 633b3d78..af7f79c3 100644 --- a/apps/desktop/src-tauri/src/core/group_update.rs +++ b/apps/desktop/src-tauri/src/core/group_update.rs @@ -26,7 +26,6 @@ impl GroupUpdateControl { } pub fn with_active(&self, action: impl FnOnce() -> AppResult) -> AppResult { - // Cancel waits for this local write phase to finish so no writes can occur after its acknowledgement. let cancelled = self .cancelled .lock() diff --git a/apps/desktop/src-tauri/src/core/remote.rs b/apps/desktop/src-tauri/src/core/remote.rs index 9e633bfd..de33e7cc 100644 --- a/apps/desktop/src-tauri/src/core/remote.rs +++ b/apps/desktop/src-tauri/src/core/remote.rs @@ -604,14 +604,6 @@ fn group_update_inner( let remote = remote .as_str() .ok_or_else(|| AppError::other("Invalid upstream remote"))?; - let mut options = git2::StatusOptions::new(); - options.include_untracked(true).recurse_untracked_dirs(true); - if !repo.statuses(Some(&mut options))?.is_empty() { - return Ok(result( - "skipped", - "Working tree has local changes (including untracked files)".into(), - )); - } let old = head.peel_to_commit()?.id(); if remote != "." { let merge_ref = repo @@ -663,16 +655,6 @@ fn group_update_inner( "Repository changed during fetch; try again".into(), )); } - if !repo.statuses(Some(&mut options))?.is_empty() { - return Ok(result( - "skipped", - "Working tree changed during fetch; try again".into(), - )); - } - let old_tree = repo.find_commit(old)?.tree()?; - if let Some(reason) = unsupported_group_checkout(&repo, &old_tree, &target.tree()?)? { - return Ok(result("skipped", reason)); - } let checkout = control.with_active(|| { let mut checkout = CheckoutBuilder::new(); checkout.safe(); @@ -767,106 +749,6 @@ fn group_fetch( }) } -fn unsupported_group_checkout( - repo: &Repository, - old_tree: &git2::Tree, - tree: &git2::Tree, -) -> AppResult> { - let config = repo.config()?; - let hooks = config - .get_path("core.hooksPath") - .ok() - .map(|path| { - if path.is_absolute() { - path - } else { - repo.workdir().unwrap_or(repo.path()).join(path) - } - }) - .unwrap_or_else(|| repo.commondir().join("hooks")); - for hook in ["post-merge", "post-checkout"] { - if executable_hook(&hooks.join(hook)) { - return Ok(Some(format!( - "Repository uses {hook}; pull with Git CLI so hooks run" - ))); - } - } - if !repo.submodules()?.is_empty() { - return Ok(Some( - "Repository uses submodules; pull with Git CLI to update them".into(), - )); - } - let mut reason = None; - let mut error = None; - let walked = tree.walk(git2::TreeWalkMode::PreOrder, |_, entry| { - if entry.filemode() == 0o160000 || entry.name() == Some(".gitmodules") { - reason = Some("Repository uses submodules; pull with Git CLI to update them".into()); - return git2::TreeWalkResult::Abort; - } - if entry.kind() != Some(git2::ObjectType::Blob) { return git2::TreeWalkResult::Ok; } - let check = || -> AppResult { - if entry.name() == Some(".gitattributes") { - let blob = repo.find_blob(entry.id())?; - let text = String::from_utf8_lossy(blob.content()); - return Ok(text.lines().filter(|line| !line.trim_start().starts_with('#')).any(|line| line.split_whitespace().skip(1).any(|attr| attr.starts_with("filter=")))); - } - Ok(false) - }; - match check() { - Ok(true) => { - reason = Some("Repository uses external filters (such as Git LFS); pull with Git CLI so files are processed".into()); - git2::TreeWalkResult::Abort - } - Ok(false) => git2::TreeWalkResult::Ok, - Err(err) => { error = Some(err); git2::TreeWalkResult::Abort } - } - }); - if let Some(error) = error { - return Err(error); - } - if reason.is_none() { - walked?; - } - if reason.is_some() { - return Ok(reason); - } - let diff = repo.diff_tree_to_tree(Some(old_tree), Some(tree), None)?; - for delta in diff.deltas() { - if delta.status() == git2::Delta::Deleted { - continue; - } - if let Some(path) = delta.new_file().path() { - let attr = - repo.get_attr_bytes(path, "filter", git2::AttrCheckFlags::FILE_THEN_INDEX)?; - if matches!( - git2::AttrValue::from_bytes(attr), - git2::AttrValue::String(_) | git2::AttrValue::Bytes(_) - ) { - return Ok(Some("Repository uses external filters (such as Git LFS); pull with Git CLI so files are processed".into())); - } - } - } - Ok(None) -} - -fn executable_hook(path: &Path) -> bool { - let Ok(metadata) = path.metadata() else { - return false; - }; - if !metadata.is_file() { - return false; - } - #[cfg(unix)] - { - use std::os::unix::fs::PermissionsExt; - metadata.permissions().mode() & 0o111 != 0 - } - #[cfg(not(unix))] - { - true - } -} - fn fetched_refs(repo: &Repository) -> AppResult> { let mut refs = HashMap::new(); for reference in repo.references()? { diff --git a/apps/desktop/src-tauri/tests/git_engine.rs b/apps/desktop/src-tauri/tests/git_engine.rs index d108aad0..512a3271 100644 --- a/apps/desktop/src-tauri/tests/git_engine.rs +++ b/apps/desktop/src-tauri/tests/git_engine.rs @@ -3074,7 +3074,7 @@ fn group_pull_fast_forwards_configured_upstream_without_merging() { } #[test] -fn group_pull_skips_dirty_detached_missing_upstream_and_unfinished_repos() { +fn group_pull_skips_conflicting_changes_detached_missing_upstream_and_unfinished_repos() { let local = TempRepo::new(); local.write("a.txt", "base\n"); let old = commit_all(&local, "base"); @@ -3091,7 +3091,7 @@ fn group_pull_skips_dirty_detached_missing_upstream_and_unfinished_repos() { } let result = core::group_update(other.path(), true).unwrap(); assert_eq!(result.status, "skipped"); - assert!(result.message.contains("local changes")); + assert!(result.message.contains("Local changes prevent checkout")); assert_eq!(other.read("a.txt"), "dirty\n"); } let repo = git2::Repository::open(other.path()).unwrap(); @@ -3103,12 +3103,16 @@ fn group_pull_skips_dirty_detached_missing_upstream_and_unfinished_repos() { None, ) .unwrap(); - other.write("new.txt", "keep\n"); - assert_eq!( - core::group_update(other.path(), true).unwrap().status, - "skipped" - ); - std::fs::remove_file(other.dir.join("new.txt")).unwrap(); + local.write("incoming.txt", "remote file\n"); + commit_all(&local, "add incoming file"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + other.write("incoming.txt", "untracked file\n"); + let result = core::group_update(other.path(), true).unwrap(); + assert_eq!(result.status, "skipped"); + assert!(result.message.contains("Local changes prevent checkout")); + assert_eq!(other.read("incoming.txt"), "untracked file\n"); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), old); + std::fs::remove_file(other.dir.join("incoming.txt")).unwrap(); std::fs::write(repo.path().join("MERGE_HEAD"), &old).unwrap(); assert!(core::group_update(other.path(), true) .unwrap() @@ -3236,36 +3240,32 @@ fn group_pull_restores_missing_tracking_refs_and_reports_deleted_upstreams() { } #[test] -fn group_pull_skips_submodules_and_external_filters_before_checkout() { - for (file, content, reason) in [ +fn group_pull_matches_toolbar_pull_with_submodule_metadata_and_lfs_attributes() { + for (file, content) in [ ( ".gitmodules", "[submodule \"sub\"]\npath = sub\nurl = ../sub.git\n", - "submodules", - ), - ( - ".gitattributes", - "*.txt filter=lfs diff=lfs -text\n", - "external filters", ), + (".gitattributes", "*.txt filter=lfs diff=lfs -text\n"), ] { let local = TempRepo::new(); local.write("a.txt", "base\n"); - let old = commit_all(&local, "base"); + commit_all(&local, "base"); let origin = bare_origin(&local); core::push(local.path(), "origin", None, false, false, true).unwrap(); - let other = clone_of(&origin, &local, "unsupported"); + let other = clone_of(&origin, &local, "group-compatible"); + let toolbar = clone_of(&origin, &local, "toolbar-compatible"); local.write(file, content); local.write( "a.txt", "version https://git-lfs.github.com/spec/v1\noid sha256:123\nsize 1\n", ); - commit_all(&local, "special checkout"); + let new = commit_all(&local, "special checkout"); core::push(local.path(), "origin", None, false, false, true).unwrap(); - let result = core::group_update(other.path(), true).unwrap(); - assert_eq!(result.status, "skipped", "{}", result.message); - assert!(result.message.contains(reason), "{}", result.message); - assert_eq!(other.read("a.txt"), "base\n"); + assert_eq!(core::group_update(other.path(), true).unwrap().status, "ok"); + core::pull(toolbar.path(), "origin", Some("merge")).unwrap(); + assert_eq!(other.read("a.txt"), toolbar.read("a.txt")); + assert_eq!(other.read(file), toolbar.read(file)); assert_eq!( git2::Repository::open(other.path()) .unwrap() @@ -3274,48 +3274,45 @@ fn group_pull_skips_submodules_and_external_filters_before_checkout() { .target() .unwrap() .to_string(), - old + new ); std::fs::remove_dir_all(origin).unwrap(); } } #[test] -fn group_pull_skips_active_hooks_in_the_configured_directory() { +fn group_pull_matches_toolbar_pull_with_active_hooks() { let local = TempRepo::new(); local.write("a.txt", "base\n"); - let old = commit_all(&local, "base"); + commit_all(&local, "base"); let origin = bare_origin(&local); core::push(local.path(), "origin", None, false, false, true).unwrap(); - let other = clone_of(&origin, &local, "hooks"); + let other = clone_of(&origin, &local, "group-hooks"); + let toolbar = clone_of(&origin, &local, "toolbar-hooks"); let repo = git2::Repository::open(other.path()).unwrap(); let hooks = repo.path().join("custom-hooks"); std::fs::create_dir_all(&hooks).unwrap(); - core::set_config( - Some(other.path()), - "core.hooksPath", - hooks.to_str().unwrap(), - false, - ) - .unwrap(); - local.write("a.txt", "updated\n"); - commit_all(&local, "updated"); - core::push(local.path(), "origin", None, false, false, true).unwrap(); + for path in [other.path(), toolbar.path()] { + core::set_config(Some(path), "core.hooksPath", hooks.to_str().unwrap(), false).unwrap(); + } for name in ["post-checkout", "post-merge"] { let hook = hooks.join(name); - std::fs::write(&hook, "#!/bin/sh\nexit 0\n").unwrap(); + std::fs::write(&hook, "#!/bin/sh\nprintf invoked > hook-ran\n").unwrap(); #[cfg(unix)] { use std::os::unix::fs::PermissionsExt; std::fs::set_permissions(&hook, std::fs::Permissions::from_mode(0o755)).unwrap(); } - let result = core::group_update(other.path(), true).unwrap(); - assert_eq!(result.status, "skipped"); - assert!(result.message.contains(name)); - assert_eq!(repo.head().unwrap().target().unwrap().to_string(), old); - std::fs::remove_file(hook).unwrap(); } + local.write("a.txt", "updated\n"); + let new = commit_all(&local, "updated"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); assert_eq!(core::group_update(other.path(), true).unwrap().status, "ok"); + core::pull(toolbar.path(), "origin", Some("merge")).unwrap(); + assert_eq!(other.read("a.txt"), toolbar.read("a.txt")); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), new); + assert!(!other.dir.join("hook-ran").exists()); + assert!(!toolbar.dir.join("hook-ran").exists()); std::fs::remove_dir_all(origin).unwrap(); } @@ -3405,35 +3402,48 @@ fn group_run_registry_keeps_cancellation_on_in_flight_handles_after_finish() { } #[test] -fn group_pull_checks_filters_only_on_changed_paths() { +fn group_pull_preserves_unrelated_untracked_unstaged_and_staged_changes() { let local = TempRepo::new(); - for i in 0..1000 { - local.write(&format!("unchanged-{i}.txt"), "unchanged\n"); - } - local.write("README.md", "base\n"); + local.write("a.txt", "base\n"); + local.write("notes.txt", "notes\n"); commit_all(&local, "base"); let origin = bare_origin(&local); core::push(local.path(), "origin", None, false, false, true).unwrap(); - let other = clone_of(&origin, &local, "changed-attrs"); - let repo = git2::Repository::open(other.path()).unwrap(); - std::fs::write( - repo.path().join("info/attributes"), - "*.txt filter=external\n", - ) - .unwrap(); - local.write("README.md", "updated\n"); - let updated = commit_all(&local, "update readme"); - core::push(local.path(), "origin", None, false, false, true).unwrap(); - assert_eq!(core::group_update(other.path(), true).unwrap().status, "ok"); - assert_eq!(other.read("README.md"), "updated\n"); - local.write("unchanged-1.txt", "requires filter\n"); - commit_all(&local, "update filtered file"); - core::push(local.path(), "origin", None, false, false, true).unwrap(); - let result = core::group_update(other.path(), true).unwrap(); - assert_eq!(result.status, "skipped"); - assert!(result.message.contains("external filters")); - assert_eq!(other.read("unchanged-1.txt"), "unchanged\n"); - assert_eq!(repo.head().unwrap().target().unwrap().to_string(), updated); + for mode in ["untracked", "unstaged", "staged"] { + let other = clone_of(&origin, &local, mode); + other.write("scratch.txt", "untracked notes\n"); + if mode != "untracked" { + other.write("notes.txt", "local notes\n"); + } + if mode == "staged" { + core::stage_file(other.path(), "notes.txt").unwrap(); + } + local.write("a.txt", mode); + let new = commit_all(&local, mode); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + assert_eq!(core::group_update(other.path(), true).unwrap().status, "ok"); + assert_eq!(other.read("scratch.txt"), "untracked notes\n"); + assert_eq!( + other.read("notes.txt"), + if mode == "untracked" { + "notes\n" + } else { + "local notes\n" + } + ); + assert_eq!(other.read("a.txt"), mode); + let repo = git2::Repository::open(other.path()).unwrap(); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), new); + let status = repo.status_file(std::path::Path::new("notes.txt")).unwrap(); + assert_eq!( + status.contains(git2::Status::INDEX_MODIFIED), + mode == "staged" + ); + assert_eq!( + status.contains(git2::Status::WT_MODIFIED), + mode == "unstaged" + ); + } std::fs::remove_dir_all(origin).unwrap(); } diff --git a/apps/desktop/src/features/repository/GroupUpdateDialog.tsx b/apps/desktop/src/features/repository/GroupUpdateDialog.tsx index 0e65c175..52af49b2 100644 --- a/apps/desktop/src/features/repository/GroupUpdateDialog.tsx +++ b/apps/desktop/src/features/repository/GroupUpdateDialog.tsx @@ -35,29 +35,33 @@ export function GroupUpdateDialog({ progress, onClose, onCancel }: { updated: 'Updated', unchanged: pull ? 'Up to date' : 'Fetched', skipped: 'Skipped', failed: 'Failed', partial: 'Partial', cancelled: 'Cancelled', }; + const tones: Record = { + updated: 'success', unchanged: 'neutral', skipped: 'neutral', + failed: 'danger', partial: 'primary', cancelled: 'neutral', + }; return ( { if (!open && !running) onClose(); }}> { if (running) e.preventDefault(); }} onInteractOutside={(e) => e.preventDefault()} > {pull ? 'Pull all (fast-forward only)' : 'Fetch all'} — {name} - {pull ? 'Pulls the checked-out branch from its upstream. Repositories with local changes are skipped.' : 'Fetches every configured remote in the group.'} + {pull ? 'Fast-forwards the checked-out branch from its upstream, preserving unrelated local changes.' : 'Fetches every configured remote in the group.'} -
- {running && } - {cancelling ? 'Cancelling…' : running ? `${results.length} of ${total} repositories complete` : `${total} repositories complete`} · {counts.updated} updated · {counts.unchanged} {pull ? 'up to date' : 'unchanged'} · {counts.skipped} skipped · {counts.failed} failed{counts.partial > 0 && ` · ${counts.partial} partial`}{counts.cancelled > 0 && ` · ${counts.cancelled} cancelled`} +
+ {running && } + {cancelling ? 'Cancelling…' : running ? `${results.length} of ${total} repositories complete` : `${total} repositories complete`} · {counts.updated} updated · {counts.unchanged} {pull ? 'up to date' : 'unchanged'} · {counts.skipped} skipped · {counts.failed} failed{counts.partial > 0 && ` · ${counts.partial} partial`}{counts.cancelled > 0 && ` · ${counts.cancelled} cancelled`}
-
+
{results.map((result) => ( -
+
{result.repo.name} - {labels[classify(result)]} + {labels[classify(result)]}

{shortenHome(result.repo.path)}

{result.message}

diff --git a/apps/desktop/src/features/repository/WelcomePage.tsx b/apps/desktop/src/features/repository/WelcomePage.tsx index 6f7d451e..d121b116 100644 --- a/apps/desktop/src/features/repository/WelcomePage.tsx +++ b/apps/desktop/src/features/repository/WelcomePage.tsx @@ -22,7 +22,7 @@ import { FolderSearch, FolderTree, GitBranchPlus, - GitPullRequestArrow, + ArrowDownToLine, MoreHorizontal, Pencil, Search, @@ -688,7 +688,7 @@ export function WelcomePage() { disabled={groupMenu.repos.length === 0 || !!busy || !!opening} onClick={() => void updateGroup(groupMenu.group, groupMenu.repos, true)} > - Pull all (fast-forward only) + Pull all (fast-forward only) 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

VN(KH&kzeo?v$o%ebVhshmB20 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 literal 108766 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

#sk47p>C*m2guRFgehfj==sf+VKA>RXpY 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 E0NDd;-T(jq diff --git a/docs/assets/group-update-summary-light.png b/docs/assets/group-update-summary-light.png new file mode 100644 index 0000000000000000000000000000000000000000..1584f2469daec3e4a92e9c3f010396a78368dbf0 GIT binary patch literal 76741 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
NJcs5_QuJR-SAeq#3uVulaE?8EM^h&LVb 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ⅇjA_2djjTx{LICw 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 RRJwsN(lgO5Iqw+ue*g>>sAvEH literal 108801 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�@{x5vs79*%$DU0aE|ZN_j72 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 Q{4p?iy85}Sb4q9e03mnjSO5S3 diff --git a/tests/e2e/smoke.spec.ts b/tests/e2e/smoke.spec.ts index ebb31da8..12b765da 100644 --- a/tests/e2e/smoke.spec.ts +++ b/tests/e2e/smoke.spec.ts @@ -2786,6 +2786,7 @@ test('repositories can be grouped on the welcome page and a group opens as tabs' await expect(dialog).toContainText('0 skipped · 0 failed'); await dialog.getByRole('button', { name: 'Done', exact: true }).click(); await frontend.click({ button: 'right' }); + await expect(page.getByRole('menuitem', { name: 'Pull all (fast-forward only)', exact: true }).locator('svg')).toHaveClass(/lucide-arrow-down-to-line/); await page.getByRole('menuitem', { name: 'Pull all (fast-forward only)', exact: true }).click(); await expect(dialog.getByRole('heading', { name: 'Pull all (fast-forward only) — Frontend' })).toBeVisible(); await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeEnabled(); @@ -3085,6 +3086,7 @@ test('group pull summary shows moved refs, skips, failures and unchanged reposit }; }); await page.locator('[data-group-header]', { hasText: 'Projects' }).click({ button: 'right' }); + await expect(page.getByRole('menuitem', { name: 'Pull all (fast-forward only)', exact: true }).locator('svg')).toHaveClass(/lucide-arrow-down-to-line/); await page.getByRole('menuitem', { name: 'Pull all (fast-forward only)', exact: true }).click(); const dialog = page.getByRole('dialog'); await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeDisabled(); @@ -3096,7 +3098,18 @@ test('group pull summary shows moved refs, skips, failures and unchanged reposit await expect(dialog).toContainText('main has diverged'); await expect(dialog).toContainText('Authentication failed'); await expect(dialog).toContainText('main is already up to date'); + await expect(dialog.getByText('Updated', { exact: true })).toHaveClass(/text-success/); + await expect(dialog.getByText('Failed', { exact: true })).toHaveClass(/text-danger/); + await expect(dialog).toContainText('preserving unrelated local changes'); + expect(await dialog.locator('[data-group-update-row]').first().evaluate((row) => getComputedStyle(row).borderTopWidth)).toBe('0px'); + expect(await dialog.getByRole('status').evaluate((status) => getComputedStyle(status).whiteSpace)).toBe('nowrap'); await page.screenshot({ path: '/tmp/angkorgit-group-summary.png' }); + await page.evaluate(async () => { + const { useSettings } = await import('/src/features/settings/store.ts'); + useSettings.getState().setTheme('light'); + }); + await expect(page.locator('html')).toHaveClass(/light/); + await page.screenshot({ path: '/tmp/angkorgit-group-summary-light.png' }); await dialog.getByRole('button', { name: 'Done', exact: true }).click(); await expect(dialog).toBeHidden(); }); From 4ae8c3f8d7ad0433ee83b5645739dd6cd2c5db46 Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Tue, 13 Oct 2026 18:11:35 +0200 Subject: [PATCH 06/10] fix: honor prune overrides and settle cancelled group results --- CHANGELOG.md | 4 +- CLAUDE.md | 17 +- apps/desktop/src-tauri/src/commands.rs | 2 +- .../src-tauri/src/core/group_update.rs | 55 +++++- apps/desktop/src-tauri/src/core/remote.rs | 175 +++++++++++------- apps/desktop/src-tauri/src/core/types.rs | 10 +- apps/desktop/src-tauri/tests/git_engine.rs | 123 ++++++++++++ apps/desktop/src/core/ipc.ts | 5 +- .../src/features/repository/WelcomePage.tsx | 15 +- .../src/features/repository/groupUpdate.ts | 10 +- packages/core/src/git/types.ts | 5 + tests/e2e/smoke.spec.ts | 42 +++++ tests/unit/groupUpdate.test.ts | 31 +++- 13 files changed, 398 insertions(+), 96 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71703e08..af5b2c4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,9 @@ All notable changes to AngKorGit are documented here. The format follows after checkout explicitly explain the working-tree/branch mismatch; abandoned run entries expire on later registry activity. Group pull uses the same checkout behavior as toolbar Pull. The summary has flat - rows, toned badges, and a single-line counts strip. (#69) + rows, toned badges, and a single-line counts strip. Per-remote prune settings + override fetch.prune, including an explicit false. Completed checkouts retain their + result when cancelling; settled summary rows ignore late responses and errors. (#69) ## [0.23.0] — 2026-10-13 diff --git a/CLAUDE.md b/CLAUDE.md index ec9af18f..2412aa8d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1065,9 +1065,14 @@ features/ │ │ download handles remain cancelled after their registry entry goes. │ │ Network reads may wind down in the background, but no ref or │ │ working-tree updates run after cancellation acknowledges. The batch -│ │ runner tags the race winner and records whether work started, so a -│ │ synthetic cancellation is delivered once. Real late results replace -│ │ the repo row only for the same runId; unmount cancels too. +│ │ native guard records per-repo outcomes before releasing a local +│ │ write phase. groupCancel returns these completed-result receipts, +│ │ so a checkout completed while Cancel waited still counts as Updated. +│ │ The runner settles each row once from the response or acknowledgement, +│ │ consumes but ignores late responses/errors, and never overwrites settled +│ │ rows. Cancelled queued requests cannot become inactive-run failures; +│ │ unmount cancels too. Fetch pruning reads remote..prune first, +│ │ falling back to fetch.prune only when the remote key is absent. │ │ Pull reads branch_upstream_name BEFORE fetch (a missing tracking │ │ ref can be restored), fetching the exact configured merge ref │ │ into that tracking ref, requiring its update callback (with @@ -3601,10 +3606,10 @@ update CLAUDE.md or docs/ — never the code. | Suite | Location | Coverage | | --- | --- | --- | -| Rust integration (103) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | +| Rust integration (105) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | | Rust module (79) | `apps/desktop/src-tauri/src/cli.rs` (7), `src/state.rs` (1), `src/editors.rs` (4), `src/fonts.rs` (1), `src/ai_cli.rs` (10), `src/error.rs` (7), `src/core/remote.rs` (18), `src/terminal.rs` (3), `src/core/accounts.rs` (7), `src/core/sign.rs` (7), `src/forge.rs` (7), `src/proc.rs` (1), `src/watcher.rs` (4) | AI-CLI runner: program allowlist (incl. Cursor's `agent` and `cursor-agent` names), stdout capture via fake agent script, {OUTPUT_FILE} substitution, kill-on-timeout, Cursor version-folder keys and the .cmd launcher → newest node.exe/index.js resolution (none for other agents or a missing versions dir) · error mapping: HTTP status extraction from libgit2 messages, 401/402/403 explanations, unmapped codes kept verbatim, io NotFound → not_found while other io errors stay io · forge proxy: api-subdomain host allowlist (dot-anchored), per-provider auth headers, bitbucket email requirement, unknown provider rejected, missing-token vs no-account message · SSH key resolution: `~` expansion, configured key ordered ahead of defaults, dedupe when the configured key IS a default, blank config ignored, generation never targeting an existing key · push refspec shapes (plain/force/tags never forced) · rejection message quotes the server lines after the ref list (sideband lines trimmed, de-duplicated, "remote:" and rule lines dropped, capped at 12) · repo account-binding parse (valid/malformed) · accounts: upsert keeps both same-host accounts + default flags, one default per host, preferred-before-default candidate order, port-loose host match, ssh URLs ignored · signing config: off by default, ssh setup read from git config, empty-string values read as unset, ssh-without-key and x509 are clear errors, openpgp falls back to the committer identity, literal-key detection, ~ expansion · proc: no bare `Command::new` anywhere outside proc.rs (G31) · recents: new paths go on top in order, an existing path moves instead of duplicating, the list caps at RECENT_LIMIT · watcher: metadata filter unchanged for main repos, `worktrees/*/HEAD|gitdir|locked` relevant while `worktrees/*/index` is noise, a linked worktree watches its own gitdir + the shared commondir, main repos need no extra roots | -| Unit (272) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | -| E2E (116) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | +| Unit (274) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | +| E2E (117) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | ## 9.5 Open-source & community files diff --git a/apps/desktop/src-tauri/src/commands.rs b/apps/desktop/src-tauri/src/commands.rs index 1512d6d2..95cda794 100644 --- a/apps/desktop/src-tauri/src/commands.rs +++ b/apps/desktop/src-tauri/src/commands.rs @@ -513,7 +513,7 @@ pub fn repository_group_start(runId: String) -> AppResult<()> { } #[tauri::command] -pub async fn repository_group_cancel(runId: String) -> AppResult<()> { +pub async fn repository_group_cancel(runId: String) -> AppResult> { blocking(move || crate::core::group_update::cancel(&runId)).await } diff --git a/apps/desktop/src-tauri/src/core/group_update.rs b/apps/desktop/src-tauri/src/core/group_update.rs index af7f79c3..29fc276e 100644 --- a/apps/desktop/src-tauri/src/core/group_update.rs +++ b/apps/desktop/src-tauri/src/core/group_update.rs @@ -2,11 +2,13 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex, OnceLock}; use std::time::{Duration, Instant}; +use super::types::{GroupUpdateReceipt, GroupUpdateResult}; use crate::error::{AppError, AppResult}; #[derive(Default)] pub struct GroupUpdateControl { cancelled: Mutex, + completed: Mutex>, } impl GroupUpdateControl { @@ -18,6 +20,51 @@ impl GroupUpdateControl { Ok(()) } + pub fn cancel_results(&self) -> AppResult> { + self.cancel()?; + let completed = self + .completed + .lock() + .map_err(|_| AppError::other("Group results lock poisoned"))?; + Ok(completed + .iter() + .map(|(path, result)| GroupUpdateReceipt { + path: path.clone(), + result: result.clone(), + }) + .collect()) + } + + pub fn with_active_result( + &self, + path: &str, + action: impl FnOnce() -> AppResult, + ) -> AppResult { + self.with_active(|| { + let result = action(); + let receipt = match &result { + Ok(result) => result.clone(), + Err(error) => GroupUpdateResult { + status: "failed".into(), + message: error.to_string(), + changes: Vec::new(), + }, + }; + self.completed + .lock() + .map_err(|_| AppError::other("Group results lock poisoned"))? + .insert(path.into(), receipt); + result + }) + } + + pub fn has_completed(&self, path: &str) -> bool { + self.completed + .lock() + .map(|completed| completed.contains_key(path)) + .unwrap_or(false) + } + pub fn is_cancelled(&self) -> bool { self.cancelled .lock() @@ -98,7 +145,7 @@ pub fn control(id: &str) -> AppResult> { control.ok_or_else(|| AppError::other("Group update is no longer active")) } -pub fn cancel(id: &str) -> AppResult<()> { +pub fn cancel(id: &str) -> AppResult> { let mut runs = runs() .lock() .map_err(|_| AppError::other("Group update registry poisoned"))?; @@ -109,10 +156,10 @@ pub fn cancel(id: &str) -> AppResult<()> { }); prune_expired(&mut runs, now); drop(runs); - if let Some(control) = control { - control.cancel()?; + match control { + Some(control) => control.cancel_results(), + None => Ok(Vec::new()), } - Ok(()) } pub fn finish(id: &str) -> AppResult<()> { diff --git a/apps/desktop/src-tauri/src/core/remote.rs b/apps/desktop/src-tauri/src/core/remote.rs index de33e7cc..820e82f6 100644 --- a/apps/desktop/src-tauri/src/core/remote.rs +++ b/apps/desktop/src-tauri/src/core/remote.rs @@ -469,14 +469,18 @@ pub fn group_update_controlled( control: &GroupUpdateControl, ) -> AppResult { let result = group_update_inner(path, pull, control); - if control.is_cancelled() { - return Ok(GroupUpdateResult { + match result { + Ok(result) => { + let _ = control.with_active_result(path, || Ok(result.clone())); + Ok(result) + } + Err(_) if control.is_cancelled() && !control.has_completed(path) => Ok(GroupUpdateResult { status: "cancelled".into(), - message: "Cancelled; completed updates were kept".into(), - changes: result.map(|result| result.changes).unwrap_or_default(), - }); + message: "Cancelled before completing the repository update".into(), + changes: Vec::new(), + }), + Err(error) => Err(error), } - result } fn group_update_inner( @@ -510,44 +514,35 @@ fn group_update_inner( if control.is_cancelled() { break; } - match group_fetch(path, name, control, None) { + match group_fetch( + path, + name, + control, + None, + Some((&before, succeeded + 1, names.len())), + ) { Ok(()) => succeeded += 1, Err(error) => failures.push(format!("{name}: {error}")), } } - let after = fetched_refs(&repo)?; - let mut keys: Vec<_> = before.keys().chain(after.keys()).cloned().collect(); - keys.sort(); - keys.dedup(); - let changes = keys - .into_iter() - .filter_map(|name| { - let old = before.get(&name).copied(); - let new = after.get(&name).copied(); - if old == new { - return None; - } - Some(RefMovement { - name, - old_oid: old.map(|oid| oid.to_string()), - new_oid: new.map(|oid| oid.to_string()), - commits: old - .zip(new) - .and_then(|(old, new)| repo.graph_ahead_behind(new, old).ok()) - .map(|(ahead, _)| ahead), - }) - }) - .collect(); + let changes = ref_movements(&repo, &before)?; return Ok(GroupUpdateResult { - status: if failures.is_empty() { + status: if succeeded == names.len() { "ok" } else if succeeded > 0 { "partial" + } else if control.is_cancelled() { + "cancelled" } else { "failed" } .into(), - message: if failures.is_empty() { + message: if control.is_cancelled() && succeeded < names.len() { + format!( + "Fetched {succeeded} of {} remotes before cancellation; completed updates kept", + names.len() + ) + } else if failures.is_empty() { format!("Fetched {} remote(s)", names.len()) } else { format!( @@ -609,7 +604,13 @@ fn group_update_inner( let merge_ref = repo .config()? .get_string(&format!("branch.{branch_name}.merge"))?; - if let Err(error) = group_fetch(path, remote, control, Some((&merge_ref, &upstream_ref))) { + if let Err(error) = group_fetch( + path, + remote, + control, + Some((&merge_ref, &upstream_ref)), + None, + ) { if matches!(&error, AppError::Git(error) if error.code() == git2::ErrorCode::NotFound) { return Ok(result( "skipped", @@ -655,10 +656,18 @@ fn group_update_inner( "Repository changed during fetch; try again".into(), )); } - let checkout = control.with_active(|| { + let checkout = control.with_active_result(path, || { let mut checkout = CheckoutBuilder::new(); checkout.safe(); - repo.checkout_tree(target.as_object(), Some(&mut checkout))?; + if let Err(error) = repo.checkout_tree(target.as_object(), Some(&mut checkout)) { + if error.code() == git2::ErrorCode::Conflict { + return Ok(result( + "skipped", + format!("Local changes prevent checkout: {error}"), + )); + } + return Err(error.into()); + } repo.find_reference(&refname) .and_then(|mut reference| { reference.set_target(new, &format!("pull: fast-forward to {upstream_ref}")) @@ -670,27 +679,18 @@ fn group_update_inner( Inspect HEAD and working-tree changes before retrying." )) })?; - Ok(()) + Ok(GroupUpdateResult { + status: "ok".into(), + message: format!("Fast-forwarded {branch_name} by {behind} commit(s)"), + changes: vec![RefMovement { + name: branch_name, + old_oid: Some(old.to_string()), + new_oid: Some(new.to_string()), + commits: Some(behind), + }], + }) }); - if let Err(error) = checkout { - if matches!(&error, AppError::Git(error) if error.code() == git2::ErrorCode::Conflict) { - return Ok(result( - "skipped", - format!("Local changes prevent checkout: {error}"), - )); - } - return Err(error); - } - Ok(GroupUpdateResult { - status: "ok".into(), - message: format!("Fast-forwarded {branch_name} by {behind} commit(s)"), - changes: vec![RefMovement { - name: branch_name, - old_oid: Some(old.to_string()), - new_oid: Some(new.to_string()), - commits: Some(behind), - }], - }) + checkout } fn group_fetch( @@ -698,6 +698,7 @@ fn group_fetch( name: &str, control: &GroupUpdateControl, upstream: Option<(&str, &str)>, + progress: Option<(&HashMap, usize, usize)>, ) -> AppResult<()> { control.with_active(|| Ok(()))?; let repo = super::repo::open(path)?; @@ -714,7 +715,7 @@ fn group_fetch( .collect(); remote.download(&refspecs, Some(&mut options))?; remote.disconnect()?; - control.with_active(|| { + let mut apply = || { let received = AtomicBool::new(upstream.is_none()); let mut updates = RemoteCallbacks::new(); updates.update_tips(|name, _, _| { @@ -737,16 +738,64 @@ fn group_fetch( ) .into()); } - if repo - .config()? - .get_bool(&format!("remote.{name}.prune")) - .unwrap_or(false) - || repo.config()?.get_bool("fetch.prune").unwrap_or(false) - { + let config = repo.config()?; + let prune = match config.get_bool(&format!("remote.{name}.prune")) { + Ok(prune) => prune, + Err(error) if error.code() == git2::ErrorCode::NotFound => { + config.get_bool("fetch.prune").unwrap_or(false) + } + Err(error) => return Err(error.into()), + }; + if prune { remote.prune(None)?; } Ok(()) - }) + }; + match progress { + Some((before, succeeded, total)) => control + .with_active_result(path, || { + apply()?; + Ok(GroupUpdateResult { + status: if succeeded == total { "ok" } else { "partial" }.into(), + message: format!( + "Fetched {succeeded} of {total} remotes; completed updates kept" + ), + changes: ref_movements(&repo, before)?, + }) + }) + .map(|_| ()), + None => control.with_active(apply), + } +} + +fn ref_movements( + repo: &Repository, + before: &HashMap, +) -> AppResult> { + let after = fetched_refs(repo)?; + let mut keys: Vec<_> = before.keys().chain(after.keys()).cloned().collect(); + keys.sort(); + keys.dedup(); + let changes = keys + .into_iter() + .filter_map(|name| { + let old = before.get(&name).copied(); + let new = after.get(&name).copied(); + if old == new { + return None; + } + Some(RefMovement { + name, + old_oid: old.map(|oid| oid.to_string()), + new_oid: new.map(|oid| oid.to_string()), + commits: old + .zip(new) + .and_then(|(old, new)| repo.graph_ahead_behind(new, old).ok()) + .map(|(ahead, _)| ahead), + }) + }) + .collect(); + Ok(changes) } fn fetched_refs(repo: &Repository) -> AppResult> { diff --git a/apps/desktop/src-tauri/src/core/types.rs b/apps/desktop/src-tauri/src/core/types.rs index 5eddae2c..025b2b7a 100644 --- a/apps/desktop/src-tauri/src/core/types.rs +++ b/apps/desktop/src-tauri/src/core/types.rs @@ -280,7 +280,7 @@ pub struct GeneratedKey { pub public_key: String, } -#[derive(Serialize, Debug)] +#[derive(Serialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct GroupUpdateResult { pub status: String, @@ -288,7 +288,7 @@ pub struct GroupUpdateResult { pub changes: Vec, } -#[derive(Serialize, Debug)] +#[derive(Serialize, Debug, Clone)] #[serde(rename_all = "camelCase")] pub struct RefMovement { pub name: String, @@ -296,3 +296,9 @@ pub struct RefMovement { pub new_oid: Option, pub commits: Option, } + +#[derive(Serialize, Clone)] +pub struct GroupUpdateReceipt { + pub path: String, + pub result: GroupUpdateResult, +} diff --git a/apps/desktop/src-tauri/tests/git_engine.rs b/apps/desktop/src-tauri/tests/git_engine.rs index 512a3271..3d56298c 100644 --- a/apps/desktop/src-tauri/tests/git_engine.rs +++ b/apps/desktop/src-tauri/tests/git_engine.rs @@ -3473,3 +3473,126 @@ fn group_pull_explains_when_checkout_succeeds_but_branch_update_fails() { assert_eq!(other.read("a.txt"), "updated\n"); std::fs::remove_dir_all(origin).unwrap(); } + +#[test] +fn group_fetch_remote_prune_setting_overrides_global_setting() { + for (global, remote, pruned) in [ + (true, Some(false), false), + (false, Some(true), true), + (true, None, true), + (false, None, false), + ] { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let repo = git2::Repository::open(local.path()).unwrap(); + repo.branch( + "obsolete", + &repo.head().unwrap().peel_to_commit().unwrap(), + false, + ) + .unwrap(); + core::push(local.path(), "origin", Some("obsolete"), false, false, true).unwrap(); + let other = clone_of(&origin, &local, "prune"); + core::set_config( + Some(other.path()), + "fetch.prune", + &global.to_string(), + false, + ) + .unwrap(); + if let Some(remote) = remote { + core::set_config( + Some(other.path()), + "remote.origin.prune", + &remote.to_string(), + false, + ) + .unwrap(); + } + git2::Repository::open_bare(&origin) + .unwrap() + .find_reference("refs/heads/obsolete") + .unwrap() + .delete() + .unwrap(); + let outcome = core::group_update(other.path(), false).unwrap(); + assert_eq!(outcome.status, "ok"); + let other_repo = git2::Repository::open(other.path()).unwrap(); + assert_eq!( + other_repo + .find_reference("refs/remotes/origin/obsolete") + .is_err(), + pruned + ); + assert_eq!( + outcome + .changes + .iter() + .any(|change| change.name == "refs/remotes/origin/obsolete" + && change.new_oid.is_none()), + pruned + ); + std::fs::remove_dir_all(origin).unwrap(); + } +} + +#[test] +fn group_cancel_reports_a_completed_checkout_before_acknowledging() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "cancel-checkout"); + local.write("a.txt", "updated\n"); + let new = commit_all(&local, "updated"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let control = std::sync::Arc::new(core::GroupUpdateControl::default()); + let worker_control = control.clone(); + let path = other.path().to_string(); + let (written_tx, written_rx) = std::sync::mpsc::channel(); + let (release_tx, release_rx) = std::sync::mpsc::channel(); + let worker = std::thread::spawn(move || { + worker_control.with_active_result(&path, || { + let result = core::group_update(&path, true)?; + written_tx.send(()).unwrap(); + release_rx + .recv_timeout(std::time::Duration::from_secs(5)) + .unwrap(); + Ok(result) + }) + }); + written_rx + .recv_timeout(std::time::Duration::from_secs(5)) + .unwrap(); + let cancel_control = control.clone(); + let (cancel_tx, cancel_rx) = std::sync::mpsc::channel(); + let cancel = std::thread::spawn(move || { + cancel_tx.send(()).unwrap(); + cancel_control.cancel_results().unwrap() + }); + cancel_rx + .recv_timeout(std::time::Duration::from_secs(5)) + .unwrap(); + assert!(!cancel.is_finished()); + release_tx.send(()).unwrap(); + assert_eq!(worker.join().unwrap().unwrap().status, "ok"); + let receipts = cancel.join().unwrap(); + assert_eq!(receipts.len(), 1); + assert_eq!(receipts[0].path, other.path()); + assert_eq!(receipts[0].result.status, "ok"); + assert_eq!( + receipts[0].result.changes[0].old_oid.as_deref(), + Some(old.as_str()) + ); + assert_eq!( + receipts[0].result.changes[0].new_oid.as_deref(), + Some(new.as_str()) + ); + assert_eq!(other.read("a.txt"), "updated\n"); + assert!(control.is_cancelled()); + std::fs::remove_dir_all(origin).unwrap(); +} diff --git a/apps/desktop/src/core/ipc.ts b/apps/desktop/src/core/ipc.ts index bcc1fcb0..c8dba047 100644 --- a/apps/desktop/src/core/ipc.ts +++ b/apps/desktop/src/core/ipc.ts @@ -1,5 +1,6 @@ import type { GroupUpdateResult, + GroupUpdateReceipt, BranchInfo, CliAgentInfo, CliRunRequest, @@ -472,8 +473,8 @@ export const ipc = { if (!isTauri()) return; return invoke('repository_group_start', { runId }); }, - async groupCancel(runId: string): Promise { - if (!isTauri()) return; + async groupCancel(runId: string): Promise { + if (!isTauri()) return []; return invoke('repository_group_cancel', { runId }); }, async groupFinish(runId: string): Promise { diff --git a/apps/desktop/src/features/repository/WelcomePage.tsx b/apps/desktop/src/features/repository/WelcomePage.tsx index d121b116..343449be 100644 --- a/apps/desktop/src/features/repository/WelcomePage.tsx +++ b/apps/desktop/src/features/repository/WelcomePage.tsx @@ -5,6 +5,7 @@ import { parseChordId, repoGroupIdFor, type RepoGroup, + type GroupUpdateResult, type RepoGroupDropPosition, } from '@angkorgit/core'; import { useNavigate } from 'react-router-dom'; @@ -88,7 +89,7 @@ export function WelcomePage() { const setRepoGroup = useSettings((s) => s.setRepoGroup); const moveRepoGroup = useSettings((s) => s.moveRepoGroup); const busy = useRepo((s) => s.busy); - const groupRun = useRef<{ id: string; controller: AbortController; cancelling: boolean; ready: Promise } | null>(null); + const groupRun = useRef<{ id: string; controller: AbortController; cancelling: boolean; ready: Promise; completed: Map } | null>(null); const [groupProgress, setGroupProgress] = useState(null); const [query, setQuery] = useState(''); const [activePath, setActivePath] = useState(null); @@ -103,7 +104,10 @@ export function WelcomePage() { useEffect(() => () => { const run = groupRun.current; - if (run) void run.ready.then(() => ipc.groupCancel(run.id)).then(() => run.controller.abort()).catch(() => undefined); + if (run) void run.ready.then(() => ipc.groupCancel(run.id)).then((receipts) => { + run.completed = new Map(receipts.map(({ path, result }) => [path, result])); + run.controller.abort(); + }).catch(() => undefined); }, []); async function cancelGroup() { @@ -113,7 +117,8 @@ export function WelcomePage() { setGroupProgress((current) => current?.runId === run.id ? { ...current, cancelling: true } : current); try { await run.ready; - await ipc.groupCancel(run.id); + const receipts = await ipc.groupCancel(run.id); + run.completed = new Map(receipts.map(({ path, result }) => [path, result])); run.controller.abort(); } catch (error) { run.cancelling = false; @@ -125,7 +130,7 @@ export function WelcomePage() { async function updateGroup(group: RepoGroup, repos: RecentRepository[], pull: boolean) { if (groupRun.current || useRepo.getState().busy || useRepo.getState().opening || repos.length === 0) return; const id = crypto.randomUUID(); - const run = { id, controller: new AbortController(), cancelling: false, ready: ipc.groupStart(id) }; + const run = { id, controller: new AbortController(), cancelling: false, ready: ipc.groupStart(id), completed: new Map() }; groupRun.current = run; useRepo.getState().setBusy(pull ? 'Pulling group…' : 'Fetching group…'); setGroupProgress({ runId: run.id, name: group.name, pull, total: repos.length, results: [], running: true, cancelling: false }); @@ -139,7 +144,7 @@ export function WelcomePage() { ? current.results.map((r) => r.repo.path === result.repo.path ? result : r) : [...current.results, result] }; }); - }, run.controller.signal); + }, run.controller.signal, () => run.completed); if (repos.some((r) => r.path === useRepo.getState().repo?.path)) { if (run.controller.signal.aborted) void useRepo.getState().refresh().catch(() => undefined); else await useRepo.getState().refresh(); diff --git a/apps/desktop/src/features/repository/groupUpdate.ts b/apps/desktop/src/features/repository/groupUpdate.ts index 1d9c9819..00936c64 100644 --- a/apps/desktop/src/features/repository/groupUpdate.ts +++ b/apps/desktop/src/features/repository/groupUpdate.ts @@ -19,24 +19,23 @@ export async function updateGroupRepositories( update: (path: string) => Promise, onResult: (result: GroupRepositoryResult) => void, signal?: AbortSignal, + completedOnCancel: () => ReadonlyMap = () => new Map(), ): Promise { for (const repo of repos) { const cancelled: GroupUpdateResult = { status: 'cancelled', message: 'Cancelled; completed updates are kept', changes: [] }; if (signal?.aborted) { - onResult({ ...cancelled, repo }); + onResult({ ...(completedOnCancel().get(repo.path) ?? cancelled), repo }); continue; } - let updateStarted = false; const pending = Promise.resolve().then(() => { if (signal?.aborted) return cancelled; - updateStarted = true; return update(repo.path); }).catch((error): GroupUpdateResult => ({ status: 'failed', message: (error as { message?: string })?.message ?? String(error), changes: [], })); let onAbort: (() => void) | undefined; const aborted = new Promise((resolve) => { - onAbort = () => resolve(cancelled); + onAbort = () => resolve(completedOnCancel().get(repo.path) ?? cancelled); signal?.addEventListener('abort', onAbort, { once: true }); if (signal?.aborted) onAbort(); }); @@ -46,8 +45,5 @@ export async function updateGroupRepositories( ]); if (onAbort) signal?.removeEventListener('abort', onAbort); onResult({ ...winner.result, repo }); - if (winner.source === 'abort' && updateStarted) { - void pending.then((settled) => onResult({ ...settled, repo })); - } } } diff --git a/packages/core/src/git/types.ts b/packages/core/src/git/types.ts index 310329da..0222c45f 100644 --- a/packages/core/src/git/types.ts +++ b/packages/core/src/git/types.ts @@ -257,3 +257,8 @@ export interface RefMovement { newOid: string | null; commits: number | null; } + +export interface GroupUpdateReceipt { + path: string; + result: GroupUpdateResult; +} diff --git a/tests/e2e/smoke.spec.ts b/tests/e2e/smoke.spec.ts index 12b765da..c5f22580 100644 --- a/tests/e2e/smoke.spec.ts +++ b/tests/e2e/smoke.spec.ts @@ -3158,3 +3158,45 @@ test('group fetch classifies partial failures once and cancellation releases a h await page.locator('[data-group-header]', { hasText: 'Projects' }).click({ button: 'right' }); await expect(page.getByRole('menuitem', { name: 'Fetch all', exact: true })).toBeEnabled(); }); + + +test('cancel counts a completed checkout and ignores a delayed inactive-run error', async ({ page }) => { + await page.goto('/'); + await expect(page.getByText('Recent repositories')).toBeVisible({ timeout: 10_000 }); + await page.evaluate(async () => { + const [{ ipc }, { useSettings }, { useRepo }] = await Promise.all([ + import('/src/core/ipc.ts'), import('/src/features/settings/store.ts'), import('/src/features/repository/store.ts'), + ]); + const repos = ['updated', 'queued'].map((name) => ({ name, path: `/projects/${name}`, lastOpenedAt: 0 })); + useRepo.setState({ recents: repos }); + useSettings.getState().addRepoGroup('Projects', 0, repos.map((r) => r.path)); + const tracker = window as unknown as { __rejectLateGroup: () => void; __groupCalls: number }; + tracker.__groupCalls = 0; + ipc.groupUpdate = async () => { + tracker.__groupCalls++; + return new Promise((_, reject) => { tracker.__rejectLateGroup = () => reject({ message: 'Group update is no longer active' }); }); + }; + ipc.groupCancel = async () => [{ path: repos[0].path, result: { + status: 'ok', message: 'Fast-forwarded main', changes: [{ name: 'main', oldOid: '1234567', newOid: 'abcdef0', commits: 1 }], + } }]; + }); + await page.locator('[data-group-header]', { hasText: 'Projects' }).click({ button: 'right' }); + await page.getByRole('menuitem', { name: 'Pull all (fast-forward only)', exact: true }).click(); + const dialog = page.getByRole('dialog'); + await dialog.getByRole('button', { name: 'Cancel run', exact: true }).click(); + await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeEnabled(); + await expect(dialog.getByRole('status')).toContainText('1 updated · 0 up to date · 0 skipped · 0 failed · 1 cancelled'); + await expect(dialog.getByText('Updated', { exact: true })).toBeVisible(); + await page.evaluate(async () => { + const tracker = window as unknown as { __rejectLateGroup: () => void; __groupCalls: number }; + if (tracker.__groupCalls !== 1) throw new Error('Queued repository started'); + tracker.__rejectLateGroup(); + await Promise.resolve(); + await Promise.resolve(); + await Promise.resolve(); + }); + await expect(dialog.getByText('Updated', { exact: true })).toBeVisible(); + await expect(dialog.getByText('Group update is no longer active', { exact: true })).toBeHidden(); + await expect(dialog.getByRole('status')).toContainText('1 updated · 0 up to date · 0 skipped · 0 failed · 1 cancelled'); + await dialog.getByRole('button', { name: 'Done', exact: true }).click(); +}); diff --git a/tests/unit/groupUpdate.test.ts b/tests/unit/groupUpdate.test.ts index ab46052d..da02db4b 100644 --- a/tests/unit/groupUpdate.test.ts +++ b/tests/unit/groupUpdate.test.ts @@ -28,11 +28,12 @@ it('gives partial success one outcome shared by counters and badges', () => { expect(classify({ status: 'cancelled', message: 'stopped', changes })).toBe('cancelled'); }); -it('cancels a hanging operation without starting the remaining repositories and retains late results', async () => { +it.each(['resolve', 'reject'] as const)('cancels a hanging operation and ignores a late %s', async (late) => { const repos = ['slow', 'next'].map((name) => ({ name, path: `/${name}`, lastOpenedAt: 0 })); const controller = new AbortController(); let finish!: (result: GroupRepositoryResult) => void; - const pending = new Promise((resolve) => { finish = resolve; }); + let fail!: (error: Error) => void; + const pending = new Promise((resolve, reject) => { finish = resolve; fail = reject; }); const update = vi.fn(() => pending); const results: GroupRepositoryResult[] = []; const run = updateGroupRepositories(repos, update, (result) => results.push(result), controller.signal); @@ -41,9 +42,29 @@ it('cancels a hanging operation without starting the remaining repositories and await run; expect(update).toHaveBeenCalledTimes(1); expect(results.map((r) => r.status)).toEqual(['cancelled', 'cancelled']); - finish({ repo: repos[0], status: 'cancelled', message: 'Kept completed remote fetch', changes: [{ name: 'origin/main', oldOid: 'one', newOid: 'two', commits: 1 }] }); - await vi.waitFor(() => expect(results).toHaveLength(3)); - expect(results[2].changes).toHaveLength(1); + if (late === 'resolve') finish({ repo: repos[0], status: 'ok', message: 'Late response', changes: [] }); + else fail(new Error('Group update is no longer active')); + await pending.catch(() => undefined); + await Promise.resolve(); + await Promise.resolve(); + expect(results).toHaveLength(2); + expect(results.map((r) => r.status)).toEqual(['cancelled', 'cancelled']); +}); + +it('uses the cancel acknowledgement for a completed checkout whose response is delayed', async () => { + const repos = ['updated', 'next'].map((name) => ({ name, path: `/${name}`, lastOpenedAt: 0 })); + const controller = new AbortController(); + const completed = new Map(); + const results: GroupRepositoryResult[] = []; + const update = vi.fn(() => new Promise(() => undefined)); + const run = updateGroupRepositories(repos, update, (result) => results.push(result), controller.signal, () => completed); + await Promise.resolve(); + completed.set('/updated', { repo: repos[0], status: 'ok', message: 'Fast-forwarded main', changes: [{ name: 'main', oldOid: 'one', newOid: 'two', commits: 1 }] }); + controller.abort(); + await run; + expect(update).toHaveBeenCalledTimes(1); + expect(results.map((r) => classify(r))).toEqual(['updated', 'cancelled']); + expect(results).toHaveLength(2); }); it('does not start any operation when already cancelled', async () => { From d8866bc741073029143aefdd9c83ac94f53ddc68 Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Tue, 13 Oct 2026 18:27:31 +0200 Subject: [PATCH 07/10] fix: preserve group fetch progress and support URL upstreams --- CHANGELOG.md | 5 +- CLAUDE.md | 14 +- .../src-tauri/src/core/group_update.rs | 70 ++++- apps/desktop/src-tauri/src/core/remote.rs | 274 ++++++++++++------ apps/desktop/src-tauri/tests/git_engine.rs | 189 ++++++++++-- .../features/repository/GroupUpdateDialog.tsx | 2 +- .../src/features/repository/groupUpdate.ts | 7 +- docs/assets/group-update-cancel-summary.png | Bin 112678 -> 118483 bytes tests/e2e/smoke.spec.ts | 8 +- tests/unit/groupUpdate.test.ts | 3 + 10 files changed, 426 insertions(+), 146 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af5b2c4d..cb9cc611 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,10 @@ All notable changes to AngKorGit are documented here. The format follows Group pull uses the same checkout behavior as toolbar Pull. The summary has flat rows, toned badges, and a single-line counts strip. Per-remote prune settings override fetch.prune, including an explicit false. Completed checkouts retain their - result when cancelling; settled summary rows ignore late responses and errors. (#69) + result when cancelling; settled summary rows ignore late responses and errors. + URL-based upstreams are supported. Fetch cancellation keeps successful remotes and + errors together, with ref summaries calculated outside the write guard; queued + repositories say they never started, and unchanged fetch badges match the counts. (#69) ## [0.23.0] — 2026-10-13 diff --git a/CLAUDE.md b/CLAUDE.md index 2412aa8d..5b000fc8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1073,10 +1073,20 @@ features/ │ │ rows. Cancelled queued requests cannot become inactive-run failures; │ │ unmount cancels too. Fetch pruning reads remote..prune first, │ │ falling back to fetch.prune only when the remote key is absent. -│ │ Pull reads branch_upstream_name BEFORE fetch (a missing tracking +│ │ ensure_active() names read-only cancellation checks. Fetch receipts +│ │ store an Arc of the initial refs and small success/failure counts; +│ │ moved-ref discovery and commit counting happen outside the cancel +│ │ mutex when the response or acknowledgement is built. Errors retain +│ │ earlier fetch progress and remain visible after Cancel; queued repos +│ │ explicitly say they never started. Fetch badges say Unchanged like +│ │ the counts. Pull reads branch_upstream_merge via git2 and resolves +│ │ branch_upstream_name before fetching named remotes (a missing tracking │ │ ref can be restored), fetching the exact configured merge ref │ │ into that tracking ref, requiring its update callback (with │ │ REPORT_UNCHANGED) so stale refs never hide a deleted upstream. +│ │ URL/path upstreams use anonymous remotes and a unique temporary +│ │ refs/angkorgit/group-pull ref; its OID is captured and the ref deleted +│ │ in the same guarded write phase, without changing branch config. │ │ It skips detached/unborn HEAD, bare repos, unfinished operations │ │ and divergence. Safe checkout alone decides whether local changes │ │ conflict; unrelated untracked, staged and unstaged changes survive. @@ -3606,7 +3616,7 @@ update CLAUDE.md or docs/ — never the code. | Suite | Location | Coverage | | --- | --- | --- | -| Rust integration (105) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | +| Rust integration (107) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | | Rust module (79) | `apps/desktop/src-tauri/src/cli.rs` (7), `src/state.rs` (1), `src/editors.rs` (4), `src/fonts.rs` (1), `src/ai_cli.rs` (10), `src/error.rs` (7), `src/core/remote.rs` (18), `src/terminal.rs` (3), `src/core/accounts.rs` (7), `src/core/sign.rs` (7), `src/forge.rs` (7), `src/proc.rs` (1), `src/watcher.rs` (4) | AI-CLI runner: program allowlist (incl. Cursor's `agent` and `cursor-agent` names), stdout capture via fake agent script, {OUTPUT_FILE} substitution, kill-on-timeout, Cursor version-folder keys and the .cmd launcher → newest node.exe/index.js resolution (none for other agents or a missing versions dir) · error mapping: HTTP status extraction from libgit2 messages, 401/402/403 explanations, unmapped codes kept verbatim, io NotFound → not_found while other io errors stay io · forge proxy: api-subdomain host allowlist (dot-anchored), per-provider auth headers, bitbucket email requirement, unknown provider rejected, missing-token vs no-account message · SSH key resolution: `~` expansion, configured key ordered ahead of defaults, dedupe when the configured key IS a default, blank config ignored, generation never targeting an existing key · push refspec shapes (plain/force/tags never forced) · rejection message quotes the server lines after the ref list (sideband lines trimmed, de-duplicated, "remote:" and rule lines dropped, capped at 12) · repo account-binding parse (valid/malformed) · accounts: upsert keeps both same-host accounts + default flags, one default per host, preferred-before-default candidate order, port-loose host match, ssh URLs ignored · signing config: off by default, ssh setup read from git config, empty-string values read as unset, ssh-without-key and x509 are clear errors, openpgp falls back to the committer identity, literal-key detection, ~ expansion · proc: no bare `Command::new` anywhere outside proc.rs (G31) · recents: new paths go on top in order, an existing path moves instead of duplicating, the list caps at RECENT_LIMIT · watcher: metadata filter unchanged for main repos, `worktrees/*/HEAD|gitdir|locked` relevant while `worktrees/*/index` is noise, a linked worktree watches its own gitdir + the shared commondir, main repos need no extra roots | | Unit (274) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | | E2E (117) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | diff --git a/apps/desktop/src-tauri/src/core/group_update.rs b/apps/desktop/src-tauri/src/core/group_update.rs index 29fc276e..8e1121a3 100644 --- a/apps/desktop/src-tauri/src/core/group_update.rs +++ b/apps/desktop/src-tauri/src/core/group_update.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::sync::{Arc, Mutex, OnceLock}; +use std::sync::{Arc, Mutex, MutexGuard, OnceLock}; use std::time::{Duration, Instant}; use super::types::{GroupUpdateReceipt, GroupUpdateResult}; @@ -8,7 +8,21 @@ use crate::error::{AppError, AppResult}; #[derive(Default)] pub struct GroupUpdateControl { cancelled: Mutex, - completed: Mutex>, + completed: Mutex>, +} + +#[derive(Clone)] +enum Completed { + Result(GroupUpdateResult), + Fetch(FetchProgress), +} + +#[derive(Clone)] +pub(super) struct FetchProgress { + pub before: Arc>, + pub succeeded: usize, + pub total: usize, + pub failures: Vec, } impl GroupUpdateControl { @@ -25,14 +39,38 @@ impl GroupUpdateControl { let completed = self .completed .lock() - .map_err(|_| AppError::other("Group results lock poisoned"))?; - Ok(completed - .iter() - .map(|(path, result)| GroupUpdateReceipt { - path: path.clone(), - result: result.clone(), + .map_err(|_| AppError::other("Group results lock poisoned"))? + .clone(); + completed + .into_iter() + .map(|(path, completed)| { + let result = match completed { + Completed::Result(result) => result, + Completed::Fetch(progress) => { + super::remote::fetch_progress_result(&path, &progress, true)? + } + }; + Ok(GroupUpdateReceipt { path, result }) + }) + .collect() + } + + pub(super) fn record_fetch(&self, path: &str, progress: FetchProgress) -> AppResult<()> { + self.completed + .lock() + .map_err(|_| AppError::other("Group results lock poisoned"))? + .insert(path.into(), Completed::Fetch(progress)); + Ok(()) + } + + pub(super) fn fetch_progress(&self, path: &str) -> Option { + self.completed + .lock() + .ok() + .and_then(|completed| match completed.get(path) { + Some(Completed::Fetch(progress)) => Some(progress.clone()), + _ => None, }) - .collect()) } pub fn with_active_result( @@ -53,7 +91,7 @@ impl GroupUpdateControl { self.completed .lock() .map_err(|_| AppError::other("Group results lock poisoned"))? - .insert(path.into(), receipt); + .insert(path.into(), Completed::Result(receipt)); result }) } @@ -72,7 +110,7 @@ impl GroupUpdateControl { .unwrap_or(true) } - pub fn with_active(&self, action: impl FnOnce() -> AppResult) -> AppResult { + fn active_guard(&self) -> AppResult> { let cancelled = self .cancelled .lock() @@ -80,6 +118,16 @@ impl GroupUpdateControl { if *cancelled { return Err(AppError::other("Group update cancelled")); } + Ok(cancelled) + } + + pub fn ensure_active(&self) -> AppResult<()> { + drop(self.active_guard()?); + Ok(()) + } + + pub fn with_active(&self, action: impl FnOnce() -> AppResult) -> AppResult { + let _guard = self.active_guard()?; action() } } diff --git a/apps/desktop/src-tauri/src/core/remote.rs b/apps/desktop/src-tauri/src/core/remote.rs index 820e82f6..a5832ce1 100644 --- a/apps/desktop/src-tauri/src/core/remote.rs +++ b/apps/desktop/src-tauri/src/core/remote.rs @@ -2,7 +2,7 @@ use std::cell::RefCell; use std::collections::{HashMap, HashSet}; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; -use std::sync::{Mutex, OnceLock, RwLock}; +use std::sync::{Arc, Mutex, OnceLock, RwLock}; use git2::{ build::CheckoutBuilder, AutotagOption, Cred, CredentialType, FetchOptions, PushOptions, @@ -11,7 +11,7 @@ use git2::{ use crate::error::{AppError, AppResult}; -use super::group_update::GroupUpdateControl; +use super::group_update::{FetchProgress, GroupUpdateControl}; use super::types::{GeneratedKey, GroupUpdateResult, OpOutcome, RefMovement, RemoteInfo}; static CREDENTIAL_PREFS: OnceLock> = OnceLock::new(); @@ -488,7 +488,7 @@ fn group_update_inner( pull: bool, control: &GroupUpdateControl, ) -> AppResult { - control.with_active(|| Ok(()))?; + control.ensure_active()?; if !Path::new(path).is_dir() { return Ok(GroupUpdateResult { status: "skipped".into(), @@ -507,54 +507,35 @@ fn group_update_inner( if names.is_empty() { return Ok(result("skipped", "No remotes configured".into())); } - let before = fetched_refs(&repo)?; - let mut failures = Vec::new(); - let mut succeeded = 0; + let mut progress = FetchProgress { + before: Arc::new(fetched_refs(&repo)?), + succeeded: 0, + total: names.len(), + failures: Vec::new(), + }; for name in &names { if control.is_cancelled() { break; } - match group_fetch( - path, - name, - control, - None, - Some((&before, succeeded + 1, names.len())), - ) { - Ok(()) => succeeded += 1, - Err(error) => failures.push(format!("{name}: {error}")), + match group_fetch(path, name, control, None, Some(&progress)) { + Ok(_) => progress.succeeded += 1, + Err(error) => { + if !control.is_cancelled() { + progress.failures.push(format!("{name}: {error}")); + } + } } - } - let changes = ref_movements(&repo, &before)?; - return Ok(GroupUpdateResult { - status: if succeeded == names.len() { - "ok" - } else if succeeded > 0 { - "partial" - } else if control.is_cancelled() { - "cancelled" - } else { - "failed" + if control.is_cancelled() { + if let Some(saved) = control.fetch_progress(path) { + progress = saved; + } + break; } - .into(), - message: if control.is_cancelled() && succeeded < names.len() { - format!( - "Fetched {succeeded} of {} remotes before cancellation; completed updates kept", - names.len() - ) - } else if failures.is_empty() { - format!("Fetched {} remote(s)", names.len()) - } else { - format!( - "Fetched {} of {} remotes. Failed: {}", - succeeded, - names.len(), - failures.join("; ") - ) - }, - changes, - }); + control.record_fetch(path, progress.clone())?; + } + return fetch_progress_result(path, &progress, control.is_cancelled()); } + if repo.is_bare() { return Ok(result( "skipped", @@ -582,10 +563,10 @@ fn group_update_inner( .ok_or_else(|| AppError::other("Invalid HEAD name"))? .to_string(); let branch_name = head.shorthand().unwrap_or(&refname).to_string(); - let upstream_ref = match repo.branch_upstream_name(&refname) { + let merge_ref = match repo.branch_upstream_merge(&refname) { Ok(name) => name .as_str() - .ok_or_else(|| AppError::other("Invalid upstream name"))? + .ok_or_else(|| AppError::other("Invalid upstream merge ref"))? .to_string(), Err(error) if error.code() == git2::ErrorCode::NotFound => { return Ok(result( @@ -595,41 +576,76 @@ fn group_update_inner( } Err(error) => return Err(error.into()), }; - let remote = repo.branch_upstream_remote(&refname)?; + let remote = match repo.branch_upstream_remote(&refname) { + Ok(remote) => remote, + Err(error) if error.code() == git2::ErrorCode::NotFound => { + return Ok(result( + "skipped", + format!("{branch_name} has no upstream configured"), + )); + } + Err(error) => return Err(error.into()), + }; let remote = remote .as_str() .ok_or_else(|| AppError::other("Invalid upstream remote"))?; + let upstream_ref = if remote == "." { + merge_ref.clone() + } else { + match repo.find_remote(remote) { + Ok(_) => repo + .branch_upstream_name(&refname)? + .as_str() + .ok_or_else(|| AppError::other("Invalid upstream name"))? + .to_string(), + Err(error) + if matches!( + error.code(), + git2::ErrorCode::NotFound | git2::ErrorCode::InvalidSpec + ) => + { + merge_ref.clone() + } + Err(error) => return Err(error.into()), + } + }; let old = head.peel_to_commit()?.id(); - if remote != "." { - let merge_ref = repo - .config()? - .get_string(&format!("branch.{branch_name}.merge"))?; - if let Err(error) = group_fetch( + let fetched = if remote != "." { + match group_fetch( path, remote, control, Some((&merge_ref, &upstream_ref)), None, ) { - if matches!(&error, AppError::Git(error) if error.code() == git2::ErrorCode::NotFound) { + Ok(oid) => oid, + Err(error) => { + if matches!(&error, AppError::Git(error) if error.code() == git2::ErrorCode::NotFound) + { + return Ok(result( + "skipped", + format!("Configured upstream {upstream_ref} is missing on remote {remote}"), + )); + } + return Err(error); + } + } + } else { + None + }; + control.ensure_active()?; + let target = match fetched { + Some(oid) => repo.find_commit(oid)?, + None => match repo.find_reference(&upstream_ref) { + Ok(reference) => reference.peel_to_commit()?, + Err(error) if error.code() == git2::ErrorCode::NotFound => { return Ok(result( "skipped", - format!("Configured upstream {upstream_ref} is missing on remote {remote}"), + format!("Configured upstream {upstream_ref} is missing after fetch"), )); } - return Err(error); - } - } - control.with_active(|| Ok(()))?; - let target = match repo.find_reference(&upstream_ref) { - Ok(reference) => reference.peel_to_commit()?, - Err(error) if error.code() == git2::ErrorCode::NotFound => { - return Ok(result( - "skipped", - format!("Configured upstream {upstream_ref} is missing after fetch"), - )); - } - Err(error) => return Err(error.into()), + Err(error) => return Err(error.into()), + }, }; let new = target.id(); let (ahead, behind) = repo.graph_ahead_behind(old, new)?; @@ -698,12 +714,33 @@ fn group_fetch( name: &str, control: &GroupUpdateControl, upstream: Option<(&str, &str)>, - progress: Option<(&HashMap, usize, usize)>, -) -> AppResult<()> { - control.with_active(|| Ok(()))?; + progress: Option<&FetchProgress>, +) -> AppResult> { + control.ensure_active()?; let repo = super::repo::open(path)?; prime_account_bindings(Some(&repo)); - let mut remote = repo.find_remote(name)?; + let (mut remote, anonymous) = match repo.find_remote(name) { + Ok(remote) => (remote, false), + Err(error) + if matches!( + error.code(), + git2::ErrorCode::NotFound | git2::ErrorCode::InvalidSpec + ) && upstream.is_some() => + { + (repo.remote_anonymous(name)?, true) + } + Err(error) => return Err(error.into()), + }; + static NEXT_FETCH: AtomicUsize = AtomicUsize::new(0); + let temporary = anonymous.then(|| { + format!( + "refs/angkorgit/group-pull/{}-{}", + std::process::id(), + NEXT_FETCH.fetch_add(1, Ordering::Relaxed) + ) + }); + let upstream = + upstream.map(|(source, target)| (source, temporary.as_deref().unwrap_or(target))); let mut callbacks = make_callbacks(); callbacks.transfer_progress(|_| !control.is_cancelled()); callbacks.sideband_progress(|_| !control.is_cancelled()); @@ -715,7 +752,7 @@ fn group_fetch( .collect(); remote.download(&refspecs, Some(&mut options))?; remote.disconnect()?; - let mut apply = || { + let mut apply = || -> AppResult<()> { let received = AtomicBool::new(upstream.is_none()); let mut updates = RemoteCallbacks::new(); updates.update_tips(|name, _, _| { @@ -738,34 +775,81 @@ fn group_fetch( ) .into()); } - let config = repo.config()?; - let prune = match config.get_bool(&format!("remote.{name}.prune")) { - Ok(prune) => prune, - Err(error) if error.code() == git2::ErrorCode::NotFound => { - config.get_bool("fetch.prune").unwrap_or(false) + if !anonymous { + let config = repo.config()?; + let prune = match config.get_bool(&format!("remote.{name}.prune")) { + Ok(prune) => prune, + Err(error) if error.code() == git2::ErrorCode::NotFound => { + config.get_bool("fetch.prune").unwrap_or(false) + } + Err(error) => return Err(error.into()), + }; + if prune { + remote.prune(None)?; } - Err(error) => return Err(error.into()), - }; - if prune { - remote.prune(None)?; } Ok(()) }; - match progress { - Some((before, succeeded, total)) => control - .with_active_result(path, || { - apply()?; - Ok(GroupUpdateResult { - status: if succeeded == total { "ok" } else { "partial" }.into(), - message: format!( - "Fetched {succeeded} of {total} remotes; completed updates kept" - ), - changes: ref_movements(&repo, before)?, - }) - }) - .map(|_| ()), - None => control.with_active(apply), + control.with_active(|| { + let applied = apply(); + let oid = upstream.and_then(|(_, target)| { + repo.find_reference(target) + .ok() + .and_then(|reference| reference.target()) + }); + if let Some(temporary) = &temporary { + match repo.find_reference(temporary) { + Ok(mut reference) => reference.delete()?, + Err(error) if error.code() == git2::ErrorCode::NotFound => {} + Err(error) => return Err(error.into()), + } + } + if let Some(progress) = progress { + let mut progress = progress.clone(); + match &applied { + Ok(()) => progress.succeeded += 1, + Err(error) => progress.failures.push(format!("{name}: {error}")), + } + control.record_fetch(path, progress)?; + } + applied?; + Ok(oid) + }) +} + +pub(super) fn fetch_progress_result( + path: &str, + progress: &FetchProgress, + cancelled: bool, +) -> AppResult { + let repo = super::repo::open(path)?; + let changes = ref_movements(&repo, &progress.before)?; + let status = if progress.succeeded == progress.total { + "ok" + } else if progress.succeeded > 0 || !changes.is_empty() { + "partial" + } else if !progress.failures.is_empty() { + "failed" + } else if cancelled { + "cancelled" + } else { + "failed" + }; + let mut message = format!( + "Fetched {} of {} remotes", + progress.succeeded, progress.total + ); + if cancelled && progress.succeeded < progress.total { + message.push_str(" before cancellation"); } + if !progress.failures.is_empty() { + message.push_str(&format!(". Failed: {}", progress.failures.join("; "))); + } + Ok(GroupUpdateResult { + status: status.into(), + message, + changes, + }) } fn ref_movements( diff --git a/apps/desktop/src-tauri/tests/git_engine.rs b/apps/desktop/src-tauri/tests/git_engine.rs index 3d56298c..c72b8d26 100644 --- a/apps/desktop/src-tauri/tests/git_engine.rs +++ b/apps/desktop/src-tauri/tests/git_engine.rs @@ -3322,7 +3322,9 @@ fn group_cancel_prevents_all_future_updates() { local.write("a.txt", "base\n"); let old = commit_all(&local, "base"); let control = core::GroupUpdateControl::default(); + control.ensure_active().unwrap(); control.cancel().unwrap(); + assert!(control.ensure_active().is_err()); assert!(control .with_active::<()>(|| panic!("cancelled action must not run")) .is_err()); @@ -3550,37 +3552,10 @@ fn group_cancel_reports_a_completed_checkout_before_acknowledging() { local.write("a.txt", "updated\n"); let new = commit_all(&local, "updated"); core::push(local.path(), "origin", None, false, false, true).unwrap(); - let control = std::sync::Arc::new(core::GroupUpdateControl::default()); - let worker_control = control.clone(); - let path = other.path().to_string(); - let (written_tx, written_rx) = std::sync::mpsc::channel(); - let (release_tx, release_rx) = std::sync::mpsc::channel(); - let worker = std::thread::spawn(move || { - worker_control.with_active_result(&path, || { - let result = core::group_update(&path, true)?; - written_tx.send(()).unwrap(); - release_rx - .recv_timeout(std::time::Duration::from_secs(5)) - .unwrap(); - Ok(result) - }) - }); - written_rx - .recv_timeout(std::time::Duration::from_secs(5)) - .unwrap(); - let cancel_control = control.clone(); - let (cancel_tx, cancel_rx) = std::sync::mpsc::channel(); - let cancel = std::thread::spawn(move || { - cancel_tx.send(()).unwrap(); - cancel_control.cancel_results().unwrap() - }); - cancel_rx - .recv_timeout(std::time::Duration::from_secs(5)) - .unwrap(); - assert!(!cancel.is_finished()); - release_tx.send(()).unwrap(); - assert_eq!(worker.join().unwrap().unwrap().status, "ok"); - let receipts = cancel.join().unwrap(); + let control = core::GroupUpdateControl::default(); + let outcome = core::group_update_controlled(other.path(), true, &control).unwrap(); + assert_eq!(outcome.status, "ok"); + let receipts = control.cancel_results().unwrap(); assert_eq!(receipts.len(), 1); assert_eq!(receipts[0].path, other.path()); assert_eq!(receipts[0].result.status, "ok"); @@ -3596,3 +3571,155 @@ fn group_cancel_reports_a_completed_checkout_before_acknowledging() { assert!(control.is_cancelled()); std::fs::remove_dir_all(origin).unwrap(); } + +#[test] +fn group_pull_accepts_url_upstreams_without_leaving_temporary_refs() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "url-upstream"); + core::branch_create(other.path(), "work/topic", None, true).unwrap(); + core::set_config( + Some(other.path()), + "branch.work/topic.merge", + "refs/heads/master", + false, + ) + .unwrap(); + let url = format!("file://{}", origin.display()); + core::set_config(Some(other.path()), "branch.work/topic.remote", &url, false).unwrap(); + local.write("a.txt", "updated\n"); + let new = commit_all(&local, "updated"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let outcome = core::group_update(other.path(), true).unwrap(); + assert_eq!(outcome.status, "ok", "{}", outcome.message); + assert_eq!(other.read("a.txt"), "updated\n"); + let repo = git2::Repository::open(other.path()).unwrap(); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), new); + assert_eq!( + repo.config() + .unwrap() + .get_string("branch.work/topic.remote") + .unwrap(), + url + ); + assert!(repo + .references_glob("refs/angkorgit/group-pull/*") + .unwrap() + .next() + .is_none()); + assert_eq!( + core::group_update(other.path(), true).unwrap().status, + "up_to_date" + ); + core::set_config( + Some(other.path()), + "branch.work/topic.remote", + origin.to_str().unwrap(), + false, + ) + .unwrap(); + assert_eq!( + core::group_update(other.path(), true).unwrap().status, + "up_to_date" + ); + git2::Repository::open_bare(&origin) + .unwrap() + .find_reference("refs/heads/master") + .unwrap() + .delete() + .unwrap(); + assert_eq!( + core::group_update(other.path(), true).unwrap().status, + "skipped" + ); + assert!(repo + .references_glob("refs/angkorgit/group-pull/*") + .unwrap() + .next() + .is_none()); + std::fs::remove_dir_all(origin).unwrap(); +} + +#[test] +fn group_fetch_cancel_receipts_keep_successful_remotes_and_prior_errors() { + for successful in [true, false] { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "cancel-partial"); + git2::Repository::open(other.path()) + .unwrap() + .remote_delete("origin") + .unwrap(); + if successful { + core::remote_add(other.path(), "a-good", origin.to_str().unwrap()).unwrap(); + } + core::remote_add( + other.path(), + "b-error", + if successful { + origin.to_str().unwrap() + } else { + "/nonexistent/angkorgit-remote.git" + }, + ) + .unwrap(); + if successful { + core::set_config(Some(other.path()), "remote.b-error.prune", "invalid", false).unwrap(); + } + let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap(); + core::remote_add( + other.path(), + "c-stalled", + &format!("http://{}/repo.git", listener.local_addr().unwrap()), + ) + .unwrap(); + let (accepted_tx, accepted_rx) = std::sync::mpsc::channel(); + let (release_tx, release_rx) = std::sync::mpsc::channel(); + let server = std::thread::spawn(move || { + let (socket, _) = listener.accept().unwrap(); + drop(listener); + accepted_tx.send(()).unwrap(); + release_rx + .recv_timeout(std::time::Duration::from_secs(10)) + .unwrap(); + drop(socket); + }); + let control = std::sync::Arc::new(core::GroupUpdateControl::default()); + let worker_control = control.clone(); + let path = other.path().to_string(); + let worker = std::thread::spawn(move || { + core::group_update_controlled(&path, false, &worker_control) + }); + accepted_rx + .recv_timeout(std::time::Duration::from_secs(5)) + .unwrap(); + let start = std::time::Instant::now(); + let receipts = control.cancel_results().unwrap(); + assert!(start.elapsed() < std::time::Duration::from_secs(1)); + assert!(!worker.is_finished()); + assert_eq!(receipts.len(), 1); + let result = &receipts[0].result; + assert_eq!(result.status, if successful { "partial" } else { "failed" }); + assert!(result.message.contains("b-error"), "{}", result.message); + assert!(result.message.contains("before cancellation")); + assert_eq!( + result + .changes + .iter() + .any(|change| change.name == "refs/remotes/a-good/master"), + successful + ); + release_tx.send(()).unwrap(); + server.join().unwrap(); + let outcome = worker.join().unwrap().unwrap(); + assert_eq!(outcome.status, result.status); + assert_eq!(outcome.message, result.message); + std::fs::remove_dir_all(origin).unwrap(); + } +} diff --git a/apps/desktop/src/features/repository/GroupUpdateDialog.tsx b/apps/desktop/src/features/repository/GroupUpdateDialog.tsx index 52af49b2..c83ba415 100644 --- a/apps/desktop/src/features/repository/GroupUpdateDialog.tsx +++ b/apps/desktop/src/features/repository/GroupUpdateDialog.tsx @@ -32,7 +32,7 @@ export function GroupUpdateDialog({ progress, onClose, onCancel }: { const counts: Record = { updated: 0, unchanged: 0, skipped: 0, failed: 0, partial: 0, cancelled: 0 }; for (const result of results) counts[classify(result)]++; const labels: Record = { - updated: 'Updated', unchanged: pull ? 'Up to date' : 'Fetched', skipped: 'Skipped', + updated: 'Updated', unchanged: pull ? 'Up to date' : 'Unchanged', skipped: 'Skipped', failed: 'Failed', partial: 'Partial', cancelled: 'Cancelled', }; const tones: Record = { diff --git a/apps/desktop/src/features/repository/groupUpdate.ts b/apps/desktop/src/features/repository/groupUpdate.ts index 00936c64..a4698397 100644 --- a/apps/desktop/src/features/repository/groupUpdate.ts +++ b/apps/desktop/src/features/repository/groupUpdate.ts @@ -22,20 +22,23 @@ export async function updateGroupRepositories( completedOnCancel: () => ReadonlyMap = () => new Map(), ): Promise { for (const repo of repos) { - const cancelled: GroupUpdateResult = { status: 'cancelled', message: 'Cancelled; completed updates are kept', changes: [] }; + const cancelled: GroupUpdateResult = { status: 'cancelled', message: 'Cancelled before this repository started', changes: [] }; if (signal?.aborted) { onResult({ ...(completedOnCancel().get(repo.path) ?? cancelled), repo }); continue; } + let started = false; const pending = Promise.resolve().then(() => { if (signal?.aborted) return cancelled; + started = true; return update(repo.path); }).catch((error): GroupUpdateResult => ({ status: 'failed', message: (error as { message?: string })?.message ?? String(error), changes: [], })); + const interrupted = { ...cancelled, message: 'Cancelled before completing this repository' }; let onAbort: (() => void) | undefined; const aborted = new Promise((resolve) => { - onAbort = () => resolve(completedOnCancel().get(repo.path) ?? cancelled); + onAbort = () => resolve(completedOnCancel().get(repo.path) ?? (started ? interrupted : cancelled)); signal?.addEventListener('abort', onAbort, { once: true }); if (signal?.aborted) onAbort(); }); diff --git a/docs/assets/group-update-cancel-summary.png b/docs/assets/group-update-cancel-summary.png index bab38d667dc2a1403e23504517e196d106bc44e3..0aed2ab779799638d6d98edcc59460f5c2be14d8 100644 GIT binary patch literal 118483 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 literal 112678 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

VN(KH&kzeo?v$o%ebVhshmB20 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 diff --git a/tests/e2e/smoke.spec.ts b/tests/e2e/smoke.spec.ts index c5f22580..2f936caa 100644 --- a/tests/e2e/smoke.spec.ts +++ b/tests/e2e/smoke.spec.ts @@ -3122,13 +3122,14 @@ test('group fetch classifies partial failures once and cancellation releases a h const [{ ipc }, { useSettings }, { useRepo }] = await Promise.all([ import('/src/core/ipc.ts'), import('/src/features/settings/store.ts'), import('/src/features/repository/store.ts'), ]); - const repos = ['partial', 'slow', 'remaining'].map((name) => ({ path: `/projects/${name}`, name, lastOpenedAt: 0 })); + const repos = ['unchanged', 'partial', 'slow', 'remaining'].map((name) => ({ path: `/projects/${name}`, name, lastOpenedAt: 0 })); useRepo.setState({ recents: repos }); useSettings.getState().addRepoGroup('Projects', 0, repos.map((r) => r.path)); const tracker = window as unknown as { __groupCalls: string[]; __finishGroup: () => void }; tracker.__groupCalls = []; ipc.groupUpdate = async (path) => { tracker.__groupCalls.push(path); + if (path.endsWith('/unchanged')) return { status: 'ok', message: 'Fetched origin without ref changes', changes: [] }; if (path.endsWith('/partial')) return { status: 'partial', message: 'origin fetched; backup authentication failed', changes: [{ name: 'origin/main', oldOid: '1234567890', newOid: 'abcdef0123', commits: 2 }], @@ -3140,7 +3141,8 @@ test('group fetch classifies partial failures once and cancellation releases a h await page.getByRole('menuitem', { name: 'Fetch all', exact: true }).click(); const dialog = page.getByRole('dialog'); await expect(dialog).toContainText('Partial'); - await expect(dialog.getByRole('status')).toContainText('0 updated · 0 unchanged · 0 skipped · 0 failed · 1 partial'); + await expect(dialog.getByText('Unchanged', { exact: true })).toBeVisible(); + await expect(dialog.getByRole('status')).toContainText('0 updated · 1 unchanged · 0 skipped · 0 failed · 1 partial'); await dialog.getByRole('button', { name: 'Cancel run', exact: true }).click(); await expect(dialog.getByRole('button', { name: 'Done', exact: true })).toBeEnabled(); await expect(dialog.getByRole('status')).toContainText('1 partial · 2 cancelled'); @@ -3149,7 +3151,7 @@ test('group fetch classifies partial failures once and cancellation releases a h const { useRepo } = await import('/src/features/repository/store.ts'); if (useRepo.getState().busy !== null) throw new Error('Cancellation kept the app busy'); const tracker = window as unknown as { __groupCalls: string[] }; - if (tracker.__groupCalls.join(',') !== '/projects/partial,/projects/slow') throw new Error('Started a repository after cancellation'); + if (tracker.__groupCalls.join(',') !== '/projects/unchanged,/projects/partial,/projects/slow') throw new Error('Started a repository after cancellation'); }); await dialog.getByRole('button', { name: 'Done', exact: true }).click(); await expect(dialog).toBeHidden(); diff --git a/tests/unit/groupUpdate.test.ts b/tests/unit/groupUpdate.test.ts index da02db4b..2582f879 100644 --- a/tests/unit/groupUpdate.test.ts +++ b/tests/unit/groupUpdate.test.ts @@ -42,6 +42,7 @@ it.each(['resolve', 'reject'] as const)('cancels a hanging operation and ignores await run; expect(update).toHaveBeenCalledTimes(1); expect(results.map((r) => r.status)).toEqual(['cancelled', 'cancelled']); + expect(results.map((r) => r.message)).toEqual(['Cancelled before completing this repository', 'Cancelled before this repository started']); if (late === 'resolve') finish({ repo: repos[0], status: 'ok', message: 'Late response', changes: [] }); else fail(new Error('Group update is no longer active')); await pending.catch(() => undefined); @@ -75,6 +76,7 @@ it('does not start any operation when already cancelled', async () => { await updateGroupRepositories([{ name: 'repo', path: '/repo', lastOpenedAt: 0 }], update, (r) => results.push(r), controller.signal); expect(update).not.toHaveBeenCalled(); expect(results[0].status).toBe('cancelled'); + expect(results[0].message).toBe('Cancelled before this repository started'); }); it('delivers one cancellation when aborted before the pending microtask starts', async () => { @@ -88,4 +90,5 @@ it('delivers one cancellation when aborted before the pending microtask starts', expect(update).not.toHaveBeenCalled(); expect(onResult).toHaveBeenCalledTimes(1); expect(onResult.mock.calls[0][0].status).toBe('cancelled'); + expect(onResult.mock.calls[0][0].message).toBe('Cancelled before this repository started'); }); From 32eb84d004d563138832f8a55f3edd99c39d4b9c Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Tue, 13 Oct 2026 18:37:29 +0200 Subject: [PATCH 08/10] fix: handle unmapped upstreams and isolate cancel receipt errors --- CHANGELOG.md | 4 +- CLAUDE.md | 9 +- .../src-tauri/src/core/group_update.rs | 26 ++- apps/desktop/src-tauri/src/core/remote.rs | 75 +++++---- apps/desktop/src-tauri/tests/git_engine.rs | 151 +++++++++++++++++- 5 files changed, 229 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb9cc611..63443f14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,9 @@ All notable changes to AngKorGit are documented here. The format follows result when cancelling; settled summary rows ignore late responses and errors. URL-based upstreams are supported. Fetch cancellation keeps successful remotes and errors together, with ref summaries calculated outside the write guard; queued - repositories say they never started, and unchanged fetch badges match the counts. (#69) + repositories say they never started, and unchanged fetch badges match the counts. + Pull also handles upstreams outside a remote's fetch refspec. Cancellation preserves + completed results if one repository's ref summary becomes unavailable. (#69) ## [0.23.0] — 2026-10-13 diff --git a/CLAUDE.md b/CLAUDE.md index 5b000fc8..cfdd9274 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1084,6 +1084,13 @@ features/ │ │ ref can be restored), fetching the exact configured merge ref │ │ into that tracking ref, requiring its update callback (with │ │ REPORT_UNCHANGED) so stale refs never hide a deleted upstream. +│ │ Named upstreams outside the remote fetch refspec also use a temporary +│ │ destination, fetching the exact merge source without changing fetch +│ │ configuration or overwriting existing tracking refs. One repository +│ │ handle serves all remotes and the final ref summary. Cancellation +│ │ builds receipts independently: if ref inspection fails, it retains +│ │ fetch counts and prior errors with a diagnostic on that row, while +│ │ preserving every other completed receipt and acknowledging Cancel. │ │ URL/path upstreams use anonymous remotes and a unique temporary │ │ refs/angkorgit/group-pull ref; its OID is captured and the ref deleted │ │ in the same guarded write phase, without changing branch config. @@ -3616,7 +3623,7 @@ update CLAUDE.md or docs/ — never the code. | Suite | Location | Coverage | | --- | --- | --- | -| Rust integration (107) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | +| Rust integration (109) | `apps/desktop/src-tauri/tests/git_engine.rs` | stage/commit/history, amend, branch/merge(ff+normal+conflict+message), branch-over-tag ref resolution (merge/rebase/history filter), ff-merge preserving uncommitted changes, drag-merge sequence (checkout target → merge source), no-ff merge commit when ff possible, can-fast-forward only when strictly behind, merge message available only during conflicted merge, interactive rebase (reorder/drop + range listing, squash/reword, conflict aborts untouched, invalid-plan rejection), file history lists only touching commits + paginates with skip, conflict resolve, stash (whole tree + selected paths incl. an untracked-only pick, a staged pick that leaves other staged files alone and pops with a dirty index, a staged-new pick removed and restored, git CLI agreeing on stash list/show; stash_files lists tracked + untracked entries with source_oid; stash_restore_files restores chosen files incl. an untracked one and a deletion, keeps the stash, rejects unknown paths), remote-branch checkout (stale local fast-forwarded with an untracked file preserved + upstream set, diverged local kept), tags, cherry-pick (plain keeps the message verbatim; record-origin output byte-equal to `git cherry-pick -x` for plain and trailer-block messages; many: in-order with per-commit origin lines, first conflict stops the run with progress counts), revert, reset (+ unknown-mode error), history pagination with and without filters, history position lookup by full + short hash, history search positions (case-insensitive text, hash prefix, none, blank, author alone, text + author, unknown author), stashes listed in the default walk as single-parent commits with a stash decoration while their index/untracked helper commits stay hidden and a branch-filtered walk omits them, broken-symlink staging (unix), diff hunks + whole-file context, unstage_all/discard_all, discard_staged_file/all (HEAD restored for index + worktree, staged-new file deleted, other staged files untouched), line+hunk ops on files without trailing newline, git-CLI interop, commit signing (SSH sign verified via `git verify-commit`, unsigned without config, amend re-signs, merge commit signed, failure blocks the commit and leaves HEAD/index untouched), PR checkout (fork-style refs/pull fetch creates + updates the local branch and re-runs cleanly, diverged local branch refused with HEAD untouched, same-repo tracking checkout sets the upstream), ref fingerprint (tracks refs/HEAD, ignores plain file edits), commit file lists (per-file counts without hunks), single-file commit diff scoped by pathspec, worktrees (add lists + checks out the branch and reports is_worktree/main_path from inside the linked folder, new branch from a base commit + duplicate refused, branch held elsewhere refused, checkout of a held branch refused with HEAD untouched, dirty remove refused unless forced, prune of a deleted folder, ref fingerprint changes on add, `git worktree list --porcelain` reports the engine-created worktree and `git status` runs clean inside it), discover refuses a missing path instead of walking to the parent repo, push reports up_to_date without contacting the remote when the tip equals the tracking ref while `git push` prints Everything up-to-date, and pushes again after a new commit, push with tags lands a local tag on a bare remote through named refspecs, pull with mode rebase / configured pull.rebase keeps history linear while mode merge creates a merge commit, blame attributes lines to their commits and marks an uncommitted edit, blames at a revision and at `^`, an uncommitted edit inside a committed block keeps the author on both split halves (the G44 crash), untracked/staged-new files and paths missing from a commit get explicit errors, staging and unstaging a later hunk of a multi-hunk file leaves the other hunk alone, remote_add registers a remote that list and fetch then use while a duplicate or blank name is refused, reword of HEAD changes only the message (tree + author lines byte-equal, dirty worktree and staged file untouched), reword of an earlier commit rewrites the commits above it and returns the reworded commit's new oid while a dirty tree is refused, unpushed lists only commits missing from every refs/remotes ref, tree_files lists every path at a commit while commit_files still lists the two changed ones, index_files lists tracked and staged-new paths but no untracked file, file_contents reads a file at a commit and on disk as context lines with status unchanged, errors for a path missing from the commit and flags a NUL-byte file binary, the folder scan finds repos at any depth and repos inside repos while skipping node_modules, hidden folders, an empty `.git` folder and anything past the runaway depth guard, returns the discover-shaped path, a root that is itself a repo plus its nested repo, and an error for a missing folder, stage_files/unstage_files apply many paths in one index write, commit refuses an index that matches HEAD (HEAD and worktree untouched) and an empty first commit while a merge resolved to HEAD's tree still commits with two parents | | Rust module (79) | `apps/desktop/src-tauri/src/cli.rs` (7), `src/state.rs` (1), `src/editors.rs` (4), `src/fonts.rs` (1), `src/ai_cli.rs` (10), `src/error.rs` (7), `src/core/remote.rs` (18), `src/terminal.rs` (3), `src/core/accounts.rs` (7), `src/core/sign.rs` (7), `src/forge.rs` (7), `src/proc.rs` (1), `src/watcher.rs` (4) | AI-CLI runner: program allowlist (incl. Cursor's `agent` and `cursor-agent` names), stdout capture via fake agent script, {OUTPUT_FILE} substitution, kill-on-timeout, Cursor version-folder keys and the .cmd launcher → newest node.exe/index.js resolution (none for other agents or a missing versions dir) · error mapping: HTTP status extraction from libgit2 messages, 401/402/403 explanations, unmapped codes kept verbatim, io NotFound → not_found while other io errors stay io · forge proxy: api-subdomain host allowlist (dot-anchored), per-provider auth headers, bitbucket email requirement, unknown provider rejected, missing-token vs no-account message · SSH key resolution: `~` expansion, configured key ordered ahead of defaults, dedupe when the configured key IS a default, blank config ignored, generation never targeting an existing key · push refspec shapes (plain/force/tags never forced) · rejection message quotes the server lines after the ref list (sideband lines trimmed, de-duplicated, "remote:" and rule lines dropped, capped at 12) · repo account-binding parse (valid/malformed) · accounts: upsert keeps both same-host accounts + default flags, one default per host, preferred-before-default candidate order, port-loose host match, ssh URLs ignored · signing config: off by default, ssh setup read from git config, empty-string values read as unset, ssh-without-key and x509 are clear errors, openpgp falls back to the committer identity, literal-key detection, ~ expansion · proc: no bare `Command::new` anywhere outside proc.rs (G31) · recents: new paths go on top in order, an existing path moves instead of duplicating, the list caps at RECENT_LIMIT · watcher: metadata filter unchanged for main repos, `worktrees/*/HEAD|gitdir|locked` relevant while `worktrees/*/index` is noise, a linked worktree watches its own gitdir + the shared commondir, main repos need no extra roots | | Unit (274) | `tests/unit/*.test.ts` | settingsFilter (AND terms, section labels, catalog coverage of every JSX card title), GraphLayout (incl. pagination stability, lane reuse), wordDiff (round-trip), conflict parse/serialize (diff3 labels, CRLF, bare markers, 8+-char content lines, close-without-separator — all lossless), cliAgents (per-agent argv/stdin shape incl. Cursor print mode with the prompt last, ANSI/OSC cleaning, output-file preference, error surfacing), aiProviders (empty/whitespace/missing content rejected for openai-compatible + ollama, HTTP status+body surfaced, real content passes), aiCapabilities (review conventions: absent by default, general-only, general+project order with precedence note, whitespace = absent, clipping), aiTextSegments (token parse: adjacent tokens, unclosed/inner-asterisk/multi-line markers stay literal, ** inside backticks is code), reviewSignature (staged-only, order-insensitive, unstaged-edit + set changes alter it, newline filenames don't collide, hashText determinism), commitStyle (prefix rule matching/tokens/ticket-fallthrough, `$`-sequence literalness, preset instructions, post-generation prefix enforcement), pullRequestUrl (https/scp/ssh remotes, non-standard ports kept, http preserved, ssh port dropped, Bitbucket Server /scm/ shape, .git-behind-slash strip, unknown forge → null), aiModels (per-provider list endpoints/headers incl. Groq-style base URLs, generateContent filtering for Gemini, dedupe/sort, invalid-JSON + HTTP-status errors, cli → empty without a request), forge (parseForgeRemote for all three forges + rejects, provider creation gating, github/gitlab/bitbucket adapters: request URLs, field mapping incl. fork + draft detection, create payloads, error-message surfacing incl. github field-level validation entries without a message, checkoutSpec shapes incl. bitbucket fork → null, pickForgeRemote upstream-first ordering, gitlab self-hosted https→http transport fallback — GET-only (a retried POST could file a duplicate MR), never for gitlab.com or api-level errors, working scheme remembered per host and safe under concurrent fallbacks, reviewer candidates per forge + reviewer ids embedded/requested on create incl. github follow-up failure tolerance, authorAvatar per forge: github commit author, gitlab avatar-by-email URL encoding, bitbucket commit author user), worktree (folder-name slug from repo + branch, sibling-path suggestion incl. Windows separators, parentDirectory), highlight (block-comment continuation: JSDoc carried and closed, line comments and glob strings not treated as open, mid-line close resumes code, xml opener, no-block-comment languages ignore the flag; embedded languages: astro on the xml grammar, svelte/toml mappings, whole-file frontmatter + script/style blocks incl. lang="ts"/"scss" and a single-line script tag, hunk walk from line 1 and mid-file back to the first fence or closer, template-only hunk marks nothing, non-markup → null), commitMessage (split/join round-trip, CRLF, second line without blank line is body, newline never enters the summary), fileFilter (empty/whitespace query passes all, case-insensitive substring, every term required), webUrl (https/scp/ssh:// remotes → repository page, ssh port dropped, http + web port kept, Bitbucket Server browse page, Bitbucket Cloud untouched, trailing slash, local path → null), blameable (hasCommittedHistory true for every tracked change kind, false for untracked and staged-new), imageMime (one media type per engine image extension, null otherwise), renderCap (lines at or under 5,000 chars stay whole, longer ones clip and count the hidden tail, custom cap), fork → upstream pull requests (github head `owner:branch`, gitlab GET target id then POST on the source project with target_project_id, bitbucket source.repository, forgeTargets dedupes same-host remotes and defaultForgeTarget prefers `upstream`), allFiles (tree paths marked with their change, deleted files kept, no duplicate paths, foldersWithChanges lists every ancestor of a changed file and nothing otherwise), fetchRemotes (continues after a failure and reports failures), patchText (headers + hunk headers + prefixed lines, rename old path, multi-file join, hasReviewableText rejects null/binary/image/empty), single-file review + explain prompts (file/where/sibling context lines, sibling cap at 30, section labels, conventions order, patch at the end, 4096-token budget), aiReport (labelled sections, bullet severities, continuation lines, verdict tones, unstructured fallback, bold inside a sentence is not a label), locateDiffLine (exact match prefers additions, deletion/context fallback, whitespace-insensitive whole-line hit, tiny/absent snippets null), commit review + explain prompts (commit line, file list capped at 30, conventions, patch at the end), terminalKeys (Alt+Up/Down map to ESC[1;3A/B on keydown only, every other modifier/key/phase left to xterm), chord (key from event.code so ⌥A stays A, unsupported keys null, id round-trip, exact modifier match, per-platform labels, no-modifier/reserved problems per platform, repoForChord lookup), repoGroups (empty/duplicate names ignoring case and the renamed group, least-used colour with wrap, recents bucketed in order with the rest ungrouped, a deleted group's paths fall back to ungrouped while empty groups stay listed, worktree inherits its main's group unless mapped itself, tabClusters/orderRepoTabs cluster open tabs by group with ungrouped last and leave a group-less strip alone, moveRepoGroup places a group before or after another and ignores self or unknown targets), tabLabels (unique names get no hint, nearest distinguishing parent folder, walks further up when parents collide, case-insensitive names and Windows separators), linePairs + pairHunk (the issue #62 hunk, single replacement always one row, comment block before a rewritten line, dissimilar deletion unpaired, pure runs unchanged, positional fallback past the cap, identical lines anchor, the demo load hunk; lineSimilarity ignores punctuation and repeats and compares symbol-only lines by text), remotes (pickRemote upstream → origin → first, pushSetsUpstream only for no upstream or the same remote) | | E2E (117) | `tests/e2e/smoke.spec.ts` | folder rows in the working-copy tree stage and unstage everything inside them (one engine call each, chevron still folds, indeterminate in All files), stepping with n / the header chevron / p marks the active change rows and counts "k of n changes" in inline, split and wrapped views, View options stays open across two toggles, Settings filter (autofocus, SSH-only, first catalog hit across sections, locate flash, section-label match, no results, Escape clears then closes, close resets, AI section preset), splash→welcome, the AI chip names Ollama on the demo defaults, reads Set up AI when the CLI provider has no agent, Claude Code once picked, turns ok after Test connection, stale when the provider changes back to Ollama, and survives a reload, Blame is disabled in the file menu and the diff header for the untracked demo file while a tracked file keeps it enabled, the remote row menu's Open in browser opens the demo remote's GitHub page in a popup and the palette lists Open repository in browser, the sidebar and graph branch menus carry a fast-forward entry next to merge that is disabled while the current branch is ahead, settings installs the command line tool, settings lists the demo editors and picking Zed relabels the toolbar button and its menu, the Pull options menu offers merge and rebase, the status bar reports Fetched just now after the auto fetch, retries every remote after a partial auto fetch failure, keeps the timestamp and faint failed remote hint through partial and offline fetches, updates the timestamp on Pull, and explains the disabled Fetch button when no remotes exist, the diff header's Blame button opens file history in the blame pane with the Working copy row selected, per-hunk author buttons and an uncommitted hunk that disappears when a commit row is picked, a Blame at this commit menu, the Diff view toggle brings the diff controls back and Escape returns to the graph, the palette's Blame… picks a file and opens its blame pane, open repo, graph, inspector, palette, search, conflict resolver line picks, single-conflict nav + per-conflict take-all, per-block conflict hand edit, interactive rebase dialog + multi-select squash, cherry-pick dialog with the source-reference checkbox on by default, multi-select cherry-pick listing both commits and confirming, diff auto-jump lands at the first change with no scroll animation (frame-traced scrollTop), long path stays inside the discard confirm dialog, commit action buttons stay inside a narrow working copy panel (the row wraps), sidebar branch names align with and without the HEAD tick (measured left offsets), hovering a working-copy file reveals its full path, opening a diff folds the sidebar away and the toggle brings back the graph, avatars stay visible after a diff open/close round-trip (stubbed Gravatar), diff text selection survives the right-click copy menu and Esc closes only the menu, sidebar lists the demo pull requests and the create dialog opens, reconnecting an account opens the prefilled token form with focus in the token field, a file history row's Open commit button closes the panel and selects that commit in the graph, the author box finds commits with the graph lanes intact and combines with the text search, commit search finds matches in the full graph (n of m pill, Enter/Previous step, query survives selecting another commit, Escape clears), a search result that lands after a click keeps the clicked commit selected while clicking a match moves the pill to 2 of n and Enter steps to 3, searching a commit hash jumps to it in the full graph, a short hash prefix jumps too while an unknown hex word says No matches, a missing hash keeps the graph with No matches, mod+f focuses the commit search, sidebar lists the demo worktrees (incl. a missing-folder row) and the new-worktree dialog re-suggests the folder as the branch name is typed, the inner line of a JSDoc block in the demo CommitGraph.tsx diff renders as one hljs-comment span (guards the DiffViewer → prepareCommentStates wiring, which the unit tests cannot see), collapse-all folds every section and branch folder and a reopened section comes back with its folders closed, the inspector keeps its width (±1px) when a diff folds the sidebar away and both widths return on Escape (measured via data-panel-id after dragging the sidebar handle), the commit box renders the summary larger and bolder than the description with Enter/Backspace moving between them and commit disabled on an empty summary, dragging the commit box's top edge grows the description and double-click resets it, the Changes header's fold button collapses that list's folders (nested file hidden) and flips to expand-all, and no fold button exists in flat mode, the top graph row shows a whole `main` chip with no HEAD chip and no clipped chip text plus a 7-char hash copy button, the graph display menu hides the hash column and brings it back, the sidebar accordion pins collapsed headers at the bottom under an open Branches section and moves the Tags header up when Tags opens, the welcome page flags the demo's missing folder and opens a repository via ↓ + ⏎ from the autofocused search, the conflict resolver renders positive integer line numbers in A, B and Result with each starting at 1, the checked-out branch chip is opaque while another local branch's chip stays translucent, double-clicking the separated `origin/main` chip opens the reset prompt naming the 2 commits that would be lost and Cancel dismisses it (the demo repo puts origin/main 2 commits behind main so the split is real), the diff header's History button opens that same file's history panel and closes the diff, a working-copy row's "Stash this file…" opens the dialog naming that file and the toolbar pop button restores the latest demo stash, shift-click selects three working-copy rows and the bulk menu offers Stage 3 / Stash 3 files, the working-copy filter hides non-matching rows with "1 of 2" counts and the clear button restores them, the commit file filter narrows five demo files to one and Escape resets it, selecting the demo stash shows the stash hint and the hover restore button on a file toasts the restore, right-clicking a plain commit's file offers File history / Show in Finder / Copy path and no stash Apply entry, staged rows offer discard from the row, the menu and the header trash icon, the sidebar is visible again after a reload that happened with a diff open, the demo stash renders as a graph row with an Archive node and a dashed chip whose menu pops it, ↓ then → opens the second commit's first file with the file list focused, ↓/↑ walk files, twelve → presses stay on the same file and one ← returns to the graph on the same commit, the Graph display menu's "Lane color band" removes and restores the tail rects, the inspector stops at its minimum width when dragged and folds/returns for file history, dragging the sidebar shut and back open in one gesture shows its content again, conflict picks land in file order with a mixed-state side checkbox, the resolver picks with A/B/↑/↓ and ⌘⏎ opens the next conflicted file, leaving with picks asks first while Escape closes a clean resolver, right-clicking the main tip row offers Push main ↑2 while an inner commit's menu has no push, hovering the feature/diff-viewer chip stacks both its refs in a panel whose first chip sits on the row chip (≤2px) with the folded `release/0.4` under it, and right-clicking that one opens its Checkout menu (no reset entry for a plain local), the top row shows `main` as its visible chip although `hotfix/lane-colors` comes first in the refs and only `main` carries the check inside the stacked panel, right-clicking the separated `origin/main` chip offers "Reset main to this…" and opens the same reset dialog, clicking a working-copy file then ↓/↓/↑ moves the diff through ipc.ts → palette-seed.sql → Architecture.md and back — the Remotes header's Add remote button opens the add dialog with the button disabled until name and URL are filled, right-clicking the terminal shows Copy (disabled without a selection)/Paste/Select all/Clear terminal, Settings → Git → Clone destination remembers a chosen folder and the clone dialog's destination starts there, a four-row drag selection in the palette-seed diff stays a Range and still copies all four lines via ⌘C after its rows scroll out of the virtualizer in either direction, and reads the same text once scrolled back, the pushed demo commit opens the editor and Save asks "Rewrite a pushed commit?" (Cancel keeps the draft) while the top commit opens the inline editor on double-click (Esc cancels, Save rewrites the heading, body and graph row), the GitHub account form keeps the classic token link and adds the fine-grained page inline while the Token label still focuses the input, the Fonts card's Interface picker lists proportional fonts first and Code lists monospace first, picking Helvetica Neue/Fira Code changes --font-sans/--font-mono and the terminal follows Code until Menlo + 16 px is picked for it, all of it survives a reload and Reset fonts clears it, sidebar section headers and bodies carry no fill and no top border while each header shows a filled gold icon tile and a filled count badge, the commit Files header's A token narrows five files to one with All pressed off and back, the All files view lists Roadmap.md at the commit with 5 changed, keeps a change-free folder collapsed until clicked, opens the unchanged file with an unchanged badge and no @@ header while Folder tree hides it again, the working copy's All files view shows README.md beside the stage/unstage checkboxes of the changed files and opens it without a Stage file button, dragging a selection below the diff grows it past six lines from the start row and ⌘C copies the same text before and after scrolling away, the diff header's AI actions menu reviews the open file (busy strip → demo response under the header, Copy, fold to one line and back, full-view dialog, button disabled meanwhile, closing and reopening the diff dismisses the result) then explains it and Dismiss removes the panel, the inspector's Review with AI reviews the selected commit (Stop reviewing while busy, AI review card → demo response, Dismiss), file history's diff pane shows no change arrows on a commit that did not touch palette-seed.sql and, on the Working copy row, `n` jumps the scroller to the one change, `p` from the top wraps to it and the header's Next change button lands on the same offset, a second repo opened from the palette becomes a tab that ⌘1 / ⌘⇧] switch between (wrapping), the tab menu's Keyboard shortcut… capture box flags a bare `t` as no_modifier and ⌘K as reserved without opening the palette, saving ⌃⇧T shows the chip on the tab and the chord switches to it, and Settings → Shortcuts lists and removes it, Force push from the Push menu opens a "Force push?" confirm naming origin/main that Cancel dismisses without pushing, and repositories can be grouped on the welcome page: Add to group → New group… creates Frontend with a picked colour (Create disabled on an empty name, a duplicate name shows the taken hint), dragging a row onto the header moves it (counts 2 and 2), Enter in the name field creates Backend, the header menu's Move up puts Backend first (Move down disabled at the bottom) and Move down restores it, the header button collapses and re-expands it, searching flattens the list to the two matching rows, Open all in tabs opens both Frontend repos as tabs whose titles end in · Frontend, the tab menu's Move to group re-homes one to Backend and the strip splits into two clusters with chips, clicking the Backend chip hides its tab and shows Backend1, collapsing Frontend keeps the active tab visible, ⌘2 switches to the hidden temple-ui and reveals it, both chips expand again, the Backend chip's menu counts 1 under Close its tabs and Collapse other groups folds Frontend to Frontend1 while ⌘1 still reaches its hidden tab, Expand all groups brings both back, dragging the Backend chip onto the first cluster's left edge puts Backend first so ⌘1 reaches temple-ui and dragging it back restores Frontend, narrowing the window to 380px shows the overflow list whose temple-ui entry switches tabs and widening hides it again, no separators or overflow button exist with two tabs, the switcher lists repos under data-switcher-group labels, the palette's Close all in Backend closes its one open tab while Open all in Backend says 2 repositories, and Ungroup… confirms and leaves the repos in the list, the long-line diff scrollbar stays at the viewport bottom, pans both split panes together, accepts arrow keys and Shift+wheel, and disappears when wrapping is enabled, the code diff opened from a selected commit also scrolls horizontally in inline and split views, and a trackpad pan of one wheel event per frame moves the long-line diff by the whole gesture with no backward step, dragging the drawn thumb moves the layers by exactly the engine's scrollLeft and a click on the track pages back to 0, and a text selection dragged past the pane's right edge pans the long lines, grows the selection and stops panning when the pointer comes back, scanning ~/projects from the welcome page lists four repos with two marked In recents and disabled, unticking one adds the other to the recents list, a seeded tab whose folder is missing closes with a toast while two same-named angkorgit tabs show forks / projects hints and a unique one shows none, ⌘P on the welcome page filters four recents to temple-ui and Enter opens it as the only tab, ⌘P marks it Current and opens angkorgit as a second tab, a third ⌘P marks temple-ui Open tab and switches back without a new tab, ⌘K still opens the command palette, and ⌘T opens a picked folder as a third tab, the all files layout stacks the five demo commit files with GraphRow.tsx scrolled to the top and "2 of 5", clicking Architecture.md in the inspector scrolls it to the top ("4 of 5"), side by side applies inside the cards, a user wheel at the top moves the inspector highlight to CommitGraph.tsx, one file and then all files collapse and expand, Show one file returns to DiffPanel and the choice survives a reload, clicking a file in the inspector still jumps to it after scrolling reached it once and ← inside the page returns to the graph, a stash file never offers the all files layout even with 'all' remembered while a plain commit still gets it, a click into a file diff followed by ← closes it and returns to the graph, ⌘⏎ with nothing staged toasts "Stage some changes first" and commits nothing, and a file filter that hides every staged file leaves Commit enabled with the full count — all on demo mode | diff --git a/apps/desktop/src-tauri/src/core/group_update.rs b/apps/desktop/src-tauri/src/core/group_update.rs index 8e1121a3..421afa46 100644 --- a/apps/desktop/src-tauri/src/core/group_update.rs +++ b/apps/desktop/src-tauri/src/core/group_update.rs @@ -41,18 +41,36 @@ impl GroupUpdateControl { .lock() .map_err(|_| AppError::other("Group results lock poisoned"))? .clone(); - completed + Ok(completed .into_iter() .map(|(path, completed)| { let result = match completed { Completed::Result(result) => result, Completed::Fetch(progress) => { - super::remote::fetch_progress_result(&path, &progress, true)? + match super::repo::open(&path).and_then(|repo| { + super::remote::fetch_progress_result(&repo, &progress, true) + }) { + Ok(result) => result, + Err(error) => { + let mut result = super::remote::fetch_progress_summary( + &progress, + true, + Vec::new(), + ); + if progress.succeeded > 0 { + result.status = "partial".into(); + } + result + .message + .push_str(&format!(". Could not inspect moved refs: {error}")); + result + } + } } }; - Ok(GroupUpdateReceipt { path, result }) + GroupUpdateReceipt { path, result } }) - .collect() + .collect()) } pub(super) fn record_fetch(&self, path: &str, progress: FetchProgress) -> AppResult<()> { diff --git a/apps/desktop/src-tauri/src/core/remote.rs b/apps/desktop/src-tauri/src/core/remote.rs index a5832ce1..4c30b895 100644 --- a/apps/desktop/src-tauri/src/core/remote.rs +++ b/apps/desktop/src-tauri/src/core/remote.rs @@ -517,7 +517,7 @@ fn group_update_inner( if control.is_cancelled() { break; } - match group_fetch(path, name, control, None, Some(&progress)) { + match group_fetch(&repo, path, name, control, None, Some(&progress)) { Ok(_) => progress.succeeded += 1, Err(error) => { if !control.is_cancelled() { @@ -533,7 +533,7 @@ fn group_update_inner( } control.record_fetch(path, progress.clone())?; } - return fetch_progress_result(path, &progress, control.is_cancelled()); + return fetch_progress_result(&repo, &progress, control.is_cancelled()); } if repo.is_bare() { @@ -589,33 +589,39 @@ fn group_update_inner( let remote = remote .as_str() .ok_or_else(|| AppError::other("Invalid upstream remote"))?; - let upstream_ref = if remote == "." { - merge_ref.clone() + let tracking_ref = if remote == "." { + Some(merge_ref.clone()) } else { match repo.find_remote(remote) { - Ok(_) => repo - .branch_upstream_name(&refname)? - .as_str() - .ok_or_else(|| AppError::other("Invalid upstream name"))? - .to_string(), + Ok(_) => match repo.branch_upstream_name(&refname) { + Ok(name) => Some( + name.as_str() + .ok_or_else(|| AppError::other("Invalid upstream name"))? + .to_string(), + ), + Err(error) if error.code() == git2::ErrorCode::NotFound => None, + Err(error) => return Err(error.into()), + }, Err(error) if matches!( error.code(), git2::ErrorCode::NotFound | git2::ErrorCode::InvalidSpec ) => { - merge_ref.clone() + None } Err(error) => return Err(error.into()), } }; + let upstream_ref = tracking_ref.as_deref().unwrap_or(&merge_ref); let old = head.peel_to_commit()?.id(); let fetched = if remote != "." { match group_fetch( + &repo, path, remote, control, - Some((&merge_ref, &upstream_ref)), + Some((&merge_ref, tracking_ref.as_deref())), None, ) { Ok(oid) => oid, @@ -636,7 +642,7 @@ fn group_update_inner( control.ensure_active()?; let target = match fetched { Some(oid) => repo.find_commit(oid)?, - None => match repo.find_reference(&upstream_ref) { + None => match repo.find_reference(upstream_ref) { Ok(reference) => reference.peel_to_commit()?, Err(error) if error.code() == git2::ErrorCode::NotFound => { return Ok(result( @@ -710,15 +716,15 @@ fn group_update_inner( } fn group_fetch( + repo: &Repository, path: &str, name: &str, control: &GroupUpdateControl, - upstream: Option<(&str, &str)>, + upstream: Option<(&str, Option<&str>)>, progress: Option<&FetchProgress>, ) -> AppResult> { control.ensure_active()?; - let repo = super::repo::open(path)?; - prime_account_bindings(Some(&repo)); + prime_account_bindings(Some(repo)); let (mut remote, anonymous) = match repo.find_remote(name) { Ok(remote) => (remote, false), Err(error) @@ -732,15 +738,21 @@ fn group_fetch( Err(error) => return Err(error.into()), }; static NEXT_FETCH: AtomicUsize = AtomicUsize::new(0); - let temporary = anonymous.then(|| { - format!( - "refs/angkorgit/group-pull/{}-{}", - std::process::id(), - NEXT_FETCH.fetch_add(1, Ordering::Relaxed) - ) + let temporary = upstream + .is_some_and(|(_, target)| target.is_none()) + .then(|| { + format!( + "refs/angkorgit/group-pull/{}-{}", + std::process::id(), + NEXT_FETCH.fetch_add(1, Ordering::Relaxed) + ) + }); + let upstream = upstream.map(|(source, target)| { + let target = target + .or(temporary.as_deref()) + .expect("upstream fetch has a destination"); + (source, target) }); - let upstream = - upstream.map(|(source, target)| (source, temporary.as_deref().unwrap_or(target))); let mut callbacks = make_callbacks(); callbacks.transfer_progress(|_| !control.is_cancelled()); callbacks.sideband_progress(|_| !control.is_cancelled()); @@ -818,12 +830,19 @@ fn group_fetch( } pub(super) fn fetch_progress_result( - path: &str, + repo: &Repository, progress: &FetchProgress, cancelled: bool, ) -> AppResult { - let repo = super::repo::open(path)?; - let changes = ref_movements(&repo, &progress.before)?; + let changes = ref_movements(repo, &progress.before)?; + Ok(fetch_progress_summary(progress, cancelled, changes)) +} + +pub(super) fn fetch_progress_summary( + progress: &FetchProgress, + cancelled: bool, + changes: Vec, +) -> GroupUpdateResult { let status = if progress.succeeded == progress.total { "ok" } else if progress.succeeded > 0 || !changes.is_empty() { @@ -845,11 +864,11 @@ pub(super) fn fetch_progress_result( if !progress.failures.is_empty() { message.push_str(&format!(". Failed: {}", progress.failures.join("; "))); } - Ok(GroupUpdateResult { + GroupUpdateResult { status: status.into(), message, changes, - }) + } } fn ref_movements( diff --git a/apps/desktop/src-tauri/tests/git_engine.rs b/apps/desktop/src-tauri/tests/git_engine.rs index c72b8d26..e834b0c4 100644 --- a/apps/desktop/src-tauri/tests/git_engine.rs +++ b/apps/desktop/src-tauri/tests/git_engine.rs @@ -3686,7 +3686,7 @@ fn group_fetch_cancel_receipts_keep_successful_remotes_and_prior_errors() { drop(listener); accepted_tx.send(()).unwrap(); release_rx - .recv_timeout(std::time::Duration::from_secs(10)) + .recv_timeout(std::time::Duration::from_secs(30)) .unwrap(); drop(socket); }); @@ -3701,7 +3701,7 @@ fn group_fetch_cancel_receipts_keep_successful_remotes_and_prior_errors() { .unwrap(); let start = std::time::Instant::now(); let receipts = control.cancel_results().unwrap(); - assert!(start.elapsed() < std::time::Duration::from_secs(1)); + assert!(start.elapsed() < std::time::Duration::from_secs(5)); assert!(!worker.is_finished()); assert_eq!(receipts.len(), 1); let result = &receipts[0].result; @@ -3723,3 +3723,150 @@ fn group_fetch_cancel_receipts_keep_successful_remotes_and_prior_errors() { std::fs::remove_dir_all(origin).unwrap(); } } + +#[test] +fn group_pull_fetches_an_upstream_outside_the_remote_fetch_refspec() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + let old = commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let other = clone_of(&origin, &local, "unmapped-upstream"); + let fetch = "+refs/heads/elsewhere:refs/remotes/origin/elsewhere"; + core::set_config(Some(other.path()), "remote.origin.fetch", fetch, false).unwrap(); + let repo = git2::Repository::open(other.path()).unwrap(); + assert_eq!( + repo.branch_upstream_name("refs/heads/master") + .err() + .unwrap() + .code(), + git2::ErrorCode::NotFound + ); + local.write("a.txt", "updated\n"); + let new = commit_all(&local, "updated"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let outcome = core::group_update(other.path(), true).unwrap(); + assert_eq!(outcome.status, "ok", "{}", outcome.message); + assert_eq!(repo.head().unwrap().target().unwrap().to_string(), new); + assert_eq!(other.read("a.txt"), "updated\n"); + assert_eq!( + repo.config() + .unwrap() + .get_string("remote.origin.fetch") + .unwrap(), + fetch + ); + assert_eq!( + repo.find_reference("refs/remotes/origin/master") + .unwrap() + .target() + .unwrap() + .to_string(), + old + ); + assert!(repo + .references_glob("refs/angkorgit/group-pull/*") + .unwrap() + .next() + .is_none()); + assert_eq!( + core::group_update(other.path(), true).unwrap().status, + "up_to_date" + ); + git2::Repository::open_bare(&origin) + .unwrap() + .find_reference("refs/heads/master") + .unwrap() + .delete() + .unwrap(); + let deleted = core::group_update(other.path(), true).unwrap(); + assert_eq!(deleted.status, "skipped"); + assert!(deleted.message.contains("missing on remote origin")); + assert!(repo + .references_glob("refs/angkorgit/group-pull/*") + .unwrap() + .next() + .is_none()); + std::fs::remove_dir_all(origin).unwrap(); +} + +#[test] +fn group_cancel_preserves_other_receipts_when_a_fetch_repository_moves() { + let local = TempRepo::new(); + local.write("a.txt", "base\n"); + commit_all(&local, "base"); + let origin = bare_origin(&local); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let mut other = clone_of(&origin, &local, "moved-fetch"); + local.write("a.txt", "updated\n"); + commit_all(&local, "updated"); + core::push(local.path(), "origin", None, false, false, true).unwrap(); + let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap(); + core::remote_add( + other.path(), + "z-stalled", + &format!("http://{}/repo.git", listener.local_addr().unwrap()), + ) + .unwrap(); + let (accepted_tx, accepted_rx) = std::sync::mpsc::channel(); + let (release_tx, release_rx) = std::sync::mpsc::channel(); + let server = std::thread::spawn(move || { + let (socket, _) = listener.accept().unwrap(); + drop(listener); + accepted_tx.send(()).unwrap(); + release_rx + .recv_timeout(std::time::Duration::from_secs(30)) + .unwrap(); + drop(socket); + }); + let control = std::sync::Arc::new(core::GroupUpdateControl::default()); + let finished = TempRepo::new(); + assert_eq!( + core::group_update_controlled(finished.path(), false, &control) + .unwrap() + .status, + "skipped" + ); + let worker_control = control.clone(); + let path = other.path().to_string(); + let worker_path = path.clone(); + let worker = std::thread::spawn(move || { + core::group_update_controlled(&worker_path, false, &worker_control) + }); + accepted_rx + .recv_timeout(std::time::Duration::from_secs(10)) + .unwrap(); + let original = other.dir.clone(); + let moved = original.with_extension("moved"); + std::fs::rename(&original, &moved).unwrap(); + other.dir = moved; + let receipts = control.cancel_results().unwrap(); + assert!(control.is_cancelled()); + assert!(!worker.is_finished()); + assert_eq!(receipts.len(), 2); + let unaffected = receipts + .iter() + .find(|receipt| receipt.path == finished.path()) + .unwrap(); + assert_eq!(unaffected.result.status, "skipped"); + let affected = receipts + .iter() + .find(|receipt| receipt.path == path) + .unwrap(); + assert_eq!(affected.result.status, "partial"); + assert!(affected + .result + .message + .contains("Fetched 1 of 2 remotes before cancellation")); + assert!(affected + .result + .message + .contains("Could not inspect moved refs")); + std::fs::rename(&other.dir, &original).unwrap(); + other.dir = original; + release_tx.send(()).unwrap(); + server.join().unwrap(); + assert_eq!(worker.join().unwrap().unwrap().status, "partial"); + assert_eq!(other.read("a.txt"), "base\n"); + std::fs::remove_dir_all(origin).unwrap(); +} From 2c47839bbd7004b2e6f67924e0d37ebe0977ff76 Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Tue, 13 Oct 2026 18:48:08 +0200 Subject: [PATCH 09/10] test: make group update regressions portable on Windows --- CLAUDE.md | 4 +++ apps/desktop/src-tauri/tests/git_engine.rs | 33 +++++++++++++--------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index cfdd9274..3abc42a1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1091,6 +1091,10 @@ features/ │ │ builds receipts independently: if ref inspection fails, it retains │ │ fetch counts and prior errors with a diagnostic on that row, while │ │ preserving every other completed receipt and acknowledging Cancel. +│ │ The unreadable-path integration fixture invalidates a gitdir alias +│ │ file while the worker keeps the real clone open; it never renames +│ │ open pack files, which Windows refuses. File-URL fixtures use +│ │ Url::from_file_path for drive letters, slashes and escaping. │ │ URL/path upstreams use anonymous remotes and a unique temporary │ │ refs/angkorgit/group-pull ref; its OID is captured and the ref deleted │ │ in the same guarded write phase, without changing branch config. diff --git a/apps/desktop/src-tauri/tests/git_engine.rs b/apps/desktop/src-tauri/tests/git_engine.rs index e834b0c4..555b000a 100644 --- a/apps/desktop/src-tauri/tests/git_engine.rs +++ b/apps/desktop/src-tauri/tests/git_engine.rs @@ -3588,7 +3588,7 @@ fn group_pull_accepts_url_upstreams_without_leaving_temporary_refs() { false, ) .unwrap(); - let url = format!("file://{}", origin.display()); + let url = reqwest::Url::from_file_path(&origin).unwrap().to_string(); core::set_config(Some(other.path()), "branch.work/topic.remote", &url, false).unwrap(); local.write("a.txt", "updated\n"); let new = commit_all(&local, "updated"); @@ -3791,13 +3791,13 @@ fn group_pull_fetches_an_upstream_outside_the_remote_fetch_refspec() { } #[test] -fn group_cancel_preserves_other_receipts_when_a_fetch_repository_moves() { +fn group_cancel_preserves_other_receipts_when_a_fetch_repository_path_becomes_invalid() { let local = TempRepo::new(); local.write("a.txt", "base\n"); commit_all(&local, "base"); let origin = bare_origin(&local); core::push(local.path(), "origin", None, false, false, true).unwrap(); - let mut other = clone_of(&origin, &local, "moved-fetch"); + let other = clone_of(&origin, &local, "moved-fetch"); local.write("a.txt", "updated\n"); commit_all(&local, "updated"); core::push(local.path(), "origin", None, false, false, true).unwrap(); @@ -3814,9 +3814,7 @@ fn group_cancel_preserves_other_receipts_when_a_fetch_repository_moves() { let (socket, _) = listener.accept().unwrap(); drop(listener); accepted_tx.send(()).unwrap(); - release_rx - .recv_timeout(std::time::Duration::from_secs(30)) - .unwrap(); + let _ = release_rx.recv_timeout(std::time::Duration::from_secs(30)); drop(socket); }); let control = std::sync::Arc::new(core::GroupUpdateControl::default()); @@ -3827,8 +3825,20 @@ fn group_cancel_preserves_other_receipts_when_a_fetch_repository_moves() { .status, "skipped" ); + let alias = TempRepo::new(); + std::fs::remove_dir_all(alias.dir.join(".git")).unwrap(); + let gitdir = format!( + "gitdir: {}\n", + other + .dir + .join(".git") + .display() + .to_string() + .replace('\\', "/") + ); + alias.write(".git", &gitdir); let worker_control = control.clone(); - let path = other.path().to_string(); + let path = alias.path().to_string(); let worker_path = path.clone(); let worker = std::thread::spawn(move || { core::group_update_controlled(&worker_path, false, &worker_control) @@ -3836,10 +3846,8 @@ fn group_cancel_preserves_other_receipts_when_a_fetch_repository_moves() { accepted_rx .recv_timeout(std::time::Duration::from_secs(10)) .unwrap(); - let original = other.dir.clone(); - let moved = original.with_extension("moved"); - std::fs::rename(&original, &moved).unwrap(); - other.dir = moved; + alias.write(".git", "gitdir: missing-repository\n"); + assert!(git2::Repository::open(alias.path()).is_err()); let receipts = control.cancel_results().unwrap(); assert!(control.is_cancelled()); assert!(!worker.is_finished()); @@ -3862,8 +3870,7 @@ fn group_cancel_preserves_other_receipts_when_a_fetch_repository_moves() { .result .message .contains("Could not inspect moved refs")); - std::fs::rename(&other.dir, &original).unwrap(); - other.dir = original; + alias.write(".git", &gitdir); release_tx.send(()).unwrap(); server.join().unwrap(); assert_eq!(worker.join().unwrap().unwrap().status, "partial"); From c58ecfa8a040e862fe750b7d2debae7ced19210b Mon Sep 17 00:00:00 2001 From: Christian Lauinger Date: Wed, 14 Oct 2026 15:09:12 +0200 Subject: [PATCH 10/10] fix(ui): align group fetch icon and trim feature notes --- CLAUDE.md | 82 ++++--------------- .../src/features/repository/WelcomePage.tsx | 4 +- 2 files changed, 17 insertions(+), 69 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 3abc42a1..8828b2d6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1046,73 +1046,21 @@ features/ │ │ first, skips missing folders and says so in the toast │ │ description, addRepoTab for every present path, opens the │ │ first only when the current repo is not in the group, then -│ │ ensureRepoRoute). GroupUpdateDialog + groupUpdate.ts run group -│ │ fetch/pull sequentially (shared worktree refs) and show live -│ │ per-repo results. classify() is shared by counters and badges: -│ │ Rust returns an explicit partial status when some remotes fail -│ │ but others succeed, even when no refs move; counters never overlap. -│ │ groupStart/groupCancel/groupFinish manage a native runId token. -│ │ remote::group_update_controlled separates remote.download from -│ │ update_tips; core/group_update.rs guards ref and checkout writes -│ │ with the cancellation mutex. Cancel acknowledges without waiting -│ │ on socket I/O, aborts the frontend wait and remaining repos, and -│ │ releases useRepo.busy; already completed changes are retained. -│ │ Cancel intentionally waits for an active local checkout/ref-write -│ │ phase to finish; the button can show Cancelling… during that phase. -│ │ Registry entries record last use: one-hour stale runs are cancelled -│ │ and pruned on subsequent registry activity using try_lock, so expiry -│ │ never waits for or interrupts an active local checkout. Expired -│ │ download handles remain cancelled after their registry entry goes. -│ │ Network reads may wind down in the background, but no ref or -│ │ working-tree updates run after cancellation acknowledges. The batch -│ │ native guard records per-repo outcomes before releasing a local -│ │ write phase. groupCancel returns these completed-result receipts, -│ │ so a checkout completed while Cancel waited still counts as Updated. -│ │ The runner settles each row once from the response or acknowledgement, -│ │ consumes but ignores late responses/errors, and never overwrites settled -│ │ rows. Cancelled queued requests cannot become inactive-run failures; -│ │ unmount cancels too. Fetch pruning reads remote..prune first, -│ │ falling back to fetch.prune only when the remote key is absent. -│ │ ensure_active() names read-only cancellation checks. Fetch receipts -│ │ store an Arc of the initial refs and small success/failure counts; -│ │ moved-ref discovery and commit counting happen outside the cancel -│ │ mutex when the response or acknowledgement is built. Errors retain -│ │ earlier fetch progress and remain visible after Cancel; queued repos -│ │ explicitly say they never started. Fetch badges say Unchanged like -│ │ the counts. Pull reads branch_upstream_merge via git2 and resolves -│ │ branch_upstream_name before fetching named remotes (a missing tracking -│ │ ref can be restored), fetching the exact configured merge ref -│ │ into that tracking ref, requiring its update callback (with -│ │ REPORT_UNCHANGED) so stale refs never hide a deleted upstream. -│ │ Named upstreams outside the remote fetch refspec also use a temporary -│ │ destination, fetching the exact merge source without changing fetch -│ │ configuration or overwriting existing tracking refs. One repository -│ │ handle serves all remotes and the final ref summary. Cancellation -│ │ builds receipts independently: if ref inspection fails, it retains -│ │ fetch counts and prior errors with a diagnostic on that row, while -│ │ preserving every other completed receipt and acknowledging Cancel. -│ │ The unreadable-path integration fixture invalidates a gitdir alias -│ │ file while the worker keeps the real clone open; it never renames -│ │ open pack files, which Windows refuses. File-URL fixtures use -│ │ Url::from_file_path for drive letters, slashes and escaping. -│ │ URL/path upstreams use anonymous remotes and a unique temporary -│ │ refs/angkorgit/group-pull ref; its OID is captured and the ref deleted -│ │ in the same guarded write phase, without changing branch config. -│ │ It skips detached/unborn HEAD, bare repos, unfinished operations -│ │ and divergence. Safe checkout alone decides whether local changes -│ │ conflict; unrelated untracked, staged and unstaged changes survive. -│ │ Hooks, submodules and external filters have exactly the toolbar -│ │ Pull behavior: libgit2 checkout, no extra compatibility skips or -│ │ hook/submodule/filter processing. Owner request before merging #70. -│ │ Safe checkout precedes the ref update; a ref failure explicitly -│ │ reports that checkout completed and gives both commit IDs for -│ │ inspection. Never merges/rebases. Results carry status/message + -│ │ name/oldOid/newOid/commits. GroupUpdateDialog uses flat borderless -│ │ rows, token-toned badges (success for Updated, danger for Failed, -│ │ primary for Partial), and one non-wrapping scrollable counts line. -│ │ Pull uses ArrowDownToLine, matching the toolbar. The mutex holds -│ │ through a local write phase; cancellation waits for it to finish -│ │ before acknowledging. Keep this rationale here, not in source. +│ │ ensureRepoRoute). GroupUpdateDialog + groupUpdate.ts run Fetch all +│ │ and Pull all sequentially with live per-repo results: moved refs, +│ │ commit counts, unchanged repos, skips and failures. The dialog uses +│ │ flat rows, toned badges and one non-wrapping counts line; +│ │ classify() keeps badges and counters consistent. Fetch uses +│ │ RefreshCw and Pull uses ArrowDownToLine, matching the toolbar. +│ │ groupStart(runId) starts the native run; groupUpdate uses that token. +│ │ groupCancel returns completed-result receipts before the frontend +│ │ aborts its wait; groupFinish cleans up. Leaving the page cancels too. +│ │ Cancel retains completed work, stops queued repos and permits no +│ │ ref/worktree writes after acknowledgement. It waits for active local +│ │ writes, not socket I/O; settled rows ignore late responses/errors. +│ │ Pull's checkout behavior matches toolbar Pull exactly. Group pull +│ │ follows the configured upstream and only fast-forwards, never +│ │ merges or rebases. │ │ closeRepoGroup, deleteRepoGroup (confirm │ │ only when the group has repos; the repos stay in recents), │ │ plural(count, noun) handles -y → -ies. DRAG: rows are diff --git a/apps/desktop/src/features/repository/WelcomePage.tsx b/apps/desktop/src/features/repository/WelcomePage.tsx index 343449be..00ad35fe 100644 --- a/apps/desktop/src/features/repository/WelcomePage.tsx +++ b/apps/desktop/src/features/repository/WelcomePage.tsx @@ -17,7 +17,7 @@ import { ChevronRight, Clock, Copy, - Download, + RefreshCw, FolderGit2, FolderOpen, FolderSearch, @@ -687,7 +687,7 @@ export function WelcomePage() { disabled={groupMenu.repos.length === 0 || !!busy || !!opening} onClick={() => void updateGroup(groupMenu.group, groupMenu.repos, false)} > - Fetch all + Fetch all