#!/bin/sh
#
# Update the current version date in all files in the tree containing
# it.  Consider all release branches except those matching the regular
# expression in $IGNORE_BRANCHES, and also consider those branches listed
# in $ADD_BRANCHES.

SVNROOT=${SVNROOT:-"file:///svn/gcc"}
IGNORE_BRANCHES='gcc-(2_95|3_0|3_1|3_2|3_3|3_4)-branch'
ADD_BRANCHES='HEAD autovect-branch'

# Run this from /tmp.
export SVNROOT
/bin/rm -rf /tmp/$$
/bin/mkdir /tmp/$$
cd /tmp/$$

# The path to cvs.
SVN=${SVN:-/usr/bin/svn}

# Compute the branches which we should update.
BRANCHES=`$SVN ls $SVNROOT/branches \
	  | sed -e 's/\///' \
          | egrep 'gcc-[0-9]+_[0-9]+-branch$' \
          | egrep -v $IGNORE_BRANCHES`
# Always update the mainline.
BRANCHES="${BRANCHES} ${ADD_BRANCHES}"

# ARGS is passed to 'cvs co'
CURR_DATE=`/bin/date +"%Y%m%d"`

# version is contained within a char*
textstring_FILES="gcc/version.c"

# version is contained within a #define
cppdefine_FILES="libstdc++-v3/include/bits/c++config"

# version is all there is
datestamp_FILES="gcc/DATESTAMP"

FILES="$textstring_FILES $cppdefine_FILES $datestamp_FILES"
DIRS="$textstring_DIRS $cppdefine_DIRS $datestamp_DIRS"

# Assume all will go well.
RESULT=0
for BRANCH in $BRANCHES; do
  echo "Working on \"$BRANCH\"."
  # Check out the files on the branch.  HEAD is a special case; if
  # you check out files with -r HEAD, CVS will not let you check 
  # in changes.
  if test "$BRANCH" = HEAD; then 
    for i in $FILES; do
      ${SVN} -q co -N ${SVNROOT}/trunk/`dirname $i` `basename $i`
    done
  else
    for i in $FILES; do
      ${SVN} -q co -N ${SVNROOT}/branches/${BRANCH}/`dirname $i` `basename $i`
    done
  fi

  # There are no files to commit yet.
  COMMIT_FILES=""
   
  for file in $textstring_FILES; do
    dirname=`basename $file`
    file=`basename $file`
    file="$dirname/$file"
    if test -f $file; then 
      /bin/sed  <$file >$file.new -e \
  "s/\(.*\"[^ ]*\) [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\1 ${CURR_DATE}/" 

      if /usr/bin/cmp -s $file $file.new; then
	rm -f $file.new
      else
	mv -f $file.new $file
        COMMIT_FILES="$COMMIT_FILES $file"
      fi
    fi
  done
  
  for file in $cppdefine_FILES; do
    dirname=`basename $file`
    file=`basename $file`
    file="$dirname/$file"
    if test -f $file; then
      /bin/sed <$file >$file.new -e \
  "s/\(#.*\) [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/\1 ${CURR_DATE}/"

      if /usr/bin/cmp -s $file $file.new; then
	rm -f $file.new
      else
	mv -f $file.new $file
        COMMIT_FILES="$COMMIT_FILES $file"
      fi
    fi
  done

  for file in $datestamp_FILES; do
    dirname=`basename $file`
    file=`basename $file`
    file="$dirname/$file"
    if test -f $file; then
      echo ${CURR_DATE} > $file.new

      if /usr/bin/cmp -s $file $file.new; then
	rm -f $file.new
      else
	mv -f $file.new $file
        COMMIT_FILES="$COMMIT_FILES $file"
      fi
    fi
  done

  if test -n "$COMMIT_FILES"; then
    for i in $COMMIT_FILES; do
    echo "Attempting to commit $i"
    if ! ${SVN} commit -m "Daily bump." $i; then
       # If we could not commit the files, indicate failure.
       RESULT=1
     fi
    done
  fi
  
  # Remove the files.
  for i in $FILES; do
   rm -rf /tmp/$$/`basename $i`
  done
done

/bin/rm -rf /tmp/$$
exit $RESULT
