various tix improvements - #2938
Merged
Merged
Conversation
Sebastian Thiel (Byron)
force-pushed
the
tix-improvements
branch
7 times, most recently
from
August 28, 2026 09:37
9435460 to
6b0ae90
Compare
Sebastian Thiel (Byron)
force-pushed
the
tix-improvements
branch
12 times, most recently
from
September 8, 2026 05:48
9fa9982 to
8b529d1
Compare
Sebastian Thiel (Byron)
force-pushed
the
tix-improvements
branch
4 times, most recently
from
September 16, 2026 06:58
810dd63 to
56f1b8f
Compare
Sebastian Thiel (Byron)
force-pushed
the
tix-improvements
branch
3 times, most recently
from
September 21, 2026 18:20
973b63b to
3334273
Compare
Sebastian Thiel (Byron)
force-pushed
the
tix-improvements
branch
from
September 30, 2026 05:37
a3d458d to
f70247c
Compare
Sebastian Thiel (Byron)
force-pushed
the
tix-improvements
branch
2 times, most recently
from
October 4, 2026 03:50
9e9382a to
999cd9e
Compare
A branch can contain lazy rebases or unresolved replay state beneath an otherwise finalized tip. Publishing it exposes temporary commit trees. Check the branch selected for push through every merge parent before both the initial push and a force-with-lease retry, reporting the blocking commit without replaying or changing local history. Limit validation to the active view's hidden boundary: exclude every hidden tip and all of its ancestors, including ancestry shared through other merge parents. Hidden history may retain unfinished markers that should not prevent publishing the visible work. Disable the check completely, including source locks, when no hidden tips are known or hidden history is shown. Carry the active hidden tips with the push request so a force retry keeps the same scope. Reuse the existing pending-state predicate for lazy parents, merge replay continuations, unavailable patch identities, and unfinished signatures. AutoMerges count as finalized regardless of their state; their visible Git parents are still checked. Validate the original objects that Git transfers and its actual local source ref, ignoring replacement objects and namespaces. When validation is active, hold standard ref locks on the source and each symbolic referent until Git finishes, so a concurrent rewrite cannot replace the validated history. Handle shared refs from linked worktrees and release locks on every return path. Join the push worker during shutdown so exiting Tix does not abandon its locks. Keep native Git's destination mapping and `--force-with-lease` behavior intact. Document the behavior in `spec.md`. Regression coverage includes every pending marker, visible ordinary and AutoMerge ancestry, hidden tips and shared ancestors, unbounded views with a pre-existing source lock, namespace and replacement disguises, muted AutoMerge inputs, and concurrent source rewrites from a linked worktree with packed and symbolic refs. Validation: all 17 focused push and background-task tests pass in a standalone source copy with isolated Git configuration. The new regression fails against the unrestricted guard. Crate Clippy and workspace formatting checks pass.
…nment Tests must keep Git subprocesses and repository reopens inside disposable fixtures even when the invoking shell exports repository selectors, signing configuration, or a shell-handoff destination. Route fixture Git commands through `gix-testtools` and share their isolation with production subprocess paths in test builds. Use deterministic isolated options for repository reopens under test. Run the worktree-removal command test in a child with its inherited shell-handoff destination removed. Skip default file logging in test builds and isolate the fetch transport test, so command tests cannot write user logs or pass user configuration to Git. A destructive discard regression checks that inherited selectors cannot change another disposable repository or its index. The regression fails against the prior code by changing the other fixture. All 726 Tix tests pass with SHA-1 and blocking network support from an isolated source copy. Existing snapshots are unchanged. Workspace formatting and Clippy for all affected packages and targets pass. Windows fixture CI reported `hostname contains invalid characters` in the bare clone tests: `std::fs::canonicalize()` added a verbatim device prefix that Git parsed as an SSH source. Use `gix::path::realpath()` to make fixture paths absolute without introducing that prefix. Both bare-clone regression tests and workspace formatting pass locally.
Rewording a checked-out commit used the shared rebase engine's mixed index reset because reword retains lazy-replay metadata. That discarded staged versions even though the commit tree was unchanged, including contents no longer present in the worktree. The editor and explicit-message paths were both affected, as were linked checkouts and empty rewritten descendants. Recognize replacements that change only commit metadata and omit index resets for their unchanged output trees. Keep explicit path updates and pending HEAD finalization consuming the selected staging as requested. Split and insertion also retain their existing index behavior, even when their resulting tree is unchanged. Document index preservation in `spec.md`. The regression exercises TUI and CLI entry points against ordinary and empty HEAD commits, linked targets, and empty linked descendants. It verifies exact index bytes and worktree contents, including staged data absent from disk. A second regression keeps an unchanged-tree pending path amendment updating its selected index entry while retaining unrelated staging. Validation: the reword regression fails against the previous implementation; all 726 SHA-1 crate tests pass in a standalone source copy with isolated Git configuration. Crate Clippy and workspace formatting checks pass.
Creating a commit reused checkout-ancestry validation, so a finalized parent could be rejected because an older visible ancestor still needed replay. With no hidden tip, the error directed users to time-travel through that history even though creating a child did not require changing it. A pending selected parent on another branch could also escape the checkout-based check. Validate the actual insertion parent before any objects or refs are persisted. Keep the existing pending-state predicate and AutoMerge exemption, but do not scan older ancestry for insertion. AutoMerge maintenance and validation of other edit operations retain their existing behavior. Cover every CLI content source and shared TUI normal/empty creation, including ordinary merges and selections away from HEAD. Check that older ancestry stays intact and that rejection preserves refs, undo state, index bytes, worktree files, and the object database.
The prefix popups expose shortcuts but require knowing what a verb does before running it. Make `a`, `v`, `n`, and `?` useful for exploration: a 300 ms hold selects the first displayed command and shows contextual help. Navigate the wrapped popup with `hjkl` or arrows, release the prefix or press Enter to run the selection once, and press Escape to cancel. Taps and fast shortcuts retain their existing behavior; terminals without key-release reporting keep toggles. Reuse the command catalog, actual popup geometry, and normal action validation. Cancel browsing when focus, input ownership, or the visible command changes. Handle shifted question-mark releases and native Windows repeated key-downs, read queued taps before promoting a hold, and clear held keys before handing input to editors or diff viewers. Keep contextual help separate from notices. Validation: 744 isolated library tests passed, with the eight gesture tests rerun after test-only Clippy cleanup. Formatting and SHA-1 all-target Clippy passed. A disposable `gix-testtools` repository passed enhanced and legacy PTY smoke checks. The network-enabled all-target build check passed; Clippy with that feature encounters the existing `drop_non_drop` lint in `gix-protocol/src/fetch/function.rs:144`.
When there are no local changes, advertising both `2 stash & travel` and `@ with worktree` suggests a distinction that does not affect the checkout. Show only `@ travel` for a current clean worktree status, or `@ return` at a pinned destination. Preserve both hints for dirty or unknown status, including untracked-only changes and unwatched or failed status snapshots. Key bindings remain unchanged. Build the travel shortcut spans once and reuse their width for prefix-popup positioning so the Information popup remains attached after the footer shrinks. Extend the existing rendering regression for clean, dirty, and unknown status, return destinations, shortcut underlining, and popup alignment. Validation: all 70 UI tests passed from an isolated source copy; formatting and SHA-1 all-target Clippy passed.
Push displayed a separate line above the footer before putting a force-push prompt in the ordinary message area. Use that same message area for push, fetch, and worktree-removal progress so their status has a consistent place and does not reserve an extra row beside foreground feedback. Keep background task state independent from notices. Held-command help takes priority, followed by prompts and ordinary notices; the latest progress resumes when they clear. Preserve the completion fill, wrap long progress text, and move it above prefix popups like other messages. Validation: all 71 UI tests passed from an isolated source copy, including priority, resumption, completion fill, and popup layout. Formatting and SHA-1 all-target Clippy passed.
An external remover can delete a linked worktree's `HEAD`, `commondir`, or `gitdir` before its checkout and administration directories disappear. The lifecycle check only noticed missing directories, so reference refreshes and view loads could exit while reopening that incomplete repository. Treat missing administration files as worktree loss and enter the normalized common repository. Explicitly clear its in-memory worktree path: overriding `core.bare` alone could retain the main checkout. Recovery leaves that checkout's `HEAD` and index untouched. Retry interrupted renders and snapshots through the existing lifecycle boundary. Keep refresh graphs and distinguish worker requests made before recovery so late failures reload the surviving history. A disappearing picker preview becomes unavailable instead of closing the UI. Requests against the recovered repository still propagate errors normally. Validation: the new partial-removal regression fails on the previous code. All 747 library tests, SHA-1 all-target Clippy, and formatting checks passed from an isolated source copy. Regression fixtures use `gix-testtools` and isolated child processes for working-directory changes. Live PTY checks also stayed interactive through ordinary external removal, HEAD-first and commondir-first partial removal, and deletion during picker preview. Recovery cleared the Worktree pane and explicit exit still worked.
Finishing a review should record the approval that the operation represents. Automatically add the sparkle enrichment to the resulting review commit's current patch, including an empty patch. Target that commit even when the recorded return checkout selects one of its descendants. Prepare approval alongside review completion so history, review resources, and enrichment publish in the same ref/worktree transaction. Cancelling a suspended finish publishes no approval; accepting a conflicting return checkout still approves the completed review. Finalize its replay markers and patch identity before preparing the enrichment. Validation: all 268 edit tests passed from an isolated source copy, including empty and changed reviews, descendant return targets, a pending review root, and conflict cancellation and acceptance. SHA-1 all-target Clippy and formatting checks passed. All regression repositories use `gix-testtools`.
Local edits sometimes belong before the current commit. Creating a child and moving it afterward requires extra history operations and can encounter a conflict only after the new commit has already been published. Add `a Shift-W` (`neW-below`) using the usual staged-first, tracked-worktree fallback. Prepare the local patch against HEAD's parent and replay HEAD above it entirely in memory, requiring the combined tree to match the selected candidate. Conflicts and editor cancellation leave the checkout unchanged. Keep HEAD's identity and notes on the rewritten upper commit and select the new lower commit, leaving siblings untouched and descendants lazily rebased. Consume the selected changes through the active index without checking out worktree files. Other affected worktrees retain their normal checkout safety and staged changes. Support ordinary commits and roots, reject unfinished HEAD or immediate parents, and preserve older pending ancestry. The Linux `test-fast` jobs passed their tests but failed the generated-archive cleanliness check because `create_below.tar` had not been committed. Include the archive produced by the existing fixture helper. Regenerated it from a fresh cache and validated all seven `new_below` tests. The full CI job also requires fixture scripts with a shebang to be executable. Track `create_below.sh` as mode `100755`; the repository mode check passes with this correction staged.
Every palette keystroke marked the full view dirty, formatting and measuring all changed paths even when only the query and matching commands changed. Large dirty worktrees therefore made ordinary typing noticeably slow. Retain one terminal-sized background buffer while a command or AutoMerge input menu is open and reuse it for menu-only redraws. Process these redraws after normal repository lifecycle and watcher handling. Pending background changes, resizes, and menu dismissal still redraw the full view, and menu input leaves the background frame deadline intact so it cannot postpone streaming updates. Regression coverage compares cached and complete frames across filtering, expansion, cursor placement, resizing, and updated worktree contents. In a debug build, eight palette edits over 20,000 changed paths dropped from about 350 ms to 10 ms. Update `spec.md` with the redraw and detached-buffer lifetime rules. Validation: `cargo test -p gix-tix --features sha1`, crate formatting, and Clippy for all crate targets with `sha1` and warnings denied. Tests use `GIX_TEST_IGNORE_ARCHIVES=1`; macOS filesystem notifications require running outside the sandbox.
Large untracked build trees expanded into individual worktree rows and file diffs. Use `UntrackedFiles::Collapsed` for the display so directories such as `target/` occupy one added row without reading every file for line counts. Refresh untracked child events from their top-level scope so cached directory rows match a full status, including newly created and removed directories. Keep precise scopes for tracked files and explicit file enumeration for commit creation, whole-commit amend, and split so directory contents are retained. Represent directory diffs as unavailable. Discard validates the collapsed row and uses Git's existing literal-path cleanup, preserving ignored contents. Single-path amend requires staging the directory's files first; hide that action for directory rows and reject it before changing repository state. Update `spec.md` and cover Git-compatible collapsing, incremental refresh, directory actions, and retained commit contents. All 759 library tests pass, along with binary and documentation test targets, crate formatting, and Clippy for all targets with `sha1`. Tests use `GIX_TEST_IGNORE_ARCHIVES=1`; the native macOS reference-watcher test runs outside the sandbox.
Finishing a review replaced its parent with the reviewed tip and transplanted only the review and its descendants. Independent commits inserted below the review disappeared from the resulting history, even though the review's exact tree retained their changes. Find the ordinary ancestor chain exclusive to the review and replay each patch onto the reviewed tip before attaching the finished review. Preserve change IDs, authors, messages, Git notes, and references, and reparent affected side history. The review keeps its exact tree and remains the only newly approved patch. Reject hidden, pending, nonlinear, or conflicting additions without publishing changes. A shared merge base remains valid. Cover single and multiple inserted parents, review and original successors, notes, distinct patches, and atomic failure, and document the completion behavior. Validation: all 762 `gix-tix` tests with `sha1`, workspace formatting checks, and crate Clippy with warnings denied passed. The filesystem-watcher test needs normal macOS notification access; its sandboxed run times out.
Finishing explicitly cleared undo history, and accepted review-return conflicts suppressed recording through resolution. Even recording a successful finish was insufficient for redo: undo restored an active review, whose blanket guard hid the queue again. Record the complete finish transaction using the normal undo machinery, including its checkout, review resources, return pin, and patch approval. Recognize review-ending entries by the review-reference deletion they already contain, so they remain reversible across active reviews without a new queue format. Remove the UI veto and the special conflict-recording suppression. Keep ordinary edits during active reviews unrecorded and discard stale redo after those edits. Empty transactions, including cancelled unpublished previews, leave the queue alone. Cover attached and detached returns, repository reopens, another active review, edit-and-retry, and grouped return-conflict resolution. Update the review specification with the undo and redo contract. Validation: all 764 `gix-tix` tests with `sha1`, workspace formatting checks, and crate Clippy with warnings denied passed. Tests used normal macOS filesystem-notification access for the watcher test.
Undo and redo were available only in the terminal UI even though CLI edits already recorded the same worktree-local operation queue. Expose one-step undo and redo alongside a plain operation log, with bare `tix op` showing the log and marking the current position among applied and undone entries. Move `tix admin clear-undo` to `tix op clear` so all queue operations share one command family. Keep history data on stdout and recovery feedback on stderr. Reuse checked reference and worktree updates, and reject unresolved index conflicts before applying an undo or redo. Validation: all 768 `gix-tix` tests pass, including the operation-command round trips, output separation, conflict safety, and existing review and linked-worktree coverage. Formatting and Clippy checks pass. Both `tix` and `gix tix` build and expose the new command family in their CLI help.
Branch and Git-hash travel loaded history without the normal hidden boundary. Old pending markers in merged ancestry could replay hundreds of commits, changing identities and metadata even when their file contents stayed intact. The shared replay engine also reparented siblings and later descendants that were unrelated to the requested checkout. Limit travel to editable commits in `HEAD..destination`, plus the destination itself. This permits refreshing a pending `HEAD` or backward destination while preserving older shared ancestry, siblings, and commits beyond the destination. The limit applies even without hidden history and when an explicit view omits HEAD. Branch and hash resolution now infer the usual hidden boundary, and hidden or shallow destinations remain exact checkouts. Keep AutoMerge dependency replay inside the original route, preserving the bounded change-ID lookup window and treating outside inputs as snapshots. Collapsing a merge cannot widen later replay passes. Pending boundary parents remain unchanged, including when accepting and resolving a travel conflict. Cover CLI resolution, endpoint replay, omitted HEAD, shallow boundaries, both ordinary merge sides, off-path identities, AutoMerge collapse, local changes, and conflict recovery in disposable repository regressions.
Accepted rebase and transplant conflicts previously kept their continuation in an exported todo or in TUI memory. Restarting Tix or changing interfaces lost the operation context, and the TUI could not identify a CLI-created pause. Save accepted pauses in worktree-local Git metadata using the existing todo and undo formats, retaining their required objects through Git GC. Add `tix rebase status [--porcelain]`, `continue`, and `stop`. Continuation consumes the staged index without launching an editor or staging files. Initial and later conflicts require explicit acceptance; refusal preserves the prior state. Plain `rebase todo` exports the saved plan, and matching edited-file application remains supported. Bare `--materialize-conflicts` now saves internally; exporting requires `=FILE` or `=-` for stdout. Optional filenames never consume a positional todo. Restore the TUI's persistent `REBASE PAUSED` notice on startup and refresh, including operation, remaining work, readiness, and blocked-state guidance. Enter continues, subsequent conflicts require acceptance, Escape stops at a saved pause, and quitting preserves it. Inspection and resolution amendments remain available while unrelated mutations are blocked. Check captured HEAD identity and reference expectations before continuing. Publish session transitions with checked history updates, serialize checkout and stop, and restore staged resolutions on failed publication. Completion or stop records one grouped undo entry without resurrecting session metadata on undo. Stop preserves partial commits, index, and worktree contents. Ordinary lazy replay, travel conflicts, and native Git rebases stay outside this continuation workflow. Validation: 785 Tix tests pass, including CLI/TUI handoff, repeated conflicts, stale state, worktree isolation, GC, rollback, and grouped undo. Tix Clippy passes with SHA-1, SHA-256, and blocking-network-client enabled; both `tix` and `gix tix` build with the small configuration and Tix enabled.
Interactive history already inferred local default branches from remote HEADs, but required `Shift+H` to hide their history after launch. Add `-X` / `--auto-hide` to `tix` and `gix tix` so the initial traversal applies those exclusions. Combine inferred exclusions with explicit `-x` revisions and retain the existing history toggle and revision diagnostics. Plain `tix` still opens with full history, and `-x` alone keeps its explicit-only scope. Reject the new history-view option alongside subcommands so it cannot be ignored. The public `gix_tix::Options` struct gains the default-false `auto_hide` field. Exhaustive initializers must supply it or use `..Options::default()`. Validation: - All 786 `gix-tix` tests pass with `sha1` and `GIX_TEST_IGNORE_ARCHIVES=1`. macOS filesystem-watcher coverage passes outside the sandbox. - `cargo clippy --locked -p gix-tix --features sha1 --all-targets -- -D warnings` passes; the workspace reports its existing removed-lint warning. - Seven isolated terminal checks cover plain startup, both flag spellings, the `Shift+H` round trip, `gix tix -X`, and missing inferred defaults.
The interactive ref-tree previously expanded the loaded history only with worktree tips. A remote-tracking branch outside that history could therefore be absent even though its reference existed and `tix ref-tree` displayed it. Expand the overview's cached graph with commit tips under `refs/remotes/` when entering it and whenever references refresh while it remains open. Reuse the graph's extra expansion inputs so ordinary history, hidden boundaries, and editing scope remain unchanged. Ignore stale symbolic references and non-commit targets using the existing reference iteration and peeling behavior. Cover remote branches from multiple remotes, moved tips, optional invalid references, rendered labels, and preserved history scope in a regression test. Keep the behavior documented in `spec.md`. Validation: all 787 Tix tests passed, as did Clippy with `-D warnings` and terminal checks for packed refs, live additions/moves/deletions, ordinary history, and `tix -X`.
`gix-command` prepares background helpers with `CREATE_NO_WINDOW`. Even with inherited standard streams, that flag gives Windows editors a separate hidden console. Vim and Nano can exit unsuccessfully, while Helix can wait invisibly for input that never reaches it. Clear the creation flags when launching Tix's configured editor so both direct commands and shell commands share Tix's console. The common launch path covers editing from the TUI and command-line operations without changing editor selection or the handling of the edited document. Add an isolated Windows regression that runs in a hidden test console and checks that the editor shares its caller's console before editing the file. Checking console process membership matters: opening `CONIN$` alone also works in the separate hidden console. Document the console-inheritance guarantee in `spec.md`. Verified interactive launches with Vim, Nano, and Helix, including returning from Vim and Helix to the TUI. The regression fails before the fix and passes afterward. The combined editor and command checks pass 75 tests; the remaining bare-clone test fails identically with the original implementation on Windows.
Restricting travel to its destination route also removed later descendants from the rewrite graph. Visiting a pending middle commit finalized it while the branch above it still reached its old pending version, leaving two versions of the same change visible in the TUI. Keep the loaded edit graph for descendant rewrites and pass the original travel route separately to the replay engine. Only the destination route and its eligible AutoMerge inputs replay content. Affected descendants follow rewritten parents lazily, retaining their trees and original replay bases; their references and notes move in the same existing transaction. Pending commits whose parents did not change remain untouched. Remap the replay route independently across subsequent passes so AutoMerge collapse cannot widen it. Shared ancestry and unpinned history outside the loaded view retain their previous boundaries. Add a regression for a pending middle commit, its retained descendant, and onward travel. Update the sibling, merge, and backward-travel assertions to require connected parent links while preserving content replay boundaries. Validation: all 788 Tix tests passed, as did Clippy with `-D warnings` and isolated CLI, undo, and TUI keyboard smoke checks. The debug `tix` binary was rebuilt with the fix.
The new-commit editor always started with a `what` title and a `why` body, so users could not choose a reusable initial message for their workflow. Read literal multiline text from `tix.new.message` through Git's existing configuration resolution. Keep the original text when unset and allow an empty value to start with a blank message area. Shared preparation applies the setting to ordinary, empty, root, below-HEAD, CLI, and split creation. Use the configured message when detecting existing attribution trailers, and keep appended editor comments on separate lines. Show the source of `tix.new.message` alongside the existing `tix.trailer.*` editor hints so users can discover the key and the winning configuration. Share their formatter for configuration files, non-file overrides, and the built-in default. Show the hint for blank messages and messages that already include both attribution trailers. Explicit messages still override the initial text, and leaving the editor unchanged still creates nothing. Document the setting and global/local configuration examples beside the existing Tix configuration documentation. Extend isolated tests for defaults, multiline text, missing final newlines, blank messages, configuration sources, trailer suggestions, explicit inputs, and cancellation. Validation: 50 focused tests for creation, rewording, splitting, and CLI messages passed. Crate formatting and Clippy with `-D warnings` also passed; Clippy emitted the workspace's existing removed-lint warning. The Windows fixture job failed the initial-message source assertion because its expected path joined `.git/config` with mixed separators. Build that path one component at a time, matching the configuration reader. The targeted test and workspace formatting pass locally.
The `? e` information shortcut cycles through Tree + Worktree, Tree only, and hidden, so hiding both panes requires several keys. Add `Shift-C` as a direct visibility toggle while preserving the existing cycle. One press hides either visible mode and returns focus to history. The next shows both panes, or Tree alone in a bare repository. Reuse the existing pane reset, diff-worker cleanup, and worktree-watcher refresh paths. Keep the toggle available during tree selection and rebase inspection, accept both terminal encodings of shifted letters, and advertise it in the information popup and keyboard documentation. The new regression failed before the binding existed. All 791 Tix tests pass with `sha1`, including focus, bare-repository, keyboard, and rendered help coverage. Run the full suite outside the sandbox for native filesystem notifications. Crate formatting and Clippy with `-D warnings` pass; Clippy retains the workspace's existing removed-lint warning.
A filesystem event for an untracked child refreshes its top-level scope. The shared ignore matcher could let a broad `!out/` exception expose Cargo output beneath an ignored target directory during this scoped walk, while startup and explicit full refreshes still looked correct. Exercise event-to-scope conversion and incremental cache replacement in an isolated repository with the reported nested project layout. Cover an untracked child, its containing directory, an ignored directory, and a tracked file; require the resulting status to match a full refresh. Document that negated descendant patterns cannot bypass ignored parents. The preceding `gix-worktree` change supplies the shared matcher fix. Validation: the regression failed before the matcher fix. All 792 Tix tests pass, including native filesystem watcher tests outside the macOS sandbox. Crate formatting and Clippy with `-D warnings` pass; Clippy retains the workspace's existing removed-lint warning.
This should be done in t acontrolled fashion, which can't be the case with fully generated code.
The `test-fixtures-windows (windows-latest)` and `test-32bit-windows-size-doc` CI jobs failed to compile the Windows-only `invalid_message_encoding_retains_its_cause` test with E0061: it supplied the former two-argument shape to the current three-argument `explicit_message()` helper. This stale call was inherited from the shared base, so keep the correction in a new PR commit. Pass the message slice, optional file path, and stdin separately, matching all current callers. Keep the encoding-error and retained-cause assertions. Validation: all seven reword tests pass locally; all seven logging tests pass with ANSI enabled; `cargo check -p gix-tix --tests --target aarch64-pc-windows-msvc --features sha1` passes. Windows runtime execution remains covered by CI. Workspace formatting and diff checks pass.
Sebastian Thiel (Byron)
force-pushed
the
tix-improvements
branch
from
October 4, 2026 07:32
25dad29 to
d963061
Compare
The Windows fast-test job failed in `reset_index_errors_keep_stderr_in_metadata`: the diagnostic correctly retained `git.exe`, but the assertion hard-coded `git`. The isolated Git test helper intentionally selects the platform-specific executable. Derive the expected program from the same isolated helper used by reset. Retain the checks that operation context and captured stderr survive. This assertion was inherited from the shared base, so add the correction as a new commit on the PR branch. Validation: the focused reset metadata regression and workspace formatting pass locally; Windows runtime verification will run in CI.
The Windows fast-test job failed in Tix associated-branch cleanup: `C:\Users\RUNNER~1\...\topic` was reported as not registered even though Git had created the worktree. Git can record the long-name path, while callers retain a short-name or verbatim path for the same directory. The shared-base removal resolver only compared path components after symlink resolution, which does not expand Windows short names. After the existing component comparison fails on Windows, compare canonical paths when both exist. Apply this at the shared equality helper used for target selection and backlink validation. Keep the original comparison and missing-path behavior so absent or inaccessible checkouts can still be unregistered. Add a Windows regression that registers a worktree with Git and removes it via its canonical path, and document equivalent path selection. Validation: ten gix removal tests and four Tix removal tests pass locally. The gix integration tests cross-compile for aarch64-pc-windows-msvc with basic,worktree-mutation enabled. Formatting and diff checks pass. Native Windows regression execution remains with CI. This dedicated outside-Tix commit is authored as Byron and marked TODO under gix-tix/AGENTS.md so the required human review is visible.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Tasks