Greetings fellow Gophers!

I wanted to share and get feedback on a Go project that I've been working 
on for a little while called Mutagen:

Usage information: https://havoc-io.github.io/mutagen/
Source: https://github.com/havoc-io/mutagen

It's a continuous, bidirectional file synchronization utility similar to 
Unison <https://www.cis.upenn.edu/~bcpierce/unison/> (think SSHFS, but far 
more robust and not requiring kernel extensions). It's main goal is 
simplicity - no configuration, no flags, just usage (a minimal number of 
knobs to turn, in Go parlance).

It uses Go's unique abilities to enable what I consider to be its most 
interesting feature: It only needs to be installed on the system where you 
want to control synchronization. It uses Go's cross-compiling support and 
syscall-only binaries to create small "agent" binaries that it copies to 
remote hosts automatically after probing for their OS/architecture. It 
supports a broad range of platforms - pretty much anything Go supports 
except Plan 9 and mobile (mostly just because those ports can be a bit 
flakey).

The original goal was to mirror and work with code on smaller platforms 
(e.g. a Raspberry Pi) on which you might want to compile and run (but not 
write) code, thus saving you the need to either transfer your vim/emacs 
configuration over to remote systems or push/pull from your local system 
every time you want to test a change. But you can use it for general 
synchronization as well.

You can find a full accounting of the features here: 
https://github.com/havoc-io/mutagen#unique-features

The *tl;dr* is: user-space (no kernel extensions or admin privileges 
needed), syncs locally or over SSH (can even sync SSH-to-SSH without a 
local copy of files), auto-reconnects, uses pipelined rsync algorithm for 
any significant data transfer to make effective use of bandwidth and reduce 
latency, can handle very large directories (the Linux source tree was the 
development case), identifies conflicts, handles platform and filesystem 
quirks, and has dynamic status display.

*I'd be particularly interested in feedback regarding the idea, design, and 
usefulness to people.* The code is clean, but not all exported members are 
currently documented because I was sort of treating it like one giant 
internal package. This will be fixed soon though. I'll also provide full 
documentation of the algorithm in the near future, but it's very similar to 
Unison, so the design documents for that will give you 95% of the idea.

It's still an early beta, though essentially feature complete. I've only 
tested it personally between macOS, Windows (XP/7), and Linux 
(386/amd64/ARM). I'd be interested in tests on more obscure systems 
(non-x86 architectures and some of the BSDs), but please be aware that it 
is a beta that has the power to create and delete files, so it's not to be 
used on production or mission-critical systems, and could be dangerous on 
any system.

This is my first medium-to-large Go project.  On the whole it was a 
positive experience, and I'm fairly certain that this exact design would be 
almost impossible to reproduce with any other language on the market right 
now.  It also uses a fair number of excellent Go libraries (see legal.go in 
the source), so thanks to all those authors and the Go team for making it 
possible.

-Jacob

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to