#! /bin/bash

# Update or check out GCC sources for a particular Subversion revision
# and a particular branch.
#
# Copyright (C) 2007 Free Software Foundation.
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# For a copy of the GNU General Public License, write the the
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA 02111-1301, USA.

#set -ex

if [ $# != 1 ]; then
  echo Usage: $0 id
  exit 1
fi

if [ "x${REG_DO_CLEANUPS}" != "x" ]; then
  reg_cleanup
fi

ID=$1
BRANCH=""

########################################################################
# Get sources.
########################################################################

svn_get() {
  # In case there are problems with updates (there were with CVS),
  # creating a file called REMOVE in the REG_SRCDIR directory causes us
  # to start with a clean tree each time.

  unset LC_ALL
  unset LANG

  cd ${REG_SRCDIR}
  if [ -d gcc ]; then
    # There's already a tree; do an update with the new revision.
    cd gcc
    echo "`date`  svn update begun for id ${ID}, rev ${REV}"
    echo svn update --non-interactive --revision ${REV} >> $LOG
    svn update --non-interactive --revision ${REV} >> $LOG
    if [ $? -eq 0 ]; then
      echo "`date`  svn update done"
    else
      echo "`date`  svn update failed"
      exit 1
    fi
  else
    echo "`date`  svn checkout begun for id ${ID}, rev ${REV}"
    echo svn checkout --non-interactive --revision ${REV} \
      ${REG_SVN_REPO}/${BRANCHPATH} gcc >> $LOG
    svn checkout --non-interactive --revision ${REV} \
      ${REG_SVN_REPO}/${BRANCHPATH} gcc >> $LOG
    if [ $? -eq 0 ]; then
      echo "`date`  svn checkout done"
    else
      echo "`date`  svn checkout failed"
      exit 1
    fi
    cd gcc
  fi

  # Touch generated files.
  contrib/gcc_update --touch >> $LOG
}

########################################################################
# Main program
########################################################################

cd ${REG_SRCDIR}

# This is a simple way to stop a long regression search fairly cleanly;
# just touch a file called STOP.

if [ -f STOP ]; then
  echo "`date`  $0 detected STOP file"
  rm -f STOP
  exit 1
fi

# Set up the log file.
REV=`${REG_IDS} -f index -t rev ${ID}`
LOG=${REG_SRCDIR}/logs/${BUGID}/${REV}.log
mkdir -p ${REG_SRCDIR}/logs/${BUGID}
rm -f $LOG
touch $LOG

# Get the branch for this patch.
BRANCH=`${REG_IDS} -f index -t branch ${ID}`
if [ "${BRANCH}" = "error" ]; then
  echo "`date`  $0: cannot determine the SVN branch for id ${ID}"
  exit 1
fi

if [ "${BRANCH}" = "trunk" ]; then
  BRANCHPATH=trunk
else
  BRANCHPATH=branches/${BRANCH}
fi

svn_get

exit 0
