Finished crippled filesystem support, except for symlink handling. This was straightforward, just got lsof working in that mode, made migrate copy key contents, and adapted the rsync special remote to support it. Encrypted rsync special remotes have no more overhead on crippled filesystems than normally. Un-encrypted rsync special remotes have some added overhead, but less than encrypted remotes. Acceptable for now.

I've now successfully run the assistant on a FAT filesystem.


Git handles symlinks on crippled filesystems by setting core.symlinks=false and checking them out as files containing the link text. So to finish up crippled filesystem support, git-annex needs to do the same whenever it creates a symlink, and needs to read file contents when it normally reads a symlink target.

There are rather a lot of calls to createSymbolicLink, readSymbolicLink, getSymbolicLinkStatus, isSymbolicLink, and isSymLink in the tree; only ones that are used in direct mode need to be converted. This will take a while.

Checking whether something is a symlink, or where it points is especially tricky. How to tell if a small file in a git working tree is intended to be a symlink or not? Well, it can look at the content and see if it makes sense as a link text pointing at a git-annex key. As long as the possibility of false positives is ok. It might be possible, in some cases, to query git to verify if the object stored for that file is really a symlink, but that won't work if the file has been renamed, for example.

Converted some of the most commonly used symlink code to handle this. Much more to do, but it basically works; I can git annex get and git annex drop on FAT, and it works.


Unfortunately, got side-tracked when I discovered that the last release introduced a bug in direct mode. Due to the bug, "git annex get file; git annex drop file; git annex get file" would end up with the file being an indirect mode symlink to the content, rather than a direct mode file. No data loss, but not right. So, spent several hours fixing that reversion, which was caused by me stupidly fixing another bug at 5 am in the morning last week.. and I'll probably be pushing out another release tomorrow with the fix.