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