Followed my plan from yesterday, and wrote a simple C library to interface to kqueue, and Haskell code to use that library. By now I think I understand kqueue fairly well -- there are some very tricky parts to the interface.

But... it still didn't work. After building all this, my code was failing the same way that the haskell kqueue library failed yesterday. I filed a bug report with a testcase.

Then I thought to ask on #haskell. Got sorted out in quick order! The problem turns out to be that haskell's runtime has a periodic SIGALARM, that is interrupting my kevent call. It can be worked around with +RTS -V0, but I put in a fix to retry to kevent when it's interrupted.

And now git-annex watch can detect changes to directories on BSD and OSX!

Note: I said "detect", not "do something useful in response to". Getting from the limited kqueue events to actually staging changes in the git repo is going to be another day's work. Still, brave FreeBSD or OSX users might want to check out the watch branch from git and see if git annex watch will at least say it sees changes you make to your repository.