#!/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.

CVSROOT=${CVSROOT:-/cvs/gcc}
IGNORE_BRANCHES='gcc-(2_95|3_0|3_1|3_2|3_3)-branch'
ADD_BRANCHES='HEAD autovect-branch dfp-branch'

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

# The path to cvs.
CVS=${CVS:-/usr/local/bin/cvs}

# Compute the branches which we should update.
$CVS co gcc/ChangeLog
BRANCHES=`$CVS status -v gcc/ChangeLog \
          | awk '{print $1;}' \
          | 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/gcc/version.c"

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

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

FILES="$textstring_FILES $cppdefine_FILES $datestamp_FILES"

# 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 
    ${CVS} co $FILES
  else
    ${CVS} co -r $BRANCH $FILES
  fi

  # There are no files to commit yet.
  COMMIT_FILES=""

  for file in $textstring_FILES; do
    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
    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
    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" \
     && ! ${CVS} commit -m "Daily bump." $COMMIT_FILES; then
    # If we could not commit the files, indicate failure.
    RESULT=1
  fi

  # Remove the files.
  rm -rf gcc
done

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