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.
If the title of a trail or trail-member changes, rebuild affected pages If the title of a trail changes, each member of that trail must be rebuilt, for its prev/up/next box to reflect the new title. If the title of a member changes, its next and previous items (if any) must be rebuilt, for their prev/up/next boxes to reflect the new title.
prune: do not prune beyond an optional base directory, and add a test Previously, prune("wiki/srcdir/sandbox/test.mdwn") could delete srcdir or even wiki, if they happened to be empty. This is rarely what you want: there's usually some base directory (destdir, srcdir, transientdir or another subdirectory of wikistatedir) beyond which you do not want to delete.
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.