#! /bin/sh

# $Id: driver.sh,v 1.2 2012/11/28 00:30:32 svnexp Exp svnexp $

HOME=/local/svnexp; export HOME
CVSROOT=$HOME/Fake-CVSROOT; export CVSROOT

TDIR=/local/svnexp/tmp

commitcount=0

svnpath="$1"
cvspath="$2"
cvsbranch="$3"

if [ ! -f $HOME/$cvspath.RUN ]; then
  echo "  $cvspath is not scheduled to run"
  exit 0
fi

echo "svnpath $svnpath  cvspath $cvspath  cvsbranch $cvsbranch"

myrev=$(svn info svnco/$svnpath | awk -F: '$1 == "Revision" {print $2}')
testrev=$(expr $myrev + 1)

cvs=/local/svnexp/exportcvs/$cvspath
svn=/local/svnexp/svnco/$svnpath

while true
do
  cd $HOME
  if [ $commitcount -gt 10 ] ; then
    echo "commit count 10; finishing"
    exit 0
  fi
  lastrev=$(svn info svn://svn.freebsd.org/$svnpath | awk -F: '$1 == "Last Changed Rev" {print $2}')
  if [ "$lastrev" = "" ]; then
    echo "Invalid lastrev, aborting"
    exit 0
  fi
  echo "=== considering" $testrev of $lastrev
  if [ $testrev -gt $lastrev -a ! -f $cvs/force-commit ]; then
    break
  fi
  nextrev=$(svn info -r $testrev svn://svn.freebsd.org/$svnpath | awk -F: '$1 == "Last Changed Rev" {print $2}')
  if [ "$nextrev" = "" ]; then
    echo "Invalid nextrev, aborting"
    exit 0
  fi
  if [ $nextrev = $testrev -o -f $cvs/force-commit ]; then
    cd $HOME
    commitcount=$(expr $commitcount + 1)
    echo "=== commit" $nextrev
    svn log -c $nextrev -v svn://svn.freebsd.org/$svnpath

    #===

    svnrev=$(echo $nextrev)

    rm -f $cvs/force-commit

    cd $cvs || exit 1
    cvs -Rq up $cvsbranch -d -C
    find . -name '.#*' -delete

    cd $svn || exit 1
    #svn revert . || exit 1
    svn up -r $svnrev || exit 1

    cd $cvs || exit 1
    find . -name CVS -prune -o -name LASTCOMMIT.txt -prune -o -type f -print | sed -e 's@^\./@@' | sort -n > $TDIR/cvsfiles
    find . -name CVS -prune -o -type d -print | sed -e 's@^\./@@' | sort -n > $TDIR/cvsdirs

    cd $svn || exit 1
    cp /local/svnexp/deprecated.src etc/rc.d/deprecated || exit 1
    chmod +x etc/rc.d/deprecated || exit 1
    find . -name .svn -prune -o -type f -print | sed -e 's@^\./@@' | sort -n > $TDIR/svnfiles
    find . -name .svn -prune -o -type d -print | sed -e 's@^\./@@' | sort -n > $TDIR/svndirs

    cd $cvs || exit 1
    comm -2 -3 $TDIR/svndirs $TDIR/cvsdirs > $TDIR/dirsadd
    while read d; do
      echo Adding directory $d
      mkdir -p $d
      cvs -q add $d 2>&1
    done <  $TDIR/dirsadd

    cd $cvs || exit 1
    comm -2 -3 $TDIR/svnfiles $TDIR/cvsfiles > $TDIR/filesadd
    while read f; do
      echo Adding file $f
      cp $svn/$f $f
      cvs -q add $f 2>&1
    done < $TDIR/filesadd

    cd $cvs || exit 1
    comm -1 -3 $TDIR/svnfiles $TDIR/cvsfiles > $TDIR/filesremove
    while read f; do
      echo Deleting file $f
      cvs -q rm -f $f 2>&1
    done < $TDIR/filesremove

    comm -1 -2 $TDIR/svnfiles $TDIR/cvsfiles > $TDIR/commonfiles

    cd $cvs || exit 1
    xargs md5 < $TDIR/commonfiles > $TDIR/cvssum

    cd $svn || exit 1
    xargs md5 < $TDIR/commonfiles > $TDIR/svnsum

    cd $cvs || exit 1
    diff -u $TDIR/svnsum $TDIR/cvssum | grep '^-MD5' | sed -e 's/.*(\(.*\)).*/\1/' > $TDIR/changed
    while read f; do
      echo Updating file: $f
      cp $svn/$f $f
    done < $TDIR/changed

    cd $svn || exit 1
    echo "## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/$svnrev" > $TDIR/commitmsg
    echo "## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated" >> $TDIR/commitmsg
#    case "$svnpath" in
#      base/head)
#        ;;
#      *)
#        echo "## SVN ##" >> $TDIR/commitmsg
#        svn log -c $svnrev | sed -e 's/^/## SVN ## /'  >> $TDIR/commitmsg
#        echo "## SVN ##" >> $TDIR/commitmsg
#        ;;
#    esac

    cd $svn || exit 1
    echo "## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/$svnrev" > $cvs/LASTCOMMIT.txt
    echo "## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated" >> $cvs/LASTCOMMIT.txt
    svn log -c $svnrev -v | sed -e 's/^/## SVN ## /' >> $cvs/LASTCOMMIT.txt

    cd $cvs || exit 1
    cvs add LASTCOMMIT.txt >/dev/null 2>&1

    cvs -q commit -F $TDIR/commitmsg
    #===
    echo "xxx sleep 5"
    sleep 5
  else
    cd $HOME
    echo "=== not my tree" $testrev
  fi
  testrev=$(expr $testrev + 1)
done
rm -f $HOME/$cvspath.RUN
