TurtleGit for Mac

View Markdown source ↗

References commit is on

The connected historical command family adds source ShowCompare, Cat, containing-reference and Revision Graph entry, authorized staged output, independent reference windows and hidden graph exports. Existing native layouts, original icons and renderer/comparison consumers remain. Batch evidence retains focused checks and explicit Windows-format/process, physical, signed and complete parity gaps.

A native modeless dialog now opens from Log's Show branches this commit is on menu entry. Core and native interaction checks pass with system and packaged Git; Core checks also pass with isolated Git 2.39.5. The dialog and its seven controls are tracked as partial. Physical and signed acceptance and complete source parity remain open.

Source and entry point

Baseline: TortoiseGit 7338078f8ddd924b8cddee35f512f2286072136d. GitLogListBase.cpp adds Show branches this commit is on with IDI_SHOWBRANCHES for one selected real commit, subject to its menu mask. GitLogListAction.cpp opens a modeless CCommitIsOnRefsDlg initialized to that commit. This is different from the branch/tag decorations attached to the row: the dialog finds references whose tips contain the commit in their ancestry.

CommitIsOnRefsDlg.cpp/.h, IDD_COMMITISONREFS and CGit::GetRefsCommitIsOn define the complete workflow. Source blob IDs and required checks are in the audit record.

Controls and data

The resizable native replacement needs the same arrangement:

Upstream control Role
IDC_COMMIT Editable revision at the top, initially the selected commit; reference completion
IDC_SELREF Adjacent chooser menu: Browse References, Log, Reflog
IDC_STATIC_SUBJECT Read-only abbreviated hash and subject; author/date tooltip after mailmap
IDC_LOG Show log for the resolved commit
IDC_LIST_REF_LEAFS Headerless multi-select list of full reference names, original tag/local/remote type icons
IDC_FILTER / IDC_LABEL_FILTER Bottom Filter field with clear affordance

The source query includes local branches, remote branches and tags containing the resolved commit, including descendant tips. Its CLI route uses branch -a --contains and tag --contains, normalizes symbolic remote names and omits the detached pseudo-branch. Its libgit2 route resolves symbolic refs and peels tags. Results use LogicalCompareBranchesPredicate ordering and deduplication. Native implementation must preserve literal reference spelling and handle nested tags; a tip-equality query would lose required functionality.

Revision edits and filter edits each debounce for one second. Filtering uses literal case-sensitive CString::Find. Clear filters immediately; clear previous rows and subject while loading. Busy/invalid/empty states gate Show log and Filter. F5 refreshes reference completion as well as the containment result. A macOS asynchronous adaptation must reject stale replies and cancel/reap owned reads on forced closure, rather than reproduce the source thread's error-path lifetime bugs.

Selection, menus and ownership

One reference offers Show log, Browse repository, Compare with working tree (only with a working copy), and Copy. Two references offer Compare revisions, Unified diff, both directed two-dot and symmetric three-dot Log ranges, and Copy. More than two references still support Copy. Preserve upstream menu order, separators and original icons. Range direction follows the last selected reference; comparison uses table order. Copy full names in list order with a trailing newline.

The top Show log uses the resolved commit, independently of list selection. Chooser acceptance updates the revision and reloads; cancellation preserves the entry and focus. Double-clicking a reference in the modeless child asks the parent Log to navigate to that reference. Command-A/Command-C belong to the list when it has focus. Escape clears a nonempty focused filter before closing the window.

The native workflow must keep its repository permission lease and route comparison, Log, browser and picker children through existing controllers. Busy and child-sheet gates, parent/child close cleanup, read cancellation, unchanged repository bytes, physical light/dark layout and signed sandbox acceptance all need direct evidence.

Native implementation checkpoint

Source: 1769e2c738e9b078e6c377205f5124b23bd010db. See the native verification record for exact checks, capture provenance and remaining acceptance.

CommitContainingReferences.swift pins the requested commit, reads mailmapped metadata and Git's configured abbreviation, and queries all containing local/ remote branches and tags with for-each-ref --contains. It reads stdout separately from diagnostics, includes symbolic remote HEAD and recursively nested annotations, ignores blob tags and other namespaces in containment, and preserves full exact reference identities. Reference completion includes the other namespaces too. Empty filters retain all rows; other filters use literal case-sensitive UTF-16 matching. Finder collation supplies natural ordering, with byte ordering for ties. This is a native adaptation, not certification of Windows punctuation/policy ties.

CommitContainingReferencesWindowController preserves the top revision/chooser, subject and Show log row, headerless colored reference list, and bottom Filter. It routes all one/two/many selection menus, range direction, comparisons, unified diff, copy and the three owned pickers through native controllers. Plain parent navigation selects; Shift highlights. Reads, deferred edits and late replies are owned by the child; forced parent closure cancels the child, while active picker sheets fence ordinary close and Quit. The original checkpoint refreshed completion with each query. A follow-up now loads it independently of commit validity, caches it for the dialog lifetime and reloads it on F5. Every locale/keyboard route has not been certified.

CommitContainingReferencesTests uses real repositories for descendant vs tip containment, nested tags, symbolic remote HEAD, blob-tag exclusion, mailmap, configured abbreviation, packed distinct Unicode refs, literal filtering, detached HEAD, bare repositories, invalid inputs, cancellation and byte preservation. scripts/test-commit-containing-refs.py compiles and runs a real hidden AppKit receiver with private preferences and disposable repositories. It checks actual menu target/action dispatch, one-second filter, Escape, owned Browse References/ Log/Reflog picker cancellation and reference acceptance, rejection of an obsolete reply ignoring cancellation, and the real parent Log table menu/close route. Actual native content captures were inspected in light and dark appearances. They show the corrected right-aligned Show log row and original colored icons; window chrome is excluded. These checks do not establish physical input, VoiceOver, installed Finder or signed sandbox acceptance.

Completion cache follow-up

The source’s m_bRefsLoaded check runs before it validates the revision. Native initial empty/invalid entries now also initialize completion. Ordinary revision queries update containment without rereading all reference names; F5 invalidates completion and reloads it while preserving the entered revision. Forced close and superseded queries reject stale completion publication as well as commit results.

Four Core tests pass with system, isolated old and packaged Git. The added test covers independent completion in an unborn repository, non-commit namespaces, cancellation and omitted repeated completion reads. The native receiver passes with system and packaged Git for initial empty/invalid completion, new references appearing in containment while completion stays cached, F5 refreshing completion without changing the entered revision, and restoration after deleting the fixture reference. Existing picker/menu/stale-result/close checks still pass. Source checkpoint: 9400d1d191bf52eef187db78dd1ee54e77bdd690. See the follow-up verification.

Completion-read failure follows the source’s ignored GetRefList status: cache an empty list, continue resolving a typed revision, and retry completion only on F5. The completion phase uses the same generation/cancellation checks as commit reads. Controlled completion failures and cancellation-ignoring completion replies now pass native checks with both engines: failed completion is cached without blocking a valid typed commit; F5 retries; replacement and close reject an obsolete reply. The completion-read counter stays unchanged for ordinary queries. Final native checkpoint: dc2d8d5c71a860b798bcb84a41ef6a2c239048cc.

Log navigation highlight (2026-10-11)

The owned Log parent now uses upstream italic/bold-italic navigation styling, including the default hash column. Its extended native receiver checks actual reference navigation alongside configured fonts and live search-match coloring. See Log highlight evidence for the scope. The containing-reference window layout and physical gesture/signed acceptance remain partial; these checks do not certify either dialog complete.

The Rebase history tools family reuses this native consumer with captured replay occurrences, inherited preferences and parent/read ownership. Its focused evidence does not certify every Log route.