Converting From CVS to Subversion
By Adrian Sutton
For the past few weeks I’ve been investigating and planning a move from CVS (CVSNT actually) to Subversion at work. Hopefully this week I’ll be able to do the actual conversion and see what mess it makes.
The main thing that’s missing from Subversion is an exact equivalent for CVS’s meta-modules. Subversion’s externals are good but need to support relative URLs so that branching is simple. Even so, it’s not that hard to go back and re-edit the externals property after branching and it can probably be automated with a small script. It might actually be a good opportunity to automate adding new branches to our automatic build setup as well so whenever we create a new branch the build machine (affectionately known as Bob) automatically starts building it.
Overall though, it should be a major improvement. Instead of using a dodgy port of UNIX software on a Windows server we’ll have software that was specifically designed to be cross-platform and we’ll be using the standard setup instead of some odd port that few people use. CVSNT does it’s job okay, but any time you find instructions for doing something with CVS, it assumes you’re on UNIX which can make life really quite difficult since the CVSNT hasn’t constrained themselves to just porting CVS, they’re adding to it, changing things and generally breaking compatibility (for better or worse – usually worse in our experience).
The last few things I need to do is update our build process so that each build tags in subversion instead of CVS. Test cruisecontrol with subversion and do some concurrent usage testing – the biggest problem we’ve been having with CVS is running into locked directories all the time and thus having to wait ages for operations to complete.
I’m also considering changing our build numbering scheme to use the subversion revision number instead of a separate incremental counter. The problem I see with this is that subversion allows you to have files from different revisions checked out – while this is normally a good thing, it means that using the revision as a build number doesn’t work. For our automatic build machine, where all releasable builds should be done anyway, that’s not a problem because it always builds from the latest source but for builds done manually it might not be as accurate as tagging.