Brain dump. - peter@ The theory is simple enough. Cron periodically runs run.sh under a lock / log run.sh calls driver.sh for each exported branch with paths paths to svn and cvs checkouts. driver.sh does: while (svn checkout isn't top-of-tree) svn checkout "next rev on branch" compare file lists cvs add new files cvs rm old fles compare/copy/spam common files cvs commit (entire tree) if (number of commits > 10, stop) } The Fake-CVSROOT is special. The real CVSROOT in /home/ncvs does not allow commits. Fake-CVSROOT DOES allow commits and has $FreeBSD$ expansion turned off. (This is so that a copy of the svn co files will preserve $FreeBSD$). Fake-CVSROOT/src -> ncvs/src and so on. To set up a new exported branch.. cvs co -b RELENG_FOO into exportcvs/src.RELENG_FOO (add RELENG_FOO to Fake-CVSROOT/val-tags if required) svn co info svnco/base/stable/FOO add mapping lines to run.sh stand back There is a very specific and hard limit to the number of branches. The working set of all branches (both svn + cvs) plus the cvs repository ,v files has to fit in ram. There was roughly a 100x slowdown if disks were being thrashed due to working set exceeding ram size. To **force** a resync: touch exportcvs/src.RELENG_FOO/force-commit Script started on Fri May 30 03:08:57 2014 root@repoman2:/local/svnexp # ls -l total 16321 -rw------- 1 svnexp svnexp 89 May 21 03:36 .lesshst drwxr-xr-x 3 svnexp svnexp 6 Nov 17 2012 .subversion drwxr-xr-x 3 svnexp svnexp 6 Dec 31 2012 Fake-CVSROOT drwxr-xr-x 2 svnexp svnexp 5 Nov 28 2012 RCS -rw-r--r-- 1 svnexp svnexp 1303 May 30 03:08 README -rwxr-xr-x 1 svnexp svnexp 516 Apr 2 21:44 deprecated.src drwxrwxr-x 4 svnexp svnexp 4 Dec 31 2012 distrib -rw-r--r-- 1 svnexp svnexp 4269 May 21 04:12 driver.sh -rw-r--r-- 1 svnexp svnexp 4151 May 21 04:12 driver.sh.old -rw-r--r-- 1 svnexp svnexp 4183 May 21 04:12 driver84.sh drwxr-xr-x 7 svnexp svnexp 7 May 21 03:53 exportcvs drwxrwxr-x 5 svnexp svnexp 5 Dec 31 2012 lockdir -rwxr-xr-x 1 svnexp svnexp 232 Nov 28 2012 logrotate.sh drwxr-xr-x 5 svnexp svnexp 5 Nov 16 2012 real-checkout -rw-r--r-- 1 svnexp svnexp 54871 May 21 03:02 run.log -rw-r--r-- 1 svnexp svnexp 438246 May 21 00:00 run.log.1 -rw-r--r-- 1 svnexp svnexp 442607 May 12 00:00 run.log.10 -rw-r--r-- 1 svnexp svnexp 453808 May 11 00:00 run.log.11 -rw-r--r-- 1 svnexp svnexp 501645 May 10 00:00 run.log.12 -rw-r--r-- 1 svnexp svnexp 492019 May 9 00:00 run.log.13 -rw-r--r-- 1 svnexp svnexp 520225 May 8 00:00 run.log.14 -rw-r--r-- 1 svnexp svnexp 443307 May 7 00:00 run.log.15 -rw-r--r-- 1 svnexp svnexp 443860 May 6 00:00 run.log.16 -rw-r--r-- 1 svnexp svnexp 447129 May 5 00:00 run.log.17 -rw-r--r-- 1 svnexp svnexp 445379 May 4 00:00 run.log.18 -rw-r--r-- 1 svnexp svnexp 450337 May 3 00:00 run.log.19 -rw-r--r-- 1 svnexp svnexp 451442 May 20 00:00 run.log.2 -rw-r--r-- 1 svnexp svnexp 436482 May 2 00:00 run.log.20 -rw-r--r-- 1 svnexp svnexp 603897 May 1 00:00 run.log.21 -rw-r--r-- 1 svnexp svnexp 444861 Apr 30 00:00 run.log.22 -rw-r--r-- 1 svnexp svnexp 458264 Apr 29 00:00 run.log.23 -rw-r--r-- 1 svnexp svnexp 435288 Apr 28 00:00 run.log.24 -rw-r--r-- 1 svnexp svnexp 440862 Apr 27 00:00 run.log.25 -rw-r--r-- 1 svnexp svnexp 455199 Apr 26 00:00 run.log.26 -rw-r--r-- 1 svnexp svnexp 447332 Apr 25 00:00 run.log.27 -rw-r--r-- 1 svnexp svnexp 448027 Apr 24 00:00 run.log.28 -rw-r--r-- 1 svnexp svnexp 455250 Apr 23 00:00 run.log.29 -rw-r--r-- 1 svnexp svnexp 448496 May 19 00:00 run.log.3 -rw-r--r-- 1 svnexp svnexp 452384 Apr 22 00:00 run.log.30 -rw-r--r-- 1 svnexp svnexp 445084 Apr 21 00:00 run.log.31 -rw-r--r-- 1 svnexp svnexp 461754 May 18 00:00 run.log.4 -rw-r--r-- 1 svnexp svnexp 465230 May 17 00:00 run.log.5 -rw-r--r-- 1 svnexp svnexp 468016 May 16 00:00 run.log.6 -rw-r--r-- 1 svnexp svnexp 537767 May 15 00:00 run.log.7 -rw-r--r-- 1 svnexp svnexp 507206 May 14 00:00 run.log.8 -rw-r--r-- 1 svnexp svnexp 455276 May 13 00:00 run.log.9 -rwxr-xr-x 1 svnexp svnexp 509 Apr 2 21:42 run.sh drwxr-xr-x 3 svnexp svnexp 3 Nov 28 2012 spam drwxrwxr-x 3 svnexp svnexp 3 Mar 28 2013 svnco drwxr-xr-x 2 svnexp svnexp 14 Nov 28 2012 tmp drwxr-xr-x 4 svnexp svnexp 4 Apr 7 2013 vuxml root@repoman2:/local/svnexp # ls -l Fake-CVSROOT/ total 5 drwxrwxr-x 3 svnexp svnexp 40 Nov 18 2012 CVSROOT lrwxr-xr-x 1 svnexp svnexp 18 Dec 31 2012 distrib -> ../../ncvs/distrib lrwxr-xr-x 1 svnexp svnexp 16 Nov 16 2012 ports -> ../../ncvs/ports lrwxr-xr-x 1 svnexp svnexp 14 Nov 16 2012 src -> ../../ncvs/src root@repoman2:/local/svnexp # ls -l ../ncvs total 16 drwxrwxr-x 3 svnexp svnexp 44 Jan 3 2013 CVSROOT drwxrwxr-x 3 svnexp svnexp 3 May 19 2007 distrib drwxrwxr-x 2 svnexp svnexp 3 May 28 00:24 doc drwxrwxr-x 2 svnexp svnexp 3 May 28 00:24 ports drwxrwxr-x 2 svnexp svnexp 3 May 28 00:38 projects drwxrwxr-x 28 svnexp svnexp 29 May 30 02:50 src drwxrwxr-x 2 svnexp svnexp 3 May 28 00:40 www root@repoman2:/local/svnexp # exit Script done on Fri May 30 03:09:21 2014 Captured cron: #* * * * * /usr/bin/lockf -s -t 0 /local/svnexp/run.lock /bin/sh -c "/local/svnexp/run.sh >> /local/svnexp/run.log 2>&1" #0 0 * * * /local/svnexp/logrotate.sh # once an hour #1 * * * * touch /local/svnexp/src.RELENG_9.RUN #6 * * * * touch /local/svnexp/src.RELENG_9_1.RUN #21 * * * * touch /local/svnexp/src.RELENG_8.RUN #45 * * * * touch /local/svnexp/src.RELENG_8_4.RUN Directory structure: peter@repoman2:/local/svnexp % ls -l svnco/ total 2 drwxr-xr-x 4 svnexp svnexp 4 Apr 3 15:55 base peter@repoman2:/local/svnexp % ls -l svnco/base/ total 4 drwxr-xr-x 5 svnexp svnexp 5 Apr 3 15:52 releng drwxr-xr-x 4 svnexp svnexp 4 Mar 28 2013 stable peter@repoman2:/local/svnexp % ls -l svnco/base/stable/ total 6 drwxr-xr-x 23 svnexp svnexp 31 Mar 23 14:21 8 drwxr-xr-x 23 svnexp svnexp 32 May 11 21:01 9 peter@repoman2:/local/svnexp % ls -l exportcvs/ total 16 drwxr-xr-x 3 svnexp svnexp 15 Nov 17 2012 CVSROOT drwxrwxr-x 27 svnexp svnexp 35 May 21 03:53 src.RELENG_8 drwxr-xr-x 27 svnexp svnexp 35 May 21 03:58 src.RELENG_8_4 drwxrwxr-x 27 svnexp svnexp 36 May 21 03:59 src.RELENG_9 drwxrwxr-x 27 svnexp svnexp 36 May 21 04:00 src.RELENG_9_1 :q! peter@repoman2:/local/svnexp % ls svnco/base/stable/8 COPYRIGHT Makefile.inc1 bin etc kerberos5 rescue sys LOCKS ObsoleteFiles.inc cddl games lib sbin tools MAINTAINERS README contrib gnu libexec secure usr.bin Makefile UPDATING crypto include release share usr.sbin