I'm stunned and stoked to have gotten git push over XMPP working today. And am nearly out of steam, it was a wild ride..
To xmpp::email@example.com * [new branch] master -> refs/xmpp/newmaster
The surprising part is how close my initial implementation came to just working on the first try. It had around 3 bugs, which took hours of staring at debugging output to find:
- The git push action was run in the same thread as the XMPP client, which prevented the client from continuing to run and relaying messages.
- The git-receive-pack side waited on the wrong thread, so didn't notice when the program was done.
- I accidentially used the wrong attribute name when sending a ReceivePackDone message.
But all in all, it just worked.
Here's a sample of the actual data sent when one file is added to the repository (also includes the corresponding update to the git-annex branch):
MDA4NjhhMmNmOGZjMWE3MTlkOGVjOWVmOWZiMGZiNjVlODc2NjQ1NDAyMTAgODIwNTZjMDM4 ZjU2YzE1ODdjYzllOWRhNzQzMzU0YjE4NzNjZWJlOSByZWZzL3htcHAvbmV3bWFzdGVyACBy ZXBvcnQtc3RhdHVzIHNpZGUtYmFuZC02NGswMDAw UEFDSwAAAAIAAAADnAx4nJXLTQ4CIQxA4T2n4AKaAqVAYoxL4y2gU+Jo5iczdeHtnSu4eMm3 ebqJ2NwgSCLmNkTBlKFCYwwhoHOtQ+scqZCwWesms9pcPffc2dXkypCFi/TSG/RGUXIiwojg HZj60eey2cciX3uXfbeX18Hbe1SZRc9HV+tC9FgyJW9PgACGl2kaVeXfz/wArHQ81qMGeJwz NDIAAoVUI4ZZB9RW1E8NtXp5t77/fn3hw41cl2MNIbIZqTk5+Qwerw+aJX2INjsffYndtdCz 5mZWLDdUQV5qeVpmDtCQnx/3/6s40+Q4P/7O+Y4ShS+1Ad83AwC6CirftAt4nK3MsRGDMAwF 0IkcSVgSdpkidzRUmcDWBy4pSAEFl+mzRN4A77a9Tmr7vlz06e8lzoPmmb5Mz+k+mD/SkTkl eFHPq9eqQ+nSzFsWaDFnFmCMCEOvHgLrCrQxS7AWdvUVhv9uPwHxMbfumlvWdco1RLL4wSQF g0uFFOKu3Q==
Git said this push took 385 bytes; after base64 encoding to transport it over XMPP as shown above, it needs 701 bytes, and the XMPP envelope and encryption adds more overhead (although the XMPP connection may also be compressed?)
Not the most efficient git transport, but still a practical one!
Big thanks by the way to meep, who posted a comment reminding me about
git-remote-helpers. This was the right thing to use for XMPP over git,
it lets the git remote be configured with
url = xmpp::user@host.
Next, I need to get the assistant to use this for syncing. Currently, it only pushes a test branch.