According to AI and (I think) the sync error at the bottom, FwHeadless is missing chorusmerge. I can hardly believe that's true, but I can't find any evidence that chorusmerge exists in fw-headless, so... 🤷
(AI generated 👇)
LfMerge does three things that fw-headless does not:
- References
SIL.Chorus.ChorusMerge as a NuGet package (line 43 of LfMerge.Core.csproj) — this gets the ChorusMerge.dll into the output
- Copies a
chorusmerge shell script (the Linux wrapper at lib/chorusmerge) into the output directory — this is what Mercurial actually invokes
- Copies
ChorusMerge.runtimeconfig.json from the NuGet package into the output — needed for dotnet ChorusMerge.dll to work
The shell script is the key glue: Mercurial calls /app/chorusmerge (the shell script), which then does exec dotnet "$LIB"/ChorusMerge.dll "$@", which runs the actual merge logic.
FwHeadless is missing all three pieces. It needs:
- A
PackageReference to SIL.Chorus.ChorusMerge
- A
chorusmerge shell script adapted for its container layout (simpler than LfMerge's — just exec dotnet /app/ChorusMerge.dll "$@")
- The
ChorusMerge.runtimeconfig.json copied to output
Sync job failed: Send/Receive before CRDT sync failed. Output: Sync failure: Chorus.sync.Synchronizer+SynchronizationException: Unable to complete the send/receive.
---> System.ApplicationException: couldn't find merge tool chorusmerge (for pattern General/LanguageProject.langproj)
warning: conflicts while merging General/LanguageProject.langproj! (edit, then use 'hg resolve --mark')
at Chorus.VcsDrivers.Mercurial.HgRepository.Merge(String localRepositoryPath, String revisionNumber)
at Chorus.sync.Synchronizer.MergeTwoChangeSets(Revision head, Revision theirHead)
at Chorus.sync.Synchronizer.MergeHeads()
--- End of inner exception stack trace ---
at Chorus.sync.Synchronizer.ExplainAndThrow(Exception exception, WhatToDo whatToDo, String explanation, Object[] args)
at Chorus.sync.Synchronizer.MergeHeads()
at Chorus.sync.Synchronizer.MergeHeadsOrRollbackAndThrow(HgRepository repo, Revision workingRevBeforeSync)
at Chorus.sync.Synchronizer.SyncNow(SyncOptions options)
According to AI and (I think) the sync error at the bottom, FwHeadless is missing chorusmerge. I can hardly believe that's true, but I can't find any evidence that chorusmerge exists in fw-headless, so... 🤷
(AI generated 👇)
LfMerge does three things that fw-headless does not:
SIL.Chorus.ChorusMergeas a NuGet package (line 43 of LfMerge.Core.csproj) — this gets theChorusMerge.dllinto the outputchorusmergeshell script (the Linux wrapper atlib/chorusmerge) into the output directory — this is what Mercurial actually invokesChorusMerge.runtimeconfig.jsonfrom the NuGet package into the output — needed fordotnet ChorusMerge.dllto workThe shell script is the key glue: Mercurial calls
/app/chorusmerge(the shell script), which then doesexec dotnet "$LIB"/ChorusMerge.dll "$@", which runs the actual merge logic.FwHeadless is missing all three pieces. It needs:
PackageReferencetoSIL.Chorus.ChorusMergechorusmergeshell script adapted for its container layout (simpler than LfMerge's — justexec dotnet /app/ChorusMerge.dll "$@")ChorusMerge.runtimeconfig.jsoncopied to output