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.
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.
Move tests that simulate web commits into test_rcs_add(), then add a bunch more tests (that wind up exercising rcs_commit(), rcs_commit_staged(), and rcs_recentchanges()). Extract some support routines for brevity. Most is_in_keyword_substitution_mode() tests are commented out because there's a bug -- non-binary files are being added with "cvs add -kb". Move tests that inspect recentchanges after direct CVS operations into test_rcs_recentchanges().
No functional change: sort sub definitions. In the code: * general plugin API calls (in plugins/write order), * VCS plugin API calls (in plugins/write order), then * internal support routines (in alphabetical order). In the tests: * general meta-behavior (in no particular order, yet), * general plugin API calls (in plugins/write order), * VCS plugin API calls (in plugins/write order), then * internal support routines (in semi-logical order).
Ape xUnit more closely to remove ordering constraints on test subs: * Add setup and teardown methods, called before and after every test sub. * In setup, make a fresh repo; in teardown, throw it out. * Extract runtests method and define default test methods at top. * Move reflection routines near the xUnit-style subs they support. Adapt existing test subs to run independently: * In test_manual_add_and_commit(), assume a fresh repo. While here, plan a bit better: * Check for all modules used by cvs.pm. * Check for program existence more generally. * Check that we can rmdir after mkdir.