Write rcs_diff() tests according to the API spec, then make them pass.
Notes from an evening's debugging.
Merge branch 'master' into cvs
Test RCS Id keyword expansion on typical commit.
Test checkconfig().
Remember to run all the tests before committing!
More testings and fixings:

* Test that adding a text file under a name formerly tracked as
  binary (and vice versa) gets the right keyword-substitution
  behavior.
* Explicitly set -kkv for text files to make the tests pass.
* CVS warns in these cases about "changing keyword expansion mode",
  but this is correct behavior, so filter it from stderr. Filter
  stdout the same way in case we ever want to keep any of it.
* In rcs_add(), replace comments with obviousness.
Notes.
Merge branch 'master' into cvs
Merge branch 'master' into cvs
Merge branch 'master' into cvs
Merge branch 'master' into cvs
Merge branch 'cvs' of github.com:schmonz/ikiwiki into cvs
Merge branch 'master' into cvs
Merge branch 'master' into cvs
Merge branch 'master' into cvs
Merge branch 'master' into cvs
Merge branch 'master' into cvs
Merge branch 'cvs' of github.com:schmonz/ikiwiki into cvs
Fix longstanding bug (chdir to nonexistent dirs).

In test, set up the post-commit hook for more realism (and bugs!).
To make wrappers work in test, set PERL5LIB, and allow the wrappee's
path to be overridden. Meta-test that post-commit is really hooked
up by verifying that content is getting generated in destdir.

About the longstanding bug, which as far as I know was harmless:
CVS can't operate outside a srcdir, so we're always setting $CWD.
"local $CWD" restores the previous value when we go out of scope.
Usually that's correct. But if we're removing the last file from a
directory, the post-commit hook will exec in a working directory
that's about to not exist (CVS will prune it).

The fix: chdir() manually in cvs_runcvs(), so we can selectively
not chdir() back.