#! /bin/sh

########################################################################
#
# File:   gcc_release
# Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell
# Date:   2001-05-25
#
# Contents:
#   Script to create a GCC release.
#
# Copyright (c) 2001-2020 Free Software Foundation.
#
# This file is part of GCC.
#
# GCC 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, or (at your option)
# any later version.
#
# GCC 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.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.
#
########################################################################

########################################################################
# Notes
########################################################################

# Here is an example usage of this script, to create a GCC 3.0.2
# prerelease:
#
#   gcc_release -r 3.0.2
#
# This script will automatically use the head of the release branch
# to generate the release.

########################################################################
# Functions
########################################################################

# Issue the error message given by $@ and exit with a non-zero
# exit code.

error() {
    echo "gcc_release: error: $@"
    exit 1
}

# Issue the informational message given by $@.

inform() {
    echo "gcc_release: $@"
}

# Issue a usage message explaining how to use this script.

usage() {
cat <<EOF
gcc_release -r release [-f] [further options]
gcc_release -s name:gitbranch [further options]

Options:

  -r release           Version of the form X.Y or X.Y.Z.
  -s name:gitbranch    Create a snapshot, not a real release.

  -d destination       Local working directory where we will build the release
                       (default=${HOME}).
  -f                   Create a final release (and update ChangeLogs,...).
  -l                   Indicate that we are running on gcc.gnu.org.
  -p previous-tarball  Location of a previous tarball (to generate diff files).
  -t tag               Tag to mark the release in git.
  -u username          Username for upload operations.
  -b local-git-repo    Local git repository to speed up cloning.
EOF
    exit 1
}

# Change to the directory given by $1.

changedir() {
  cd $1 || \
    error "Could not change directory to $1"
}

# Build the source tree that will be the basis for the release
# in ${WORKING_DIRECTORY}/gcc-${RELEASE}.

build_sources() {
  # If the WORKING_DIRECTORY already exists, do not risk destroying it.
  if [ -r ${WORKING_DIRECTORY} ]; then
    error "\`${WORKING_DIRECTORY}' already exists"
  fi
  # Create the WORKING_DIRECTORY.
  mkdir "${WORKING_DIRECTORY}" \
    || error "Could not create \`${WORKING_DIRECTORY}'"
  changedir "${WORKING_DIRECTORY}"

  # Check out the sources.
  if [ -n "${GIT_REFERENCE}" ]; then
    ${GIT} clone -q --dissociate --reference "${GIT_REFERENCE}" \
		 -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \
        error "Could not check out release sources"
  else
    ${GIT} clone -q -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \
        error "Could not check out release sources"
  fi

  # If this is a final release, make sure that the ChangeLogs
  # and version strings are updated.
  if [ ${FINAL} -ne 0 ]; then
    inform "Updating ChangeLogs and version files"

    grep -q "gcc-${RELEASE_MAJOR}/index.html gcc-${RELEASE_MAJOR}/changes.html" \
	 ${SOURCE_DIRECTORY}/contrib/gennews ||\
	   error "New release not listed in contrib/gennews"

    ${SOURCE_DIRECTORY}/contrib/gennews > NEWS ||\
	   error "Could not regenerate NEWS files"

    grep -q "no releases of GCC ${RELEASE_MAJOR} have yet been made" NEWS &&\
	   error "gcc-${RELEASE_MAJOR}/index.html has not been updated yet"

    grep -q "GCC ${RELEASE_MAJOR} has not been released yet" NEWS &&\
	   error "gcc-${RELEASE_MAJOR}/changes.html has not been updated yet"

    thisindex="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/index.html"
    thischanges="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/changes.html"
    previndex="http:\/\/gcc.gnu.org\/gcc-`expr ${RELEASE_MAJOR} - 1`\/index.html"
    sed -n -e "/^${thisindex}/,/^${thischanges}/p" NEWS |\
	   sed -n -e "/Release History/,/References and Acknowledgments/p" |\
	   grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\
	   error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\
		 "in gcc-${RELEASE_MAJOR}/index.html"

    sed -n -e "/^${thischanges}/,/^${previndex}/p" NEWS |\
	   grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\
	   error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\
		 "in gcc-${RELEASE_MAJOR}/changes.html"

    rm -f NEWS

    commit_files=""
    for x in `changedir ${SOURCE_DIRECTORY} && \
	      find . -name ChangeLog`; do
      # Update this ChangeLog file only if it does not yet contain the
      # entry we are going to add.  (This is a safety net for repeated
      # runs of this script for the same release.)
      if ! grep "GCC ${RELEASE} released." ${SOURCE_DIRECTORY}/${x} > /dev/null ; then       
	cat - ${SOURCE_DIRECTORY}/${x} > ${SOURCE_DIRECTORY}/${x}.new <<EOF
${LONG_DATE}  Release Manager

	* GCC ${RELEASE} released.

EOF
	mv ${SOURCE_DIRECTORY}/${x}.new ${SOURCE_DIRECTORY}/${x} \
	  || error "Could not update ${x}"
	commit_files="${commit_files} ${x}"
      fi
    done

    # Update gcc/DEV-PHASE.

    if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` != ${RELEASE} ]; then
      [ ${RELEASE_MAJOR} -lt 5 ] && \
	error "Release number ${RELEASE} does not match BASE-VER"
      if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` \
	   = ${RELEASE_MAJOR}.`expr ${RELEASE_MINOR} - 1`.1 \
	   -a x${RELEASE_REVISION} = x0 ]; then
	(changedir ${SOURCE_DIRECTORY}/gcc && \
	 echo ${RELEASE} > BASE-VER) || \
	error "Could not update BASE-VER"
	commit_files="${commit_files} gcc/BASE-VER"
      else
	error "Release number ${RELEASE} does not immediately follow BASE-VER"
      fi
    fi
    (changedir ${SOURCE_DIRECTORY}/gcc && \
     : > DEV-PHASE) || \
    error "Could not update DEV-PHASE"
    commit_files="${commit_files} gcc/DEV-PHASE"

    (changedir ${SOURCE_DIRECTORY} && \
     ${GIT} commit -q -m 'Update ChangeLog and version files for release' ${commit_files} && \
     ${GIT} push) || \
    error "Could not commit ChangeLog and version file updates"

    # Make sure we tag the sources for a final release.
    TAG="releases/gcc-${RELEASE}"
  fi

  # Tag the sources.
  if [ -n "${TAG}" ]; then
    inform "Tagging sources as ${TAG}"
    # We don't want to overwrite an existing tag.  So, if the tag
    # already exists, issue an error message; the release manager can
    # manually remove the tag if appropriate.
    if (changedir ${SOURCE_DIRECTORY} && \
	${GIT} rev-parse "refs/tags/${TAG}" > /dev/null 2>&1); then
      error "Tag ${TAG} already exists"
    fi
    (changedir ${SOURCE_DIRECTORY} && \
     ${GIT} tag -s -m "GCC ${RELEASE} release" "${TAG}" && \
     ${GIT} push origin tag "${TAG}") || \
      error "Could not tag sources"
    GITBRANCH=${TAG}
  fi

  GITREV=`cd ${SOURCE_DIRECTORY} && ${GIT} rev-parse HEAD`
  inform "Sources are commit ${GITREV}"

  # Make sure there are no uncommitted changes in the sources.
  status=${WORKING_DIRECTORY}/gitstatus.$$
  (changedir ${SOURCE_DIRECTORY} && \
   ${GIT} status --porcelain --ignored > "$status") || \
    error "Could not get source directory status"
  if [ -s "$status" ]; then
    cat "$status"
    error "Source directory has unexpected changes"
  fi
  rm "$status"

  # Remove .git from the sources.
  rm -rf "${SOURCE_DIRECTORY}/.git" || \
    error "Could not remove .git from sources"

  # Run gcc_update on them to set up the timestamps nicely, and (re)write
  # the LAST_UPDATED file containing the git tag/revision used.
  changedir "gcc-${RELEASE}"
  contrib/gcc_update --touch
  echo "Obtained from git: ${GITBRANCH} revision ${GITREV}" > LAST_UPDATED

  # For a prerelease or real release, we need to generate additional
  # files not present in git.
  changedir "${SOURCE_DIRECTORY}"
  if [ $SNAPSHOT -ne 1 ]; then
    # Generate the documentation.
    inform "Building install docs"
    SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc
    DESTDIR=${SOURCE_DIRECTORY}/INSTALL
    export SOURCEDIR
    export DESTDIR
    ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html

    # Regenerate the NEWS file.
    contrib/gennews > NEWS || \
      error "Could not regenerate NEWS files"

    # Now, we must build the compiler in order to create any generated
    # files that are supposed to go in the source directory.  This is
    # also a good sanity check to make sure that the release builds
    # on at least one platform.
    inform "Building compiler"
    OBJECT_DIRECTORY=../objdir
    num_cpus=1
    if type -p getconf 2>/dev/null; then
      num_cpus=`getconf _NPROCESSORS_ONLN 2>/dev/null`
      case "$num_cpus" in
	'' | 0* | *[!0-9]*) num_cpus=1;;
      esac
    fi
    contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
      -c "--enable-generated-files-in-srcdir --disable-multilib" \
      -m "-j$num_cpus" build || \
      error "Could not rebuild GCC"
  fi

  # Move message catalogs to source directory.
  mv ../objdir/gcc/po/*.gmo gcc/po/
  [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/

  # Create a "MD5SUMS" file to use for checking the validity of the release.
  echo \
"# This file contains the MD5 checksums of the files in the 
# gcc-"${RELEASE}".tar.xz tarball.
#
# Besides verifying that all files in the tarball were correctly expanded,
# it also can be used to determine if any files have changed since the
# tarball was expanded or to verify that a patchfile was correctly applied.
#
# Suggested usage:
# md5sum -c MD5SUMS | grep -v \"OK$\"
#" > MD5SUMS

  find . -type f |
  sed -e 's:^\./::' -e '/MD5SUMS/d' |
  sort |
  xargs md5sum >>MD5SUMS
}

# Build a single tarfile.  The first argument is the name of the tarfile
# to build, without any suffixes.  They will be added automatically.  The
# rest of the arguments are files or directories to include, and possibly
# other arguments to tar.

build_tarfile() {
  # Get the name of the destination tar file.
  TARFILE="$1.tar.xz"
  shift

  # Build the tar file itself.
  (${TAR} cf - "$@" | ${XZ} > ${TARFILE}) || \
    error "Could not build tarfile"
  FILE_LIST="${FILE_LIST} ${TARFILE}"
}

# Build the various tar files for the release.

build_tarfiles() {
  inform "Building tarfiles"

  changedir "${WORKING_DIRECTORY}"

  # The GNU Coding Standards specify that all files should
  # world readable.
  chmod -R a+r ${SOURCE_DIRECTORY}
  # And that all directories have mode 755.
  find ${SOURCE_DIRECTORY} -type d -exec chmod 755 {} \;
 
  # Build one huge tarfile for the entire distribution.
  build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
}

# Build .gz files.
build_gzip() {
  for f in ${FILE_LIST}; do
    target=${f%.xz}.gz
    (${XZ} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
  done
}

# Build diffs against an old release.
build_diffs() {
  old_dir=${1%/*}
  old_file=${1##*/}
  case "$old_file" in
    *.tar.xz) old_vers=${old_file%.tar.xz};;
    *) old_vers=${old_file%.tar.bz2};;
  esac
  old_vers=${old_vers#gcc-}
  inform "Building diffs against version $old_vers"
  for f in gcc; do
    if [ -e ${old_dir}/${f}-${old_vers}.tar.xz ]; then
      old_tar=${old_dir}/${f}-${old_vers}.tar.xz
    else
      old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
    fi
    new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.xz
    if [ ! -e $old_tar ]; then
      inform "$old_tar not found; not generating diff file"
    elif [ ! -e $new_tar ]; then
      inform "$new_tar not found; not generating diff file"
    else
      build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
        ${f}-${old_vers}-${RELEASE}.diff.xz
    fi
  done
}

# Build an individual diff.
build_diff() {
  changedir "${WORKING_DIRECTORY}"
  tmpdir=gccdiff.$$
  mkdir $tmpdir || error "Could not create directory $tmpdir"
  changedir $tmpdir
  case "$1" in
    *.tar.bz2)
      (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
      ;;
    *.tar.xz)
      (${XZ} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
      ;;
  esac
  (${XZ} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs"
  ${DIFF} $2 $4 > ../${5%.xz}
  if [ $? -eq 2 ]; then
    error "Trouble making diffs from $1 to $3"
  fi
  ${XZ} ../${5%.xz} || error "Could not generate ../$5"
  changedir ..
  rm -rf $tmpdir
  FILE_LIST="${FILE_LIST} $5"
}

# Upload the files to the FTP server.
upload_files() {
  inform "Uploading files"

  changedir "${WORKING_DIRECTORY}"

  # Make sure the directory exists on the server.
  if [ $LOCAL -eq 0 ]; then
    ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
      mkdir -m 755 -p "${FTP_PATH}/diffs"
    UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
  else
    mkdir -p "${FTP_PATH}/diffs" \
      || error "Could not create \`${FTP_PATH}'"
    UPLOAD_PATH=${FTP_PATH}
  fi

  # Then copy files to their respective (sub)directories.
  for x in gcc*.gz gcc*.xz; do
    if [ -e ${x} ]; then
      # Make sure the file will be readable on the server.
      chmod a+r ${x}
      # Copy it.
      case ${x} in
        *.diff.*)
          SUBDIR="diffs/";
          ;;
        *)
          SUBDIR="";
      esac
      ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
        || error "Could not upload ${x}"
    fi
  done
}

# Print description if snapshot exists.
snapshot_print() {
  if [ -e ${RELEASE}/$1 ]; then
    hash=`openssl  sha256  ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
    hash2=`openssl sha1 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`

    printf " %-37s%s\n\n  %s\n  %s\n\n" "$1" "$2" "$hash" "$hash2" \
      >> ${SNAPSHOT_README}

     echo "  <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX}
     echo "      <td>$2</td></tr>" >> ${SNAPSHOT_INDEX}
  fi
}

# Announce a snapshot, both on the web and via mail.
announce_snapshot() {
  inform "Updating links and READMEs on the FTP server"
  
  TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
  SNAPSHOT_README=${RELEASE}/README
  SNAPSHOT_INDEX=${RELEASE}/index.html

  changedir "${SNAPSHOTS_DIR}"
  echo \
"Snapshot gcc-"${RELEASE}" is now available on
  https://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.

This snapshot has been generated from the GCC "${BRANCH}" git branch
with the following options: "git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}"

You'll find:
" > ${SNAPSHOT_README}

  echo \
"<html>

<head>
<title>GCC "${RELEASE}" Snapshot</title>
</head>

<body>
<h1>GCC "${RELEASE}" Snapshot</h1>

<p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
periodic snapshots of the GCC source tree available to the public
for testing purposes.</p>
	
<p>If you are planning to download and use one of our snapshots, then
we highly recommend you join the GCC developers list.  Details for
how to sign up can be found on the GCC project home page.</p>

<p>This snapshot has been generated from the GCC "${BRANCH}" git branch
with the following options: <code>"git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}"</code></p>

<table>" > ${SNAPSHOT_INDEX}
       
  snapshot_print gcc-${RELEASE}.tar.xz "Complete GCC"

  echo \
"Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.

When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
link is updated and a message is sent to the gcc list.  Please do not use
a snapshot before it has been announced that way." >> ${SNAPSHOT_README}

  echo \
"</table>
<p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
<a href=\"diffs/\">diffs/ subdirectory</a>.</p>

<p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
link is updated and a message is sent to the gcc list.  Please do not use
a snapshot before it has been announced that way.</p>

<hr />

<address>
<a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a>
<br />
Last modified "${TEXT_DATE}"
</address>
</body>

</html>" >> ${SNAPSHOT_INDEX}

  rm -f LATEST-${BRANCH}
  ln -s ${RELEASE} LATEST-${BRANCH}

  inform "Sending mail"

  export QMAILHOST=gcc.gnu.org
  mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
}

########################################################################
# Initialization
########################################################################

LC_ALL=C
export LC_ALL

# Today's date.
DATE=`date "+%Y%m%d"`
LONG_DATE=`date "+%Y-%m-%d"`

GIT=${GIT:-git}
# The server containing the GCC repository.
GIT_SERVER="gcc.gnu.org"
# The path to the repository on that server.
GIT_REPOSITORY="/git/gcc.git"
# The username to use when connecting to the server.
GIT_USERNAME="${USER}"

# The machine to which files will be uploaded.
GCC_HOSTNAME="gcc.gnu.org"
# The name of the account on the machine to which files are uploaded.
GCC_USERNAME="gccadmin"
# The directory in which the files will be placed (do not use ~user syntax).
FTP_PATH=/var/ftp/pub/gcc
# The directory in which snapshots will be placed.
SNAPSHOTS_DIR=${FTP_PATH}/snapshots

# The major number for the release.  For release `3.0.2' this would be 
# `3'
RELEASE_MAJOR=""
# The minor number for the release.  For release `3.0.2' this would be
# `0'.
RELEASE_MINOR=""
# The revision number for the release.  For release `3.0.2' this would
# be `2'.
RELEASE_REVISION=""
# The complete name of the release.
RELEASE=""

# The name of the branch from which the release should be made, in a 
# user-friendly form.
BRANCH=""

# The name of the branch from which the release should be made, as used
# for our version control system.
GITBRANCH=""

# The tag to apply to the sources used for the release.
TAG=""

# The old tarballs from which to generate diffs.
OLD_TARS=""

# Local gcc git checkout to speed up git cloning.
GIT_REFERENCE=""

# The directory that will be used to construct the release.  The
# release itself will be placed in a subdirectory of this directory.
DESTINATION=${HOME}
# The subdirectory.
WORKING_DIRECTORY=""
# The directory that will contain the GCC sources.
SOURCE_DIRECTORY=""

# Non-zero if this is the final release, rather than a prerelease.
FINAL=0

# Non-zero if we are building a snapshot, and don't build gcc or
# include generated files.
SNAPSHOT=0

# Non-zero if we are running locally on gcc.gnu.org, and use local CVS
# and copy directly to the FTP directory.
LOCAL=0

# Major operation modes.
MODE_GZIP=0
MODE_DIFFS=0
MODE_SOURCES=0
MODE_TARFILES=0
MODE_UPLOAD=0

# List of archive files generated; used to create .gz files from .xz.
FILE_LIST=""

# Programs we use.

BZIP2="${BZIP2:-bzip2}"
XZ="${XZ:-xz -T0 --best}"
CVS="${CVS:-cvs -f -Q -z9}"
DIFF="${DIFF:-diff -Nrcpad}"
ENV="${ENV:-env}"
GZIP="${GZIP:-gzip --best}"
SCP="${SCP:-scp -p}"
SSH="${SSH:-ssh}"
TAR="${TAR:-tar}"

########################################################################
# Command Line Processing
########################################################################

# Parse the options.
while getopts "d:fr:u:t:p:s:lb:" ARG; do
    case $ARG in
    d)    DESTINATION="${OPTARG}";;
    r)    RELEASE="${OPTARG}";;
    t)    TAG="${OPTARG}";;
    u)    GIT_USERNAME="${OPTARG}";;
    f)    FINAL=1;;
    s)    SNAPSHOT=1
          BRANCH=${OPTARG%:*}
          GITBRANCH=${OPTARG#*:}
          ;;
    l)    LOCAL=1
	  SCP=cp
	  PATH=~:/usr/local/bin:$PATH;;
    p)    OLD_TARS="${OLD_TARS} ${OPTARG}"
          if [ ! -f ${OPTARG} ]; then
	    error "-p argument must name a tarball"
	  fi;;
    b)    GIT_REFERENCE="${OPTARG}";;
    \?)   usage;;
    esac
done
shift `expr ${OPTIND} - 1`

# Handle the major modes.
while [ $# -ne 0 ]; do
    case $1 in
    diffs)    MODE_DIFFS=1;;
    gzip)     MODE_GZIP=1;;
    sources)  MODE_SOURCES=1;;
    tarfiles) MODE_TARFILES=1;;
    upload)   MODE_UPLOAD=1;;
    all)      MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1;
              if [ $SNAPSHOT -ne 1 ]; then
                # Only for releases and pre-releases.
                MODE_GZIP=1;
              fi
              ;;
    *)        error "Unknown mode $1";;
    esac
    shift
done

# Perform consistency checking.
if [ ${LOCAL} -eq 0 ] && [ -z ${GIT_USERNAME} ]; then
  error "No username specified"
fi

if [ ! -d ${DESTINATION} ]; then
  error "\`${DESTINATION}' is not a directory"
fi

if [ $SNAPSHOT -eq 0 ]; then
  if [ -z ${RELEASE} ]; then
    error "No release number specified"
  fi

  # Compute the major and minor release numbers.
  RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'`
  RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'`
  RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'`

  if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
    error "Release number \`${RELEASE}' is invalid"
  fi

  # Compute the full name of the release.
  if [ -z "${RELEASE_REVISION}" ]; then
    RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}"
  else
    RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}"
  fi

  # Compute the name of the branch, which is based solely on the major
  # release number.
  GITBRANCH="releases/gcc-${RELEASE_MAJOR}"

  # If this is not a final release, set various parameters accordingly.
  if [ ${FINAL} -ne 1 ]; then
    RELEASE="${RELEASE}-RC-${DATE}"
    FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}"
  else
    FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
  fi
else
  RELEASE=${BRANCH}-${DATE}
  FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"

  # If diffs are requested when building locally on gcc.gnu.org, we (usually)
  # know what the last snapshot date was and take the corresponding tarballs,
  # unless the user specified tarballs explicitly.
  if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then
    LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
    OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
    if [ ! -e $OLD_TARS ]; then
      OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.xz
    fi
  fi
fi

# Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
WORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
SOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"

# Set up GITROOT.
if [ $LOCAL -eq 0 ]; then
    GITROOT="git+ssh://${GIT_USERNAME}@${GIT_SERVER}${GIT_REPOSITORY}"
else
    GITROOT="/git/gcc.git"
fi
export GITROOT

########################################################################
# Main Program
########################################################################

# Set the timezone to UTC
TZ="UTC0"
export TZ

# Build the source directory.

if [ $MODE_SOURCES -ne 0 ]; then
  build_sources
fi

# Build the tar files.

if [ $MODE_TARFILES -ne 0 ]; then
  build_tarfiles
fi

# Build diffs

if [ $MODE_DIFFS -ne 0 ]; then
  # Possibly build diffs.
  if [ -n "$OLD_TARS" ]; then
    for old_tar in $OLD_TARS; do
      build_diffs $old_tar
    done
  fi
fi

# Build gzip files
if [ $MODE_GZIP -ne 0 ]; then
  build_gzip
fi

# Upload them to the FTP server.
if [ $MODE_UPLOAD -ne 0 ]; then
  upload_files

  # For snapshots, make some further updates.
  if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
    announce_snapshot

    # Update snapshot date file.
    changedir ~
    echo $DATE > .snapshot_date-${BRANCH}

    # Remove working directory
    rm -rf ${WORKING_DIRECTORY}
  fi
fi
