TurtleGit for Mac

View Markdown source ↗

Merge source-pane tools — partial native parity

Source pin: 7338078f8ddd924b8cddee35f512f2286072136d, MainFrm.cpp::OnFileSaveAs / DiffLeftToBase / DiffRightToBase and BaseView.cpp::SaveFile / SaveFileTo.

The three-pane Save As menu now offers left, right and merged result. Source context menus also offer Save this pane as and Compare with Base, with original Save As/Compare icons. Left-source export retains removed Base rows; right skips them. Empty alignment rows are not file content. Conflicted row groups retain the source's literal .mine/.theirs marker serialization and NoEnding marker behavior; exact Windows acceptance of those unusual bytes remains open. Source encodings and original endings are retained by the captured export.

Source exports own a Save sheet, captured immutable bytes and the selected lease. Cancel and retired owners refuse late answers. Active export work guards Quit; source Open/Close are fenced during export. Successful source Save As now rebinds the pane, matching SaveFileTo. Later source comparisons and Reload read the chosen file; source snapshots are validated before merged Save. The selected lease remains with the owner. See Save As target behavior.

Compare Mine/Theirs with Base opens an independent native comparison, matching the source's separate process. It uses private read-only captured stage files, not a new checkout, repository or live source rewrite. Container temporary snapshots receive narrowly checked internal access; generated-file grants and private files live with that comparison window and are removed on close.

Merged-result copies from repository conflicts now use the same owned export sheet and capture their selected encoding before presentation. Unresolved-marker confirmation is owned and defaults to Cancel. Standalone output Save As retains its existing guarded output/snapshot save workflow. Read-only source comparisons refuse direct editing and transfers until that pane is explicitly saved to a user-selected file outside its private snapshot directory.

Earlier copy-only validation passed: Debug build, 16 focused Core checks and one grouped native source-tools/two-pane/three-pane receiver. The first compile found missing explicit self references in the export Task; repaired before successful build/Core run. The first native fixture requested emoji output in Windows-1252. Encoding failure correctly prevented a panel/write; selecting UTF-16LE BOM repaired the fixture. No application build or Core suite was repeated for that fixture correction. The native checks verify actual left/right/result export bytes, owned Cancel and late replies, Close/Quit gates, read-only captured source comparisons and private snapshot deletion, with input files unchanged. Existing editor typing/selection/ Undo/Save and three-pane reload regressions passed. All owned receivers were reaped. See validation evidence.

Physical Save/Compare gestures, warning-button input/VoiceOver, exact captures, complete conflict-gap/EOL equivalence, signed/container grants and full upstream/application parity remain open.

The subsequent source target batch records source Save As rebinding, later Save/Reload and owner-approved Quit Save checks, with remaining acceptance limits.

The result-copy and shared writer continuation adds a clean result-copy baseline while retaining the original normal Save path. Source and result copies now share the permission-preserving guarded writer and background write/readback ownership; original patch inputs overwritten by an owned Save As are adopted without dropping guards on other paths.