Built git annex direct and git annex indirect to toggle back and forth between direct mode. Made git annex status show if the repository is in direct mode. Now only merging is needed for direct mode to be basically usable.

I can do a little demo now. Pay attention to the "@" ls shows at the end of symlinks.

joey@gnu:~/tmp/bench/rdirect>ls
myfile@  otherfile@
joey@gnu:~/tmp/bench/rdirect>git annex find
otherfile
# So, two files, only one present in this repo.

joey@gnu:~/tmp/bench/rdirect>git annex direct
commit  
# On branch master
# Your branch is ahead of 'origin/master' by 7 commits.
#
nothing to commit (working directory clean)
ok
direct myfile ok
direct otherfile ok
direct  ok

joey@gnu:~/tmp/bench/rdirect>ls
myfile@  otherfile
# myfile is still a broken symlink because we don't have its content
joey@gnu:~/tmp/bench/rdirect>git annex get myfile
get myfile (from origin...) ok
(Recording state in git...)
joey@gnu:~/tmp/bench/rdirect>ls
myfile  otherfile

joey@gnu:~/tmp/bench/rdirect>echo "look mom, no symlinks" >> myfile
joey@gnu:~/tmp/bench/rdirect>git annex sync
add myfile (checksum...) ok
commit  
(Recording state in git...)
[master 0e8de9b] git-annex automatic sync
...
ok

joey@gnu:~/tmp/bench/rdirect>git annex indirect
commit  ok
indirect myfile ok
indirect otherfile ok
indirect  ok
joey@gnu:~/tmp/bench/rdirect>ls
myfile@  otherfile@

I'd like git annex direct to set the repository to untrusted, but I didn't do it. Partly because having git annex indirect set it back to semitrusted seems possibly wrong -- the user might not trust a repo even in indirect mode. Or might fully trust it. The docs will encourage users to set direct mode repos to untrusted -- in direct mode you're operating without large swathes of git-annex's carefully constructed safety net. (When the assistant later uses direct mode, it'll untrust the repository automatically.)