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.