For example a cron job could simply grab a diff of everything since the last time it ran and then apply it to the CVS repository. The only even slightly tricky part would be getting the cvs add and rm commands right. We could run that script an hour. Anybody who needs more cutting edge sources can switch to SVN.
I don't promise anything on the timing, but I can do this. I already have a very similar arch-to-cvs script which I attach.
Paolo
#!/bin/sh : ${EDITOR:=`which vi`} if which baz > /dev/null 2>&1; then : ${TLA:=`which baz`} else : ${TLA:=`which tla`} fi # Some tools get completely confused in stupid ways by non-default # settings of LANG (like gawk, which fucks up regexp character ranges). LANG=C; export LANG TMP_PFX="/tmp/tla-to-cvs.$$" if test "$1" == --debug; then shift else trap "rm -rf $TMP_PFX" 0 1 2 3 11 15 fi if test "$#" -ne 2; then echo "Usage: tla-to-cvs ARCH-DIR CVS-DIR" >&2 exit 1 fi mkdir $TMP_PFX PWD=`pwd` TREE_ROOT=`cd $1 && $TLA tree-root 2>/dev/null || echo NONE` CVS_ROOT=`cd $2 && pwd || echo NONE` if test $TREE_ROOT = NONE; then echo "$TREE_ROOT: Not an arch working directory" >&2 exit 1 fi if test $CVS_ROOT != NONE && test -d $CVS_ROOT/CVS; then :; else echo "$CVS_ROOT: Not a CVS working directory" >&2 exit 1 fi if (cd $2 && cvs update > $TMP_PFX/cvs_update_log 2>&1); then :; else cat $TMP_PFX/cvs_update_log >&2 echo "$CVS_ROOT: problems updating from CVS" >&2 exit 1 fi if grep ^C $TMP_PFX/cvs_update_log >&2; then echo "$CVS_ROOT: conflicts updating from CVS" >&2 exit 1 fi # Get the list of files in the repository cd $TREE_ROOT $TLA inventory -s | sort > $TMP_PFX/arch-file-list cd $PWD cd $CVS_ROOT find . ! -type d | sed -e '/\/CVS\//d' -e 's,^\./,,' | sort > $TMP_PFX/cvs-file-list cd $PWD # Find the added, removed, changed files comm -13 $TMP_PFX/cvs-file-list $TMP_PFX/arch-file-list | fgrep -v .arch-inventory > $TMP_PFX/added-file-list comm -23 $TMP_PFX/cvs-file-list $TMP_PFX/arch-file-list | fgrep -v .cvsignore > $TMP_PFX/removed-file-list comm -12 $TMP_PFX/cvs-file-list $TMP_PFX/arch-file-list > $TMP_PFX/common-file-list : > $TMP_PFX/changed-file-list for i in `cat $TMP_PFX/common-file-list`; do if cmp $TREE_ROOT/$i $CVS_ROOT/$i >/dev/null 2>&1; then :; else echo "$i" > $TMP_PFX/changed-file-list fi done test -s $TMP_PFX/added-file-list || \ test -s $TMP_PFX/changed-file-list || test -s $TMP_PFX/removed-file-list || \ { echo $0: CVS repository is up-to-date exit 0 } # Make a changelog and edit it echo update from arch > $TMP_PFX/log_msg echo >> $TMP_PFX/log_msg for i in `grep -h ChangeLog $TMP_PFX/added-file-list $TMP_PFX/changed-file-list`; do dir=`dirname $i` if [ -f $CVS_ROOT/$dir/ChangeLog ]; then cvs_log=$CVS_ROOT/$dir/ChangeLog else cvs_log=/dev/null fi # This script tries to find everything that was added to the ChangeLogs # by looking at the diff. The lines in the first hunk are kept, up to the # first bunch of added lines (included). diff -u $cvs_log $TREE_ROOT/$dir/ChangeLog | sed \ -e '1,/^@@/c\' -e "$dir:" \ -e '/^+/,$ {' \ -e 's/^+//' \ -e 't' \ -e 's/.*//' \ -e 'q' \ -e '}' \ -e '/^-/d' \ -e 's/^.//' | sed -e '/^\.:/d' >> $TMP_PFX/log_msg done $EDITOR $TMP_PFX/log_msg # Move the changes to the CVS repository for i in `cat $TMP_PFX/added-file-list`; do echo "A $i" >&2 cp $TREE_ROOT/$i $CVS_ROOT/$i done for i in `cat $TMP_PFX/changed-file-list`; do echo "M $i" >&2 cp $TREE_ROOT/$i $CVS_ROOT/$i done for i in `cat $TMP_PFX/removed-file-list`; do echo "R $i" >&2 rm $CVS_ROOT/$i done # Check them in cd $CVS_ROOT if test -s $TMP_PFX/added-file-list; then echo "* adding files to CVS" >&2 xargs cvs add < $TMP_PFX/added-file-list fi if test -s $TMP_PFX/removed-file-list; then echo "* removing files from CVS" >&2 xargs cvs remove < $TMP_PFX/removed-file-list fi echo "* checking in changes to CVS" >&2 cvs ci -F $TMP_PFX/log_msg