vcs:cvs2svnconversion

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
vcs:cvs2svnconversion [2008/10/19 23:34] – Compressed some of the passes gwynnevcs:cvs2svnconversion [2019/08/26 16:54] (current) gwynne
Line 1: Line 1:
 +====== Complete ======
 +
 +The SVN migration was completed in July 2009. This document has been retained for historical purposes.
 +
 +
 ====== CVS to SVN Migration Path ====== ====== CVS to SVN Migration Path ======
  
Line 32: Line 37:
 I have the CVS repository stored in a directory called "realroot" (why not?) and stored the temporary data files on a separate mount point because of drive space issues. My initial commandline, based purely on the documentation, before any kind of testing was this: I have the CVS repository stored in a directory called "realroot" (why not?) and stored the temporary data files on a separate mount point because of drive space issues. My initial commandline, based purely on the documentation, before any kind of testing was this:
 <code bash> <code bash>
-./cvs2svn --svnrepos=./svnroot --fs-type=fsfs --dry-run --no-cross-branch-commits --username=svnconvert --cvs-revnums --use-cvs --tempdir=/Volumes/External/private/tmp/cvs2svn-tmp ./realroot+./cvs2svn --svnrepos=./svnroot --fs-type=fsfs 
 +--dry-run --no-cross-branch-commits 
 +--username=svnconvert 
 +--cvs-revnums --use-cvs 
 +--tempdir=/Volumes/External/private/tmp/cvs2svn-tmp ./realroot
 </code> </code>
  
Line 102: Line 111:
  
 Pass 4 worked on the first try: Pass 4 worked on the first try:
 +
 Pass 5 was also a clean sweep: Pass 5 was also a clean sweep:
 +
 Pass 6 was just a beautiful thing, went by without a hitch. Not that I expected any of these "sort" passes to be a big deal, but you never know... Pass 6 was just a beautiful thing, went by without a hitch. Not that I expected any of these "sort" passes to be a big deal, but you never know...
 +
 Pass 7 worked without problems too, though it was a much slower pass than the last three. I finally started to feel like I was making progress. Pass 7 done, means pass 8 is up! Halfway there! Pass 7 worked without problems too, though it was a much slower pass than the last three. I finally started to feel like I was making progress. Pass 7 done, means pass 8 is up! Halfway there!
-Pass 8 took something along the lines of an hour to run, but it finally finished without errors... I hope the other phases aren't similarly insane with their timing. I'm considering taking the --quiet flag back out, and I think I will for pass 9. It's nice to know //something's// happening; I checked my top -u output twice during pass 8 to make sure it hadn't frozen up. 
  
 +Pass 8 took something along the lines of an hour to run, but it finally finished without errors... I hope the other phases aren't similarly insane with their timing. I'm considering taking the --quiet flag back out, and I think I will for pass 9. It's nice to know //something's// happening; I checked my top -u output twice during pass 8 to make sure it hadn't frozen up.
  
 <code> <code>
Line 167: Line 179:
  
 10: Pass 10 was what my Warcraft friends would call "easysauce": 10: Pass 10 was what my Warcraft friends would call "easysauce":
 +
 11: Well, pass 11 was faster than 8 and 9, if not as fast as 10... 11: Well, pass 11 was faster than 8 and 9, if not as fast as 10...
 +
 12: Another one bites the dust! 12: Another one bites the dust!
 +
 13: Pass 13 certainly was interesting. Generating all the SVN commits... 13: Pass 13 certainly was interesting. Generating all the SVN commits...
 +
 14: Nice short easy one. 14: Nice short easy one.
 +
 15: 15 down, 1 to go! 15: 15 down, 1 to go!
 +
 16: Pop the champagne cork! 16: Pop the champagne cork!
  
Line 371: Line 389:
 </code> </code>
  
-Whew. That was going to make for a //very// long options file where it was very easy to make copypasta errors. I needed to add a little Python code. How does one do foreach (array(//blah blah blah//) as $item) { /* etc */ } in Python? So I went to my wife Sarah, who **does** know Python.+Whew. That was going to make for a //very// long options file where it was very easy to make copypasta errors. I needed to add a little Python code. How does one do foreach (array(//blah blah blah//) as $item) { /* etc */ } in Python? So I went to a close friend who **does** know Python.
  
 We came up with this rather handy little bit of code: We came up with this rather handy little bit of code:
Line 903: Line 921:
  
 Next step: Decide on a repository structure. Ooops... lots of differing opinions on that. Next step: Decide on a repository structure. Ooops... lots of differing opinions on that.
 +
 +Well, this was getting complicated. It was time to step back and automate some of the process. So I popped open a new PHP file and came up with automation for the svn create, cvs2svn, and svn rm commands already discussed. Then I went back and added some nice command-line-y-ness to it using PEAR's Console_CommandLine (a VERY nice package, kudos to its author(s)!). The script can be viewed at [[http://cvs.php.net/viewvc.cgi/SVNROOT/run-conversion.php?view=log]].
 +
 +That done, I looked back at the reorganization mess. It looked like there would in fact be a few separate repositories for things like PEAR and GTK. I needed advice on this one, so I went to the mailing list. They wanted to know, "why separate repositories?" Well, it's a matter of maitenance, really. GTK, PEAR, Zend, they all have their own little quirks in the hook scripts and really it's just simpler and more elegant for them to have their own workspaces to play in rather than all this endless special-casing in the hooks and ACLs.
 +
 +So I rewrote the conversion script completely to support this premise, and contacted various people to find out what to do with the "miscellaneous" modules scattered all over the place. Turned out most of them either belonged alongside php-src or were just plain defunct! The choice was made not to convert defunct modules, since there is a plan to leave the CVS repository available in some form.
 +
 +===== Hook scripts =====
 +
 +At a glance it might seem that would be the end of it. But unfortunately, no. There are a lot of administrative tasks done by scripts in CVSROOT, all of which need to be ported to SVN equivelants. I decided it would be astute to make a list of what needed to be ported before actually getting into it! To do that, I grabbed a copy of CVSROOT itself and had a looksee. It turned out the following things needed conversion:
 +  * Access Control Lists - replaced by the SVN authz database
 +  * commitinfo.pl - I couldn't quite figure out what this was for. It seemed to write the name of the committed directory to a file. A little more investigation showed it to be part of the loginfo.pl automation
 +  * cvswrappers - Replaced by SVN's autoprops
 +  * loginfo.pl - Sends the e-mails to various mailing lists when commits happen
 +  * modules - Replaced by svn:externals and restructuring
 +  * readers - Replaced by SVN's authz database
  
 ===== Available for the curious ===== ===== Available for the curious =====
Line 910: Line 944:
 </code> </code>
  
-This will check out all the projects in the repository; it's suggested to specify a particular module like <nowiki><http://svn.php.net/php-src/trunk></nowiki>. Don't forget about svn ls!+This will check out all the projects in the repository; it's suggested to specify a particular module like [[http://svn.php.net/php-src/trunk]]. Don't forget about svn ls!
vcs/cvs2svnconversion.1224459270.txt.gz · Last modified: 2017/09/22 13:28 (external edit)