Native dialog command-line entry
TurtleGit accepts the primary TortoiseProc dialog commands through its macOS app executable. These open the existing native dialogs with the same Git operations, menus, original command icons, review steps and cancellation ownership as normal app entry. Dialog commands use a standalone launch route: About, Settings and Git dialogs do not first open the repository workspace. Launching a dialog does not accept its Commit, Revert or Resolve action.
Use a new Launch Services instance when invoking an installed application from a
shell. open does not reliably deliver new startup arguments to an already running
process. Always supply absolute paths with open; Launch Services chooses the
application's working directory independently of the calling shell.
open -n -a 'TurtleGit for Mac' --args --command=commit \
--path '/absolute/repository' --logmsg 'Describe the change'
open -n -a 'TurtleGit for Mac' --args /command:repostatus \
'/path:/absolute/repository'
open -n -a 'TurtleGit for Mac' --args --command=log \
--path '/absolute/repository' --range 'main..topic' --limit '50'
The direct app executable also accepts arguments; relative paths are resolved against that process's working directory. For example:
'/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac' \
--command=diff --path '/absolute/repository/file.txt' \
--startrev 'HEAD~1' --endrev 'HEAD'
Supported commands and presets
| Command | Native destination | Presets |
|---|---|---|
commit |
Commit | logmsg or logmsgfile, bugid, wholeproject |
repostatus (status alias) |
Working Tree | Selected file/directory scope |
log |
Log Messages | startrev, endrev, deprecated revstart/revend, overriding range, selected rev, limit, findstring, findtype, findtext, findregex, outfile |
diff |
File Compare, or Working Tree for a directory | submodule for a gitlink dialog, path2 for standalone or paired historical files, paired startrev/endrev for historical comparison, alternative for the configured alternative tool, unified, line |
revert |
Revert review | Selected file/directory scope |
resolve |
Resolve review | Selected conflict/file/directory scope |
Both /command:commit /path:... and --command=commit --path ... work.
Native valued options accept --name=value or --name value. Legacy valued
options require /name:value. Flags have no value, for example /wholeproject
or --wholeproject. Names are case insensitive; user values retain their spelling.
Without path, the application's current directory is selected.
Repeat --path to select literal names containing *, spaces, Unicode or newlines.
Legacy /path retains TortoiseProc's * selection delimiter. Normal shell quoting
is required; TurtleGit never evaluates a command's message or path as shell code.
path2 needs one primary selection. Without revisions it compares two different
standalone files; with paired startrev/endrev it compares primary-at-start
with path2-at-end, including the same path at two revisions.
Log limits accept a nonnegative commit count (0 means unlimited), or a positive
number followed by week(s), month(s) or year(s). The existing history model
uses the source's fixed 7/30/365-day units. An omitted start endpoint in endrev
is a tip; startrev alone means startrev..HEAD. range overrides both.
rev selects a resolved commit without replacing the requested history range.
findtype is a decimal upstream mask: messages=1, paths=2, authors=4,
revisions=8, bug IDs=32, subject=64, reference names=128, emails=256, notes=512,
annotated tags=1024; 65535 selects all fields. The reserved regex bit is not a
search field. findregex wins over findtext, as upstream does.
A message file is read only after obtaining permission for that exact file or a containing folder. Reads are cancellable and limited to regular files of at most 16 MiB. UTF-8 decoding follows the pinned upstream text reader, including malformed sequence replacement and a BOM as content. Inline and file messages are mutually exclusive, including an explicitly empty inline message. Message and issue presets survive initial template loading. A second invocation in the same process refuses to replace an existing Commit draft. Log invocations use independent windows.
Inaccessible repository diagnosis
The inaccessible command opens a diagnostic for one selected repository folder
without requiring successful repository adoption:
open -n -a 'TurtleGit for Mac' --args --command=inaccessible \
--path '/absolute/repository'
It reports the library's repository-open result. Launching the command does not
trust the folder or change configuration. When eligible, a separate explicit
trust action adds that exact folder to Git's global safe.directory entries.
The configuration directory may require its own macOS permission. Folder access
and Git ownership trust are separate decisions. An explicit Retry reopens the
selected repository; it does not accept the original Git operation. See the
source contract and current acceptance scope.
Permissions, lifetime and remaining parity
Arguments carry requests, not sandbox permissions. Repository launches reuse an existing authorized session/bookmark or ask for the containing repository. External message files and standalone Diff files use their own access requests. Cancelling a picker stops that launch. Repository adoption, metadata permission prompts and Git reads retain their existing cancellation/lifetime ownership. Startup arguments are consumed once after both application launch and workspace model readiness, regardless of their ordering.
Unknown commands, duplicate scalar options and incompatible or unsupported
switches produce an error in the workspace. They are not silently ignored.
This is a partial command-family port, not full TortoiseProc CLI compatibility.
Remaining entry behavior includes shared Windows HWND/group/taskbar/close-on-end
options, process exit/result signaling, and commands outside the documented families.
Windows paths must be converted to macOS paths by the caller. Full symbolic
Working Copy sentinel, permissive _wtoi parsing and every revision-expression
edge case are not claimed; malformed/incomplete native input is diagnosed.
Opening many instances with open -n is the caller's choice, not a test policy.
Reviewed source is pinned at
7338078f8ddd924b8cddee35f512f2286072136d:
src/TortoiseProc/Commands/{Commit,Log,Diff,Revert,Resolve,RepoStatus}Command.cpp,
src/TortoiseProc/GitLogListBase.h, src/Utils/StringUtils.cpp and
src/Utils/UnicodeUtils.{h,cpp}. Existing dialog layout reviews remain partial;
command dispatch does not certify all-dialog visual or functional parity.
Path-list input and Log revision output
All documented commands also accept pathfile in place of path. UTF-8 (with optional
BOM), UTF-16 with a BOM, and unmarked UTF-16LE detected by zero bytes are read as
newline-separated paths. Use a BOM for unmarked wide text that could also be UTF-8;
a completely non-ASCII wide list without zero bytes is ambiguous to auto-detection. CRLF is accepted; blank lines are skipped. Paths keep
spaces and * literally. Relative entries use the app process's working directory.
For filenames containing newlines, the native pathfile0 flag selects NUL-separated
UTF-8 records instead. The list is limited to 16 MiB and 4096 selections. Supplying
both path and pathfile is an error.
open -n -a 'TurtleGit for Mac' --args --command=commit \
--pathfile '/absolute/selection.txt' --logmsg 'Describe the change'
open -n -a 'TurtleGit for Mac' --args --command=log \
--path '/absolute/repository' --outfile '/absolute/selected-commit.txt'
deletepathfile explicitly removes the input list after a successful read and
validation, before repository dispatch, as TortoiseProc does. Invalid/cancelled
reads preserve it. Deletion requires permission for its containing folder, refuses
a symlink list, and checks the opened file identity before unlinking. The file's
contents still grant no access to the repositories they name; normal repository
permission is acquired separately. Input preparation owns its cancellation and
retains the grant until the worker has finished.
Log's outfile opens the normal single-commit picker. Accept writes only the
chosen commit's UTF-8 hash, without a BOM or newline; Cancel writes an empty file,
including replacing an existing output. The output folder must be authorized
before the picker opens. Results are written atomically once, retaining permission
through completion; Quit waits for outstanding command-file work. Closing the
initiating workspace cancels outstanding work before its write starts. An atomic
write already underway can finish. This is a file-result protocol; a process-exit
status protocol is still separate work.
Unified Diff and initial source line
For a file, Diff's unified flag opens the configured unified viewer, including
its alternative-tool choice, with the captured revision pair or HEAD-to-working
comparison. The built-in viewer keeps the existing coloured editable patch,
Find and Save As commands. A directory still opens Working Tree, following source
command precedence unless submodule is supplied. Historical path2 keeps the
file comparison route even with unified; standalone path2 keeps its existing
file pair route.
open -n -a 'TurtleGit for Mac' --args --command=diff \
--path '/absolute/repository/file.txt' --unified --startrev 'HEAD~1' --endrev HEAD
open -n -a 'TurtleGit for Mac' --args --command=diff \
--path '/absolute/repository/file.txt' --line 120
A positive line requests a one-based destination source line after native text
alignment is ready; a value beyond the source is clamped to its last line. Zero
keeps normal initial navigation. The range uses source UTF-16 coordinates, keeping
Unicode, line endings and aligned gaps distinct from display rows. A line launch
gets its own comparison window, preserving an existing editor's work. External
Diff tool argument templates receive %line; zero is supplied when no line was
requested. Unified, image and submodule viewers have their own navigation and do
not consume a native text-line request.
Clone, transport and reference dialog launches
These commands open their ordinary native options or browser window. No Clone, Fetch, Pull, Push, branch/tag creation, checkout or replay is accepted merely by passing an argument. The windows retain the normal coloured source icons, settings, captured actions, progress, authentication and cancellation behavior.
| Command | Editable launch presets |
|---|---|
clone |
url, exactpath; path is the destination folder |
fetch |
remote |
pull |
Normal Pull defaults for the requested repository |
push |
branch selects the source |
branch, tag |
rev base, name |
switch |
rev |
refbrowse |
Reference browser at the requested repository |
repobrowser |
rev, defaulting to HEAD |
reflog |
ref, defaulting to HEAD |
rebase |
upstream, force |
open -n -a 'TurtleGit for Mac' --args --command=clone \
--url 'https://example.invalid/team/project.git' \
--path '/absolute/project' --exactpath
open -n -a 'TurtleGit for Mac' --args --command=branch \
--path '/absolute/repository' --rev HEAD --name 'topic/new-work'
open -n -a 'TurtleGit for Mac' --args --command=rebase \
--path '/absolute/repository' --upstream 'refs/heads/main' --force
Clone's exactpath suppresses automatic destination naming, including after URL
edits, following CCloneDlg::OnURLChange. Without it, normal destination-name
suggestions remain active. Launching Clone neither creates the destination nor
authorizes its contents; the existing Clone workflow obtains permissions when
needed. Explicit Branch/Tag names survive asynchronous base suggestions. Rebase's
Force flag affects the editable initial plan and survives deferred preparation;
a recovering operation keeps its saved session state. Another CLI Rebase request
focuses an existing Rebase dialog and asks that it be closed before applying new
presets, preserving its current plan.
Fetch, Pull and Push accept multiple repository roots through repeated literal
--path or a path file. Original order and repeated roots are retained, matching
upstream's orgPathList; repeated inputs still use the multi-root rules. Each
item must be an actual working-tree root or bare-repository root. Invalid files,
subdirectories and non-repositories report preparation errors and are skipped so
later roots can still be handled. A single repository request retains normal
in-repository selection behavior.
The batch presents one actual options dialog at a time, with its own repository,
access lease and captured presets (remote for Fetch, branch for Push). No
transport starts until the user accepts its options. Cancelling or failing one
repository does not prevent later roots. The next root waits for the current
dialog, operation/result, sheets and source-modal follow-up chain to finish.
Independent source commands, such as Log or Commit launched from a result, keep
their own windows and do not hold the transport queue.
| Result action | Batch behavior |
|---|---|
| Fetch/Pull/Push again, Retry, Reset, Switch or Rebase | Finish this repository's workflow before advancing |
| Stash Save, Stash Apply/Pop, Request Pull or mail after Rebase | Finish the connected source-modal workflow before advancing |
| Log, Commit, Resolve, comparison, Submodule Update or Commit Superproject | Open independently, matching upstream's separate-process command |
Existing primary grants can cover roots separately; otherwise the batch uses an owned asynchronous folder chooser. Declining the batch's access request stops it. A chooser reply never grants access after cancellation or owner closure. Closing or replacing the initiating workspace or quitting cancels the current owned workflow and stops the remaining queue, retaining worker/grant accounting until actual drainage. A later command or Service cannot retarget a pending batch. The transport batch evidence records the verified scope and remaining installed/signed acceptance.
Source review for this continuation covers
Commands/{Clone,Fetch,Pull,Push,Branch,Tag,Switch,RepositoryBrowser,RefLog,Rebase}Command.cpp,
Commands/RefBrowseCommand.h and CloneDlg.cpp, at the same pinned upstream
commit. Windows URL-protocol registration and every legacy command/shared switch
remain outside this continuation; unsupported options still report an error.
Source-file actions and annotation launches
| Command | Source behavior and native destination |
|---|---|
blame |
One file; endrev selects a historical revision (HEAD by default), line selects a one-based source line |
prevdiff |
One file or directory; unified, alternative for file viewers |
add |
File-only selections start Add progress; a directory opens the scoped Add checklist |
rename |
One selected path opens the existing Rename input/progress workflow |
remove |
Selected files/directories open the normal Remove confirmation; keep removes from the index while retaining local files |
open -n -a 'TurtleGit for Mac' --args --command=blame \
--path '/absolute/repository/file.txt' --endrev 'HEAD~2' --line 40
open -n -a 'TurtleGit for Mac' --args --command=prevdiff \
--path '/absolute/repository/file.txt' --unified --alternative
open -n -a 'TurtleGit for Mac' --args --command=add \
--path '/absolute/repository/new folder'
open -n -a 'TurtleGit for Mac' --args --command=remove \
--path '/absolute/repository/file.txt' --keep
These commands also support the path-list input, authorization and explicit list
removal described above. Blame, Previous Diff and Rename require one path,
including after reading a list; invalid cardinality preserves a deletepathfile
input. Native --path arguments keep shell-quoted asterisks and Unicode literal.
Blame commands use separate viewers, preserving another viewer's selection and
settings. The requested source line is selected and scrolled after annotation
loads; values beyond the file clamp to its final line. Empty endrev selects
HEAD. Native Blame's existing annotation, Log/source menus and colored margins
are reused. Bare working-tree entry remains disabled. The Windows Working Copy
sentinel and separate TortoiseGitBlame executable's entire argument protocol are
not implemented by this TortoiseProc-style entry family.
Previous Diff chooses the second history entry for the selected file, then
compares it with working bytes; unrelated later commits do not change that base.
A directory opens Changed Files from HEAD~1 to Working tree. Its directory
precedence ignores the file-only unified/tool choice, matching PrevDiffCommand.
Repository-open cleanup preserves the busy owner acquired by a comparison while
its question or Git reads are pending. Insufficient history reports the existing
error. Unified file requests use the
ordinary configured unified viewer (including the alternative tool), or the
built-in colored patch document. Ordinary file requests use the existing native
comparison/editor workflow and external-tool preference.
Add follows the source's immediate file-only behavior: invoking it for files is
an instruction to stage those files after authorization. No further checklist is
shown. A missing selected tracked file stages its deletion; an unknown missing
path reports a progress error. Directory selections open the checked Add list and
wait for OK. A new directory command refuses to replace an existing Add draft.
Preparation captures the repository, permission and initiating window, participates
in Quit ownership, and rejects a late reply after window closure or termination.
An explicit repository switch while preparation runs preserves the captured Add
repository; its completion cannot overwrite the new workspace's output.
noui is rejected: its upstream implementation is inactive and this port does not
silently reinterpret it as permission for a different operation.
Rename keeps an existing input draft for the same path; it runs only after OK.
Remove uses the existing source-style Remove/Abort question, defaulting to Abort,
and preserves the existing progress, Ignore/Abort errors and cancellation behavior.
keep is accepted only with Remove. New commands do not implicitly accept Rename
or Remove confirmation. Repository/file content is passed as Git arguments rather
than evaluated shell text.
Reviewed pinned handlers: Commands/{Blame,PrevDiff,Add,Rename,Remove}Command.cpp,
AppUtils.cpp::LaunchTortoiseBlame, Git/TGitPath.cpp::AreAllPathsFiles and
TortoiseGitBlame/TortoiseGitBlameDoc.cpp. Existing dialog layouts/icons and
backend operations are reused. This adds entry paths; it does not certify complete
source dialog, signed sandbox or process-exit protocol parity.
Repository creation, Cleanup and Ignore
| Command | Native behavior |
|---|---|
repocreate |
One destination folder opens Create Repository, including a new folder inside an authorized existing parent |
cleanup |
Selected files/directories open Cleanup options; files use their containing directories |
ignore |
Selected paths open Ignore; onlymask selects extension patterns and delete asks about removal after writing rules |
open -n -a 'TurtleGit for Mac' --args --command=repocreate \
--path '/absolute/parent/new-repository'
open -n -a 'TurtleGit for Mac' --args --command=cleanup \
--path '/absolute/repository/generated folder'
open -n -a 'TurtleGit for Mac' --args --command=ignore \
--path '/absolute/repository/generated.tmp' --onlymask --delete
These commands accept the common path-file input as well. repocreate requires
one destination, including after reading a list; invalid input is preserved when
deletepathfile was requested. Source Create Repository has no bare command
switch: the native dialog offers that option, with the existing .git destination
name default. Opening it does not initialize or reinitialize Git before OK.
Normal and bare completion reuse the owned workspace handoff described in
Clone parity.
A sandbox destination needs permission for both its folder and the existing working directory from which Git creates it. A containing-parent grant supports new nested folders without changing the requested destination. Folder choice belongs to the initiating workspace, blocks Quit while pending, and consumes its reply once. Cancel, workspace closure and termination reject late replies. A new request preserves an outstanding chooser. Closing a Create dialog before acceptance leaves Git unchanged; user-created folders in the system picker follow macOS's normal behavior.
Cleanup opens the existing options, type/directory defaults and progress workflow;
it never accepts an operation from command arguments. Its flags remain native
controls: dryrun, delete policy and other invented command switches are diagnosed
rather than silently accepted. A second Cleanup launch preserves the open dialog's
scope and edited options. The common Git runner already uses literal pathspecs,
so selected names containing brackets/asterisks keep their normal file meaning.
Dry run retains files; accepted removal uses the existing preview, Trash/permanent
choice, metadata permissions, progress and cancellation handling.
Ignore opens the existing scope/destination radio groups and waits for OK. With
onlymask, the rule uses the selected extension. With delete, ignore rules are
written first, then the source-style Keep file locally? question controls removal
from the index or also from disk. Errors retain the existing per-path Continue/
Abort and summary behavior. Changing the destination and reopening the same
request preserves that draft. No new Keep prompt is bypassed by the CLI flags.
Linked worktrees resolve info/exclude through Git's common metadata directory.
An already-retained metadata grant authorizes that destination; a primary folder
grant alone does not. Ignore/removal selections and duplicate-rule detection retain
exact UTF-8 spellings, including canonical Unicode peers. Existing ignore comments,
line endings and unchanged bytes survive append. The source handlers reviewed are
Commands/{CreateRepository,Cleanup,Ignore}Command.cpp, CleanTypeDlg.cpp and
AppUtils.cpp::IgnoreFile. Full Windows process/shared-switch protocol, signed
sandbox acceptance and every native visual comparison remain open.
Merge and Stash command entry
| Command | Native workflow | Source presets |
|---|---|---|
merge |
Merge review, native reference/Log choosers and owned progress | abort opens Abort Merge instead |
stashsave |
Stash Save review and owned progress | msg supplies the editable message, including an explicitly empty message |
stashapply |
Apply the latest stash, then the source result question | No revision or message switches |
stashpop |
Pop the latest stash, then the source result question | No revision or message switches |
stashlist |
RefLog with refs/stash selected |
Existing stash inspection, Apply and guarded deletion menus |
'/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac' \
--command=stashsave --path '/absolute/repository' --msg 'Before integration'
'/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac' \
--command=merge --path '/absolute/repository' --abort
The source Merge command supplies no revision/message option: choose them in the native dialog. Merge, Abort and Stash Save wait for their native acceptance. Apply and Pop are operation commands and run after repository authorization; they retain existing progress, cancellation, conflict/result questions and View Changes handoffs. Apply retains the stash; successful Pop removes it. Selections and common path-file input locate the repository rather than limiting these repository-wide operations to individual files.
A repeated Merge or Stash Save command brings its command-owned draft forward without replacing edited options or the message. Repeated Abort entry reuses the open repository review. Stash Save warnings capture their own request identity; a cancelled or already-consumed reply cannot accept a newer warning snapshot. A pending stash mutation refuses a competing Apply/Pop launch and an already-open Save draft's acceptance until that operation settles. This is a native workspace ownership guard, not an external-process Git lock or a global cross-workspace transaction system.
Merge, Abort, Save and Restore use their owning workspace's preferences for
message history, progress, output and result prompts. Post-operation callbacks
retain their original repository and update the workspace output only while it
still displays that repository. The dialogs retain existing native controls,
source icons, choices and post-actions. Source review:
Commands/{Merge,Stash}Command.cpp, Commands/Command.cpp and
AppUtils.cpp::{Merge,MergeAbort,StashSave,StashApply,StashPop} at the pinned
revision. Complete process result/shared-switch compatibility and physical/signed
acceptance remain open.
Patch series, archive and mailbox entry
| Command | Native destination | Presets |
|---|---|---|
formatpatch |
Create Patch Serial | startrev alone selects Since and presets inactive From/To to startrev~1/startrev; paired startrev/endrev selects Range |
export |
Export ZIP | rev selects the revision; one selected directory presets subtree export |
importpatch |
Import Patch mailbox list | droptarget selects the destination repository independently of input files |
An end-only Format Patch value leaves the dialog defaults, as in the source. An empty start value also leaves defaults. Export accepts one selected file or directory, including after reading a path list. These commands open native review controls; they do not generate archives/patches or apply commits before acceptance. Repeated command entry preserves edited Format Patch and Export drafts. Log's separate preset windows remain available.
'/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac' \
--command=formatpatch --path '/absolute/repository' \
--startrev 'HEAD~3' --endrev HEAD
'/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac' \
--command=importpatch --path '/absolute/mailboxes/series.mbox' \
--droptarget '/absolute/repository'
Import authorizes the selected input files independently of the repository.
Existing live grants can cover multiple selected inputs; retained per-file grants
reach preview, mailbox application and existing viewer/mail handoffs. Source
command input accepts every non-directory file, including mailbox names without
.patch or .diff. Reopening the same repository list preserves options, row
identities/check states and order, and appends only new exact paths. A busy Import
owner refuses list changes. No mail is sent by opening these commands.
Without droptarget, Import discovers the first selected path's repository when
its containing folder can be probed. Otherwise an owned native repository chooser
asks for the destination. A file-only grant does not authorize probing its parent
Git metadata. Cancelling a file grant or repository choice stops the launch.
Pending preparation blocks Quit/replacement; duplicate or late native replies,
closure of the initiating window and termination cannot adopt a repository or
open an Import window. An explicit Git metadata target is rejected. The normal
metadata-permission and bare-working-tree guards still apply during adoption.
Format Patch, archive Export and Import consumers receive owning workspace
preferences. Output-folder authorization, native options, progress, cancellation,
error/recovery and source icons remain their existing workflows. Source review:
Commands/{FormatPatch,Export,ImportPatch}Command.cpp and
AppUtils.cpp::Export, at the pinned revision. Complete Windows process protocol,
physical chooser/keyboard/layout and signed sandbox acceptance remain open.
Stateful Bisect entry
bisect accepts source start, good, bad, skip, reset and ref options.
Good/Bad distinguish a missing option from a present empty value. Native syntax
accepts --good, --good=revision or --good revision; legacy syntax uses
/good or /good:revision. Start/Skip/Reset are flags without values. Common
path-file input retains the complete request while locating its repository.
'/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac' \
--command=bisect --path '/absolute/repository' --start \
--good 'known-good' --bad 'known-bad'
'/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac' \
--command=bisect --path '/absolute/repository' --good --ref HEAD
Routing reads Git's actual session state before deciding the operation. With no active session, Start opens the two-revision review and applies its editable Good/Bad presets; empty Bad retains the native branch/HEAD default. It does not start before native OK. Reopening an existing Start review preserves edited inputs. Dirty tracked files retain the existing Stash/Abort acceptance path.
With an active session, the source priority is Good, then Bad, then Skip, then
Reset. Presence selects Good/Bad; their values are Start presets, while ref
selects the commit for an active classification. Empty or omitted ref means
current HEAD. Reset ignores ref and restores the session's original revision.
An active start combined with an operation flag follows that operation;
start alone while active is refused. No operation flag without Start while
inactive is accepted. Requests with no applicable operation report the source
“Operation unknown or not allowed.” result without mutating Git.
Good/Bad delegate to the session's custom Git terms. Active operations use the
existing owned progress, cancellation/recovery and continuation controls. A live
picker or operation refuses a competing command rather than queuing it. Invalid
state still publishes the recovered session so Reset remains available. Owning
workspace preferences reach progress/pickers; retired windows refuse late work.
Source review is pinned Commands/BisectCommand.cpp and
AppUtils.cpp::{BisectStart,BisectOperation}. This does not establish all legacy
argument permissiveness, cross-process locking, physical interaction or signed
App Store acceptance.
Submodule Add, Update and Sync entry
| Source command | Native destination and inputs |
|---|---|
subadd |
One selected path opens Submodule Add; an ordinary file supplies its containing directory. Repository/Path histories and key controls remain editable; Add runs only after OK |
subupdate |
bkpath selects the discovery base; otherwise use the first selected path's parent. The nearest repository must contain .gitmodules. Selected directories filter the module list; selectedpath supplies a relative initial selection |
subsync |
The same superproject lookup and optional bkpath; immediately opens the existing Sync progress workflow. Selected directories run in order, ordinary files are skipped, and a file-only selection does not become whole-project Sync |
open -n -a 'TurtleGit for Mac' --args --command=subadd \
--path '/absolute/project/vendor'
open -n -a 'TurtleGit for Mac' --args --command=subupdate \
--path '/absolute/project' --bkpath '/absolute/project' \
--selectedpath 'vendor/library'
open -n -a 'TurtleGit for Mac' --args --command=subsync \
--path '/absolute/project/vendor/library'
For root-folder requests, pass bkpath explicitly: the pinned handler's default
is the selected path's parent. Lookup stops at the nearest repository; a child
repository without .gitmodules does not search past its own boundary. The app
requires a folder grant covering the selected paths, discovery base and resolved
superproject. Neither a CLI path nor bkpath grants access. An outside selection,
missing superproject, insufficient grant or declined authorization stops dispatch.
Path-list input derives its default base after reading the list, and invalid
single-path Add lists are retained even with deletepathfile.
selectedpath is relative to the superproject and rejects absolute/traversing
paths. Legacy /selectedpath: converts Windows separators to /; native
--selectedpath retains literal backslashes. A requested selection is intersected
with the configured paths in the filtered list. Whole Project and persisted
Update options retain the ordinary dialog behavior. Existing Add/Update drafts
are focused and preserved when another command arrives, with an explicit error;
active Add/Update/Sync progress owners refuse a competing command for the same operation. No command
implicitly accepts Add or Update. Sync follows its immediate source semantics.
All entry routes reuse the native source-layout forms, original action icons,
owned Add key/source/path sheets, option persistence, progress/cancellation and
Update's Bisect post-actions. Workspace preferences now reach all three dialog
and progress families. Source review covers pinned Commands/SubmoduleCommand.cpp,
Git/GitAdminDir.cpp::GetSuperProjectRoot and the existing Add/Update resources.
The batch evidence records grouped checks
and limits. Physical interaction, external metadata/security-scope grants,
network/key execution and signed App Store acceptance remain separate work.
Synchronization and SVN entry
| Source command | Native behavior |
|---|---|
sync |
Opens Git Synchronization for the authorized working tree; seq supplies source startup placement sequencing |
svnfetch |
Starts the existing SVN Fetch progress workflow and exposes fetched Diff/Log post-actions when the upstream changes |
svnrebase |
Runs the existing tracked-change Stash question, SVN Fetch, and up-to-date / fast-forward / native Rebase continuation |
svndcommit |
Opens the normal DCommit Type options unless this repository has a remembered type; Remember and Git Style retain their ordinary semantics |
svnignore |
Opens Import SVN Ignore's destination choices and waits for OK before overwriting exclude or creating .gitignore |
open -n -a 'TurtleGit for Mac' --args --command=sync \
--path '/absolute/project' --seq 3
open -n -a 'TurtleGit for Mac' --args --command=svnfetch \
--path '/absolute/git-svn-project'
open -n -a 'TurtleGit for Mac' --args --command=svndcommit \
--path '/absolute/git-svn-project'
All five accept the common path-list input and require an authorized working tree; bare repositories are refused. SVN also retains its existing runtime/remote validation. Fetch/Rebase are immediate source operations after those checks; DCommit follows its saved type/options and Ignore retains explicit acceptance. These are not silent option-bypass commands. Unsupported command-specific options report an error. Network authentication, permission and progress ownership remain in their existing native workflows.
seq accepts a signed 32-bit integer only with sync. With the advanced
Randomize Sync Dialog startup position setting enabled, positive sequences
use the source modulo-five, 30-point offset and 150-point wrap, constrained to the
macOS visible screen. Zero, negative or omitted CLI values add no offset. Ordinary
in-app Sync launches retain their native placement sequence. Another request
focuses an existing Sync review without moving it or replacing edited inputs.
Workspace preferences reach both Sync and SVN forms/progress.
An existing SVN options draft, active operation, cancellation decision, attached sheet or controller question retains its owner. This includes a question still held by an otherwise finished operation. A competing operation focuses that window and reports that the current workflow must finish. Repeated same-operation options requests preserve fields; a completed, question-free workflow can be replaced by another operation. No request implicitly accepts an existing draft.
Reviewed pinned handlers are Commands/{Sync,SVNFetch,SVNRebase,SVNDCommit,SVNIgnore}Command.cpp,
SyncDlg.cpp placement and AppUtils::SVNDCommit; the existing native resource
forms/icons are reused. Dated evidence
records actual Git state checks with private injected SVN transport, selected
native checks and remaining limits. It does not certify public SVN transport,
physical interactions, signed grants, complete source dialogs or App Store use.
Historical comparison, Cat, references and Graph output
| Source command | Native destination and inputs |
|---|---|
showcompare |
One selected file/directory; revision1 is the base and revision2 the destination, with unified and alternative viewer selection |
cat |
One selected historical file or blob context; required revision and savepath publish the filtered file bytes after repository/output authorization |
commitisonrefs |
Opens an independent References commit is on window; optional rev supplies the editable revision, while empty/omitted input remains blank |
revisiongraph |
Opens Revision Graph normally; nonempty output loads/renders a separate hidden graph and writes the selected format |
open -n -a 'TurtleGit for Mac' --args --command=showcompare \
--path '/absolute/project/file.txt' --revision1 'HEAD~1' --revision2 HEAD
open -n -a 'TurtleGit for Mac' --args --command=cat \
--path '/absolute/project/file.txt' --revision HEAD \
--savepath '/absolute/output/file.txt'
open -n -a 'TurtleGit for Mac' --args --command=commitisonrefs \
--path '/absolute/project' --rev HEAD
open -n -a 'TurtleGit for Mac' --args --command=revisiongraph \
--path '/absolute/project' --output '/absolute/output/history.svg'
ShowCompare's native directory route uses Changed Files; a file opens the existing
comparison viewer, and Unified uses the owned configured unified-viewer path.
An empty/omitted side, or a 40/64-zero working-copy sentinel, selects Working tree;
this port currently requires at least one actual revision. Both-working/empty
source requests remain a command parity gap. Commit/tree revisions retain the
normal comparison resolver. Bare repositories can compare two historical sides;
a Working tree request there reports the existing error. Native literal paths
retain spaces, Unicode and glob characters; legacy /path: still uses * to
separate selections. Cat and ShowCompare reject multi-path lists before an
explicitly requested input-list deletion.
Cat resolves its revision/object once, peels tags and reads an exact blob path
from a commit/tree, or accepts a direct blob/object expression such as
HEAD:path with spaces. Git's cat-file --filters --path=… supplies checkout
filters/EOL conversion using the selected path, matching the filtered-file
workflow rather than checking out a file or changing the index. This is a native
Git adaptation of CatCommand's blob/GetOneFile branch; it does not reproduce all
Windows CLI-versus-libgit2 backend differences. Deleted directories, current file/directory collisions and bare
virtual file paths discover an existing authorized directory before Git runs.
Custom filters can invoke their configured helpers and retain ordinary sandbox
restrictions; public LFS/filter/Keychain acceptance is separate.
savepath and Graph output require their own parent-folder permission. Bytes
are staged in a private file and published with one directory-relative atomic
rename only after the initiating native owner remains valid. Closing that owner
or terminating its workspace cancels the read/render/staging work. A failed or
cancelled operation preserves an existing destination; temporary files are
removed. This deliberately avoids upstream Cat's error-path destination deletion.
The owner retains both repository and output scopes through completion and
participates in Quit accounting. Separate concurrent external writers are not
serialized by this local ownership mechanism.
Graph output selects SVG, GV/DOT, PNG, JPEG, BMP, GIF or native PDF from the file
extension, with the same graph model, fonts, colors and export renderer as Save
Graph As. An extensionless output or an unknown suffix appends .jpg and uses
JPEG, matching the source fallback. For example, --output history.custom
writes history.custom.jpg. Output authorization names that final path before
rendering or writing. Windows WMF/EMF are refused before output permission or
writing; PDF provides the native vector alternative, and metafile graph writing
remains unported. Hidden
output owns a separate graph and does not retarget an existing interactive graph.
A normal Graph command reuses its existing view and preserves its filters.
Standalone containing-reference windows retain independent editable input, filter, source icons, reference actions and pickers. Show Log, Browse, comparison, unified output and navigation have workspace consumers using the captured repository/access. Closing a window retires its reads and any later unified handoff. The application remains running after Cat/hidden Graph completion; Windows' separate TortoiseProc process-exit/return-code contract is not implemented by this native application entry path.
Pinned review covers Commands/{ShowCompare,Cat,CommitIsOnRefs,RevisionGraph}Command.cpp,
GitDiff::DiffCommit, FileDiffDlg, unified launch and Graph save/hidden completion.
Batch evidence separates actual byte/Git/native
checks from full dialogs, filters, physical/signed and App Store acceptance.
Git LFS commands
| Command | Behavior | Options |
|---|---|---|
lfslocks |
Open/focus the server-wide LFS Locks list | shared path/path-file inputs |
lfslock |
Lock the selected literal files through native progress | shared path/path-file inputs |
lfsunlock |
Unlock the selected literal files through native progress | force, shared path/path-file inputs |
open -n -a 'TurtleGit for Mac' --args --command=lfsunlock --force \
--path '/absolute/repository/large asset.bin'
Lock and Unlock are direct action commands and start their selected batch after
repository authorization. They do not add a separate confirmation absent from
upstream. Only Unlock accepts Force. Failed Unlock offers the existing explicit
Force retry for the captured paths. Selection validation finishes before the
first remote mutation; cancellation cannot undo locks already changed remotely.
The list preserves an existing window's checks and Force draft. Its server-wide
locks query follows pinned LFSLocksDlg/GitStatusListCtrl, even when entry was
through one file. Directory LFS actions are refused. Direct commands accept
missing/unversioned literal files and leave per-file eligibility to Git LFS;
Finder's cached menu entry additionally revalidates versioned targets.
These commands inherit the owning presentation settings and existing native progress icons, Log/Pull post-actions and result review. Delayed preparation is cancelled when its launching window closes or the workspace retires. Local injected-reply checks do not establish a real authenticated LFS provider or signed Finder integration; see LFS parity.
Worktree creation and management entry
| Command | Native workflow | Options |
|---|---|---|
worktreecreate |
New Worktree | one repository path or shared path-file input |
worktreelist |
Worktree List | one repository path or shared path-file input |
dropworktreecreate |
New Worktree with a dropped-folder destination preset | required droptarget, one source repository |
open -n -a 'TurtleGit for Mac' --args --command=worktreelist \
--path '/absolute/repository'
open -n -a 'TurtleGit for Mac' --args --command=dropworktreecreate \
--path '/absolute/source.git' --droptarget '/absolute/destination-folder'
These entries open the existing source-style forms and do not accept creation or
management actions. Normal creation proposes <repository>-worktree, or strips
.git from a repository ending in that suffix. Drop creation appends the source
repository basename to droptarget, stripping .git; if that would propose the
source repository itself, it keeps the drop folder. Preset construction is lexical
and does not probe or authorize the external destination. Bare repositories can
create linked checkouts through the same native form.
A competing Create/drop command focuses an existing creation form, manager-owned Add child or progress review, preserving its input and captured operation. List entry reuses its current manager and preserves active management/review state. Forms, pickers, progress and manager children inherit the owning preferences.
On OK in a scoped build, a typed destination outside existing grants asks for the
worktree directory or an existing parent folder. It captures destination and Git
options before that chooser; Cancel, wrong-folder replies and late replies after
closure cannot start a mutation. No destination grant is inferred from droptarget.
The source and destination permissions remain held through Git execution, and
Submodule Update retains both the new checkout and its external source metadata.
A created checkout queues a manager refresh through current child/result review.
The command is available for integration callers. Automatic Windows-style Finder drag-menu interception is not implemented by this entry route. Lexical source self-comparison does not certify all case/normalization/symlink-alias spellings. Physical Finder, signed access and complete visual parity remain open; see Worktree parity and evidence.
Request Pull and Send Mail entry
| Command | Native workflow | Inputs |
|---|---|---|
requestpull |
Request pull | one repository; optional editable endrev and url |
sendmail |
Send Patch options/progress | ordered file paths or a shared authorized path file |
open -n -a 'TurtleGit for Mac' --args --command=requestpull \
--path '/absolute/repository' --endrev topic --url '/absolute/published.git'
open -n -a 'TurtleGit for Mac' --args --command=sendmail \
--path '/absolute/1.patch' --path '/absolute/2.patch'
Request Pull preserves the source's editable end revision and repository URL; missing/empty presets retain saved history/defaults. A later command focuses its existing command window and preserves its options, picker, generation and mail handoff. Normal independent app entry remains separate. No request is generated until OK. The owning settings govern the form, history, Start Log and mail route.
Send Mail uses the original ordered file list, including duplicate occurrences,
matching SendMailCommand::orgPathList. Finder's selection remains deduplicated.
Native repeated paths preserve literal asterisks/newlines/Unicode; legacy /path:
uses its * separator. Path files retain order/duplicates and the usual bounded,
authorized read and explicit optional deletion. No extension/existence filter narrows the
original file list. Missing paths or directory entries remain visible and can be
unchecked; acceptance reads/prepares only checked files, so a bad unselected entry
does not block the valid selection. Opening the options does not send or prepare a
message in another app.
File preparation captures its launching window, settings, selected files and permission state. Scoped builds use an owned native files/folders chooser; Cancel, wrong grants, window close and retirement prevent a later composer handoff. Pending work remains accounted for until it drains. A first-file repository supplies sender identity only within granted folders; linked metadata/object folders request separate access before Git runs. Source and related scopes remain with the workflow. Saved grants can be renewed without reordering Recents. Files outside a discovered repository use an exclusive private Git-global context and leave the active checkout unchanged. That directory is removed when its owning workflow releases it. Every options/progress workflow retains its own files, preferences and sender context through review and delivery.
These are native startup routes into the existing source forms, original icons, preview/checkbox/subject behavior and delivery backends. Local grant-policy and loopback checks do not establish physical Finder input, real scope issuance, public SMTP/Apple Mail acceptance or signed App Store approval. See Request Pull and Finder mail.
Settings, About, Help and First Start entry
about and help open their existing native application services without
repository discovery or a required Git executable. Command Help selects the
manual overview; normal dialog Help remains contextual. firststartwizard
opens/reuses the native setup wizard. Numeric page values 0–4 select Language,
Welcome, Git, User and Authentication; missing/invalid/out-of-range pages start
at Language. An existing wizard keeps its page/draft and active work. Explicit
wizard startup does not race the automatic first-run Language page.
User/Authentication initial pages bootstrap the selected engine's global identity and credential configuration without applying engine settings or writing Git configuration. The existing native permission, Next/Back/Finish, credential and key-generation paths remain. Closing bootstrap cancels and waits for its actual read to drain; a late reply cannot populate a retired wizard.
settings accepts one selected path plus an optional source page name. It
looks for repository markers within available folders before requiring Git.
Outside a repository it opens Global Settings and leaves the current checkout
unchanged. Inside a repository it resolves/authorizes metadata in its captured
settings context without replacing an existing workspace repository. Modified/active
Settings can refuse a different context. Defaults are Git inside a repository
and General outside; unknown or unavailable page names retain those defaults.
| Source page name | Native page |
|---|---|
main, look, extmenu |
General, Context Menu, Set Extended Menu Item |
dialog, dialog2, dialog3 |
Dialogs 1, 2, 3 |
color1, color2, color3 |
Colors 1, 2, 3 |
alternativeeditor |
Alternative Editor |
gitconfig, gitremote, gitcredential |
Git, Remote, Credential |
hooks, bugtraq, bugtraqconfig |
Hook Scripts, Issue Tracker Integration, Issue Tracker Config |
overlay, overlays, overlayshandlers |
Icon Overlays, Icon Set, Overlay Handlers |
proxy, smtp |
Network, Email |
diff, merge |
Diff Viewer, Merge Tool |
save, blame, udiff, advanced |
Saved Data, Blame, Unified Diff, Advanced |
Names are case-sensitive as in Settings.cpp. Remote and Issue Tracker Config
require a repository for source command selection. Windows-only win11menu is
unavailable on macOS and uses the normal fallback; Finder configuration uses the
native Context Menu pages. Remote command entry sets the source No Fetch policy
for that Settings window; saving a remote does not ask for the post-save Fetch.
Idle page jumps reuse the same window and retain its transaction/page drafts;
active operations or child questions refuse page changes. Owning preferences are
forwarded into Settings and embedded Remote. macOS does not need the source's
Windows administrator-only Credential property sheet.
open -n -a 'TurtleGit for Mac' --args --command=settings \
--path '/absolute/repository' --page gitremote
open -n -a 'TurtleGit for Mac' --args --command=firststartwizard --page=3
Utility batch evidence separates local source/default/lifecycle checks from real Help browser, physical pickers, rendered/VoiceOver parity, signed deployment and App Store acceptance. The later service command continuation records Daemon, updates, Autotext and introduction entry. Release administration, remaining command contracts and full source acceptance remain separate work.
Dropped-file Move and Copy/Add entry
The active source dropmove and dropcopyadd commands accept explicit source
path arguments or an authorized path file, plus the required droptarget
folder. dropmove also accepts rename; it asks for a new name when one source
is selected. These explicit operation commands begin after destination/source
validation. Ordinary app menu, clipboard and receiving-sheet entries retain
review before execution.
open -n -a 'TurtleGit for Mac' --args --command=dropmove \
--path '/absolute/repository/file.txt' --droptarget '/absolute/repository/folder'
open -n -a 'TurtleGit for Mac' --args --command=dropmove \
--path '/absolute/repository/file.txt' --droptarget '/absolute/repository/folder' --rename
open -n -a 'TurtleGit for Mac' --args --command=dropcopyadd \
--path '/absolute/external/folder' --droptarget '/absolute/repository/folder'
Destination authorization and linked metadata discovery happen before adopting the target working tree. Move requires versioned sources from that same working tree; outside, bare, administrative and nonfolder destinations are refused. Original source URLs stay independent of the destination used for repository adoption. Git administrative source entries are skipped. Copy/Add also skips a source equal to the destination folder. Native transfers retain the exact ordered unique file identities used by their existing menu/clipboard workflows.
Move starts the existing git mv progress, including collision name sheets,
optional Move/Rename and ordered Ignore/Abort recovery. Separate index/working
bytes remain separate. Copy/Add starts its existing external-source authorization,
Overwrite/Keep/Cancel and copied repository/submodule metadata Delete/Ignore/Abort
workflow, then ordinary Git Add after the copy batch. Neither command commits.
Earlier successful moves/copies remain when later work fails or is cancelled.
Preparation captures the initiating window, grants, input list and preferences. Window closure/retirement cancels pending work; transferred adoption retains the original owner. The operation window owns work after handoff, and counters/grants remain held through actual cancellation drain. A late source grant cannot resume a retired Copy/Add window. The native result view remains available for Close.
This command family does not add Finder right-drag interception. Windows' disabled
dropcopy, pastecopy and pastemove command aliases remain disabled; macOS
clipboard commands have their existing native entry points. See
transfer command evidence and
dropped-file workflow parity for validation and
physical/signed/source acceptance gaps.
Daemon, updates, Autotext and introduction entry
daemon accepts one repository/file path and opens the existing source warning
and native progress workflow, including bare repositories. It does not bypass
Proceed/Abort or the remembered Proceed choice. Repeated commands reuse that
repository's warning/progress/result window and cannot launch a second server.
The selected repository/grant and owning preferences reach the existing runner.
Normal serving retains upstream's port/listen/export defaults; private tests use
loopback/injected workers. See Daemon parity.
updatecheck, autotexttest and rtfm need no Git executable or repository.
They use the application's existing utilities without adopting the current path.
| Update command | Behavior |
|---|---|
updatecheck |
Check quietly; display an available release, otherwise finish without a window |
updatecheck --visible |
Show the result, including up-to-date, empty-feed and error results |
updatecheck --force |
Offer the published release even if its valid version is equal/older; show the result when available |
updatecheck --visible --force |
Show the forced check and its result immediately |
Explicit checks bypass the weekly scheduling preference/deadline. A visible request promotes an in-flight quiet check without a duplicate request. Force can promote that check or its already-displayed result; it preserves the current window, selected files and accepted downloads. Up-to-date ordinary checks do not offer download controls. Version/feed/integrity/URL errors remain errors; Force does not bypass asset validation, SHA-256 checks or non-overwriting publication. Cancelling a quiet request retires delivery while accounting remains until actual transport return. App Store builds never query/download GitHub releases; visible or forced checks show the App Store explanation, while ordinary quiet checks finish.
autotexttest opens/reuses the native Autotext Tester. Content, regex and a running
scan survive repeated entry; closing cancels the scan and rejects late results.
Command-owned windows are independent of a Settings page's tester child. Both
carry the owning preferences. The packaged ECMAScript matcher is unchanged.
rtfm adapts the source launch explanation to the native client. It explains the
File/Finder entry points and offers Help or OK. Help opens the manual overview;
OK opens Documents in Finder. A failed Documents launch remains visible for
retry. Repeated entry reuses the explanation; closed windows reject stale actions.
Ordinary application startup still opens the native repository workspace.
open -n -a 'TurtleGit for Mac' --args --command=daemon --path '/absolute/repository'
open -n -a 'TurtleGit for Mac' --args --command=updatecheck --visible --force
open -n -a 'TurtleGit for Mac' --args --command=autotexttest
open -n -a 'TurtleGit for Mac' --args --command=rtfm
Service command evidence records grouped validation and separates injected/private execution from public release/LAN behavior, physical Help/Finder actions, complete layout and signed Store acceptance.
Standalone conflict editing
conflicteditor opens the existing specialized editor for one conflicted file or
submodule. alternative selects the alternative merge tool; without it the
normal choice is explicit, independent of currently pressed modifier keys.
open -n -a 'TurtleGit for Mac' --args --command=conflicteditor \
--path '/absolute/repository/conflicted-file.txt'
open -n -a 'TurtleGit for Mac' --args --command=conflicteditor \
--path '/absolute/repository/conflicted-file.txt' --alternative
Authorized path files retain the same flag and single-item requirement. A missing working file can still open Delete/Modify from its index stages. Initialized submodule selections follow the shared superproject conflict resolver. Bare and repository-root-only selections are refused.
Preparation captures the original window, input and preference store, authorizes working-tree/linked metadata, and uses normal adoption/rollback before routing. Native Text, Image, Delete/Modify and Submodule editors share captured settings and exact conflict identities. Duplicate native entry preserves the current controller/draft. Closing during preparation cancels it and retains ownership until the actual read returns; a late reply cannot open another editor.
See conflict editor parity and batch evidence for actual validation and remaining source, external-tool, physical and signed acceptance.
Resolve review and automation
resolve accepts silent and noquestion, independently:
| Flags | Source-compatible behavior |
|---|---|
| Neither | Checked conflict review, then native progress |
silent |
Checked review, then apply without progress; errors remain visible |
noquestion |
Skip review and show Skip progress for the raw argv list |
| Both | Force-add the original selected paths without review/progress |
open -n -a 'TurtleGit for Mac' --args --command=resolve \
--path '/absolute/repository/resolved.txt' --noquestion --silent
Both flags preserve literal repeated paths and authorized path-list inputs.
Direct Silent also accepts ignored/unversioned files and directories, including
the working-tree root; it stops on the first failure and does not commit.
noquestion alone retains the pinned source's Skip behavior because bypassing the
review does not populate conflict-action flags. It must not be used as an alias
for the combined direct-staging mode. See Resolve command parity.
Permission/metadata access, original owner/preferences and full-path validation still apply. Repeated reviews retain checked work, duplicate pending direct batches coalesce, and cancelled/closed owners suppress late delivery through actual drain. Windows HWND refresh and process-result protocols remain unported.
Diff submodule and historical entry family — October 18, 2026
diff --submodule opens Submodule Diff for one selected gitlink. It retains the
source From/To subjects, change colours, Log buttons, dirty Show Diff, Compare,
identical-pointer Working Tree and Submodule Update options/progress. The source
has one submodule switch; submodulepath and submoduleforce are not aliases.
Paired startrev/endrev select superproject commits whose gitlinks supply the
child hashes. Forty- or sixty-four-zero working sentinels compare the other
revision against the actual child checkout; two working sides compare the indexed
gitlink with that checkout. Each dialog button captures its own current Shift
alternative-tool choice, as the source does.
submodule --unified follows the unified patch route instead. Without submodule,
a directory still opens Working Tree before applying revision/unified options.
Historical path2 reads primary-at-start and path2-at-end without checking out
files. The two paths can match and their parent folders can have disappeared.
Paths must belong to the same repository for this historical route; a destination
outside it falls back to the existing standalone pair after repository access.
An existing directory endpoint uses the source's destination-path submodule route.
Explicit pairs whose sides are both historical also work in bare repositories;
a working sentinel is refused there.
Repository access, metadata scopes, the initiating owner and preferences remain captured through preparation and the actual comparison drain. Closing an owner cancels pending preparation; changing workspace preferences during a permission callback does not retarget the command or its Submodule Diff child Log/Compare. This extends the existing dialogs; it does not certify all upstream visual parity, physical Finder integration or a signed/App Store distribution.
Standalone Merge-tool entry
The same app executable accepts --merge-tool and source Merge arguments such as
/base:… /mine:…, independently of /command:… repository dispatch. Run it
through the waiting wrapper for Git difftool/mergetool;
using open --args alone does not provide the waiting/result contract.
Setup and examples cover separate merged output, names, readonly,
initial line, missing-input empty panes, patch chooser/reverse entry and unified
output. Source review records the exact accepted
arguments, remaining Blame/reflected-header/Windows protocol gaps, and completion
and cleanup adaptations. Native labels and reflected names never replace the
file paths or grant filesystem access.
Standalone Unified Diff
Launch the app executable with --unified-diff to create an editable Unnamed
document, or provide one file or an explicit stdin stream. This mode opens only
the native Unified Diff window, without a repository workspace or first-start
wizard. Opening, editing and saving text do not require a Git executable.
"/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac" --unified-diff
"/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac" --unified-diff --patchfile changes.txt --title "Review changes"
git diff --binary | "/Applications/TurtleGit for Mac.app/Contents/MacOS/TurtleGitMac" --unified-diff --stdin --title "Working tree"
The source aliases /patchfile:path, /p and /title:caption are also accepted.
An arbitrary filename is allowed in this explicit mode; ordinary macOS document
associations remain .patch and .diff. Use -- before a literal filename that
looks like an option. Choose a single input; conflicting inputs, duplicate titles
and malformed options are rejected. /command: and --command retain their
repository-command meaning.
Stdin is consumed only with --stdin or /p. EOF publishes the captured bytes as
one document, including empty EOF; partial input is not editable. The input limit
is less than 250 MiB. Closing the window cancels and drains its reader. Quit
cancels all active readers, waits for them, then performs the normal unsaved
document decisions. The caller's descriptor is never closed or reconfigured.
File inputs must resolve to regular files; use stdin for pipe input. Sandboxed
command-line file arguments require an explicit matching file selection if no
file scope is available; the argument itself grants no access.
The File menu's Dark Mode command changes only the current viewer. Save, Save As, Find, Print and Settings reuse the existing document workflow. Apply Patch resolves the configured Git engine when invoked and opens the existing target/review workflow. The command process stays alive until its document closes and accepted external workspace handoffs finish. See the implementation and validation record for limits.
Finder/document delivery while a standalone Merge or Unified Diff tool is open
The application delegate receives macOS URL/document events. An ordinary workspace queues early events until its model and startup command are ready, then delivers them once in received order. The former window-view URL handler is removed so an event has one owner.
A standalone Merge or Unified Diff process forwards supported turtlegit://action requests and
.patch/.diff documents through Launch Services to a fresh workspace instance,
with empty launch arguments. It preserves the URL list, order and duplicates;
Merge input/output arguments are never inherited by the new workspace. Unknown
schemes/actions and unrelated document types do not launch a workspace. URLs
carry selection, not access authority; ordinary workspace checks still apply.
Accepted launches retain their file scopes through the Launch Services callback. Failures have an owned native acknowledgment even if the Merge editor has closed. The waiting Git tool's captured result is unchanged and exits only after its external launch work has drained. User Quit refuses active handoff work. Retiring the parent never terminates an independently launched user workspace. See handoff review for verification limits.