TurtleGit for Mac

View Markdown source ↗

Reached Cherry Pick merge-parent selection

This records a bounded continuation at pinned TortoiseGit 7338078f8ddd924b8cddee35f512f2286072136d, not complete Rebase parity.

Source ordering

RebaseDlg.cpp::DoRebase (2048–2133) returns immediately for Skip. It calculates requested-action Squash accumulation, first metadata and no-commit behavior before checking the exact empty subject. An empty subject warns and changes the local execution mode to Edit (2091–2094). Only then, when an advanced Cherry Pick merge row is reached, does it ask which parent to pick (2115–2133), adding -m to the actual cherry-pick. Cancel stops before applying that occurrence. Ordinary preserve-merges replay follows its separate parent-rewrite path.

GetCommitTitle (2017–2031) supplies the parent subject/short hash. The pinned question exposes Parent 1, Parent 2 and Cancel. The native question retains all supported actual parents in their immutable order; it does not discard later parents of an octopus merge. This is an explicit Mac extension of that dialog. The source's IsCommitEmpty (2001–2014) compares the original tree to its first parent before the question. Original empty subject, source empty classification and the selected-mainline patch becoming empty are separate concerns.

Connected native execution

The native pre-start sweep of all missing mainlines is replaced by a durable checkpoint before each reached, retained merge occurrence in advanced Cherry Pick. Earlier commits can therefore run before a later question, and an earlier conflict does not ask about unreached merges. Skip generates no parent question. An empty-subject merge retains its earlier warning and mandatory message review; requested Pick/Edit/Squash remains separate from effective execution mode.

The question loads immutable parent summaries under the owning operation token. It preserves the selected occurrence and Progress view, offers every captured parent plus Cancel, and defaults to Cancel. The parent window/access lease and Quit ownership remain held through metadata reads, the owned sheet's detachment and continuation. Cancel leaves the reached occurrence unapplied and resumable; reopening recovers that pending question. Forced retirement settles its owned continuation and refuses late replies.

Core RebaseMainlineDecision identifies the original commit, requested action, occurrence ID, logical step, pre-application HEAD, exact parent list, session identity and captured replay files. selectRebaseMainline revalidates the session, HEAD and unchanged replay state, reads the original object again, and validates the selected parent number. No hash-only choice is shared between repeated rows. Existing explicitly supplied valid mainlines remain supported.

Git validates the entire interactive todo before reaching a checkpoint. An unchosen merge therefore has an owned physical drop placeholder behind that checkpoint, not an invalid raw pick of the merge object. The requested logical action and original occurrence remain in metadata and native progress. Ordinary Squash rows dependent on that unresolved group also remain physical placeholders; otherwise a first merge followed by Squash would fail Git's predecessor rule before its parent question could appear. Accepted selection atomically restores the executable merge action and its dependent ordinary Squash chain, preserving Skip gaps and stopping at the next unresolved merge. Skip releases the dependent rows rather than silently dropping their requested work. Pending/adopted action writers and remaining-row projections retain this physical/logical distinction.

The native backend preserves its existing immutable one-parent execution-object adaptation: that object's tree and chosen parent encode the merge-to-mainline patch, while raw original message bytes, author/date, attribution option and original occurrence mapping remain attached to the logical row. Preparing this object changes no reference, index or working file. Acceptance journals the todo, original-to-execution mapping, occurrence mainline and message configuration before Git resumes. Cancellation after acceptance can therefore reopen the durable selection without asking again or applying a different parent. Interrupted metadata publication uses the existing replay-edit journal recovery.

Continue, Skip, empty-subject approval, conflict recovery and live logical progress recognize the owned checkpoint rather than displaying its internal exec as another commit. Editing future rows at an existing supported Edit, file-recovery or Squash pause creates deferred parent choices without asking about those future rows immediately. This does not add action editing at the parent-choice pause itself. Changed HEAD, parents, replay files, occurrence, owner, semantic replay intent, plan generation, Quit state or cancellation refuses stale acceptance. Existing Edit/Split/Squash/Abort recovery remains distinct from choosing a parent.

Boundaries and validation

This supersedes the preflight-parent adaptation documented in the October 16 Add preparation checkpoint. Add still uses cancellable atomic picker insertion; this continuation does not change its order, duplicate-row or incomplete-reference draft behavior.

The grouped checkpoint records the actual production Git-prevalidation repair and earlier failures. The affected Core scope passes cumulatively: fourteen methods passed the grouped run, then the remaining cancellation fixture was corrected to assert the actual Git child-cancellation receipt and passed alone with every durable recovery assertion retained. The Debug build and both native Add/reached-parent cases pass with system and bundled Git; both owned offscreen receivers were reaped and independently absent. Checks cover parent-specific trees and original metadata, repeated occurrences, Skip, empty-subject ordering, accepted-parent cancellation/reopening, stale replies, existing recovery and owned sheet cleanup. Installed build 9 predates this source.

No claim follows for every octopus topology, arbitrary externally authored replay scripts, hooks/filter combinations, physical parent selection or VoiceOver, signed Finder/App Store execution, minimum-version/Intel execution, whole-dialog visual parity or the complete hosted CI suite. The native one-parent execution object remains an adaptation rather than the exact upstream cherry-pick -m process sequence.