After a release on Monday, I've spent the week working on async extension to external special remote protocol. This is lets a single external special remote process handle multiple requests at the same time, when it's more efficient to use one process than for git-annex to run several processes.

It's a good thing I added support for extensions a couple of years back. I never imagined at the time using it for something like this, that radically changes the whole protocol! It could have just been protocol version 2, but then special remotes would be pushed towards using this by default, which I don't want. It's probably overkill for most of them.

      J 4 CHECKPRESENT Key3
      J 5 CHECKPRESENT Key4
      J 6 REMOVE Key5
      J 4 CHECKPRESENT-SUCCESS Key3
      J 6 REMOVE-SUCCESS Key5
      J 5 CHECKPRESENT-FAILURE Key4

The protocol extension went through a bunch of iterations, ending up with probably the simplest possible way to do it, a simple framing layer around the main protocol. I started with rather a lot of rather hairy code and it kind of all melted away as I refined the protocol down to that, which was nice, although I also kind of wish I had been able to jump right to the clean and simple end result.