xref: /netbsd-src/external/gpl3/gcc.old/dist/maintainer-scripts/gcc_release (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg#! /bin/sh
21debfc3dSmrg
31debfc3dSmrg########################################################################
41debfc3dSmrg#
51debfc3dSmrg# File:   gcc_release
61debfc3dSmrg# Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell
71debfc3dSmrg# Date:   2001-05-25
81debfc3dSmrg#
91debfc3dSmrg# Contents:
101debfc3dSmrg#   Script to create a GCC release.
111debfc3dSmrg#
12c0a68be4Smrg# Copyright (c) 2001-2020 Free Software Foundation.
131debfc3dSmrg#
141debfc3dSmrg# This file is part of GCC.
151debfc3dSmrg#
161debfc3dSmrg# GCC is free software; you can redistribute it and/or modify
171debfc3dSmrg# it under the terms of the GNU General Public License as published by
181debfc3dSmrg# the Free Software Foundation; either version 3, or (at your option)
191debfc3dSmrg# any later version.
201debfc3dSmrg#
211debfc3dSmrg# GCC is distributed in the hope that it will be useful,
221debfc3dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
231debfc3dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
241debfc3dSmrg# GNU General Public License for more details.
251debfc3dSmrg#
261debfc3dSmrg# You should have received a copy of the GNU General Public License
271debfc3dSmrg# along with GCC; see the file COPYING3.  If not see
281debfc3dSmrg# <http://www.gnu.org/licenses/>.
291debfc3dSmrg#
301debfc3dSmrg########################################################################
311debfc3dSmrg
321debfc3dSmrg########################################################################
331debfc3dSmrg# Notes
341debfc3dSmrg########################################################################
351debfc3dSmrg
361debfc3dSmrg# Here is an example usage of this script, to create a GCC 3.0.2
371debfc3dSmrg# prerelease:
381debfc3dSmrg#
391debfc3dSmrg#   gcc_release -r 3.0.2
401debfc3dSmrg#
411debfc3dSmrg# This script will automatically use the head of the release branch
421debfc3dSmrg# to generate the release.
431debfc3dSmrg
441debfc3dSmrg########################################################################
451debfc3dSmrg# Functions
461debfc3dSmrg########################################################################
471debfc3dSmrg
48a2dc1f3fSmrg# Issue the error message given by $@ and exit with a non-zero
491debfc3dSmrg# exit code.
501debfc3dSmrg
511debfc3dSmrgerror() {
52a2dc1f3fSmrg    echo "gcc_release: error: $@"
531debfc3dSmrg    exit 1
541debfc3dSmrg}
551debfc3dSmrg
56a2dc1f3fSmrg# Issue the informational message given by $@.
571debfc3dSmrg
581debfc3dSmrginform() {
59a2dc1f3fSmrg    echo "gcc_release: $@"
601debfc3dSmrg}
611debfc3dSmrg
621debfc3dSmrg# Issue a usage message explaining how to use this script.
631debfc3dSmrg
641debfc3dSmrgusage() {
651debfc3dSmrgcat <<EOF
661debfc3dSmrggcc_release -r release [-f] [further options]
67a2dc1f3fSmrggcc_release -s name:gitbranch [further options]
681debfc3dSmrg
691debfc3dSmrgOptions:
701debfc3dSmrg
711debfc3dSmrg  -r release           Version of the form X.Y or X.Y.Z.
72a2dc1f3fSmrg  -s name:gitbranch    Create a snapshot, not a real release.
731debfc3dSmrg
741debfc3dSmrg  -d destination       Local working directory where we will build the release
751debfc3dSmrg                       (default=${HOME}).
761debfc3dSmrg  -f                   Create a final release (and update ChangeLogs,...).
771debfc3dSmrg  -l                   Indicate that we are running on gcc.gnu.org.
781debfc3dSmrg  -p previous-tarball  Location of a previous tarball (to generate diff files).
79a2dc1f3fSmrg  -t tag               Tag to mark the release in git.
801debfc3dSmrg  -u username          Username for upload operations.
81c0a68be4Smrg  -b local-git-repo    Local git repository to speed up cloning.
821debfc3dSmrgEOF
831debfc3dSmrg    exit 1
841debfc3dSmrg}
851debfc3dSmrg
861debfc3dSmrg# Change to the directory given by $1.
871debfc3dSmrg
881debfc3dSmrgchangedir() {
891debfc3dSmrg  cd $1 || \
901debfc3dSmrg    error "Could not change directory to $1"
911debfc3dSmrg}
921debfc3dSmrg
931debfc3dSmrg# Build the source tree that will be the basis for the release
941debfc3dSmrg# in ${WORKING_DIRECTORY}/gcc-${RELEASE}.
951debfc3dSmrg
961debfc3dSmrgbuild_sources() {
971debfc3dSmrg  # If the WORKING_DIRECTORY already exists, do not risk destroying it.
981debfc3dSmrg  if [ -r ${WORKING_DIRECTORY} ]; then
991debfc3dSmrg    error "\`${WORKING_DIRECTORY}' already exists"
1001debfc3dSmrg  fi
1011debfc3dSmrg  # Create the WORKING_DIRECTORY.
1021debfc3dSmrg  mkdir "${WORKING_DIRECTORY}" \
1031debfc3dSmrg    || error "Could not create \`${WORKING_DIRECTORY}'"
1041debfc3dSmrg  changedir "${WORKING_DIRECTORY}"
1051debfc3dSmrg
106a2dc1f3fSmrg  # Check out the sources.
107c0a68be4Smrg  if [ -n "${GIT_REFERENCE}" ]; then
108c0a68be4Smrg    ${GIT} clone -q --dissociate --reference "${GIT_REFERENCE}" \
109c0a68be4Smrg		 -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \
110c0a68be4Smrg        error "Could not check out release sources"
111c0a68be4Smrg  else
112a2dc1f3fSmrg    ${GIT} clone -q -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \
113a2dc1f3fSmrg        error "Could not check out release sources"
114c0a68be4Smrg  fi
115a2dc1f3fSmrg
1161debfc3dSmrg  # If this is a final release, make sure that the ChangeLogs
1171debfc3dSmrg  # and version strings are updated.
1181debfc3dSmrg  if [ ${FINAL} -ne 0 ]; then
1191debfc3dSmrg    inform "Updating ChangeLogs and version files"
1201debfc3dSmrg
121a2dc1f3fSmrg    grep -q "gcc-${RELEASE_MAJOR}/index.html gcc-${RELEASE_MAJOR}/changes.html" \
122a2dc1f3fSmrg	 ${SOURCE_DIRECTORY}/contrib/gennews ||\
123a2dc1f3fSmrg	   error "New release not listed in contrib/gennews"
124a2dc1f3fSmrg
125a2dc1f3fSmrg    ${SOURCE_DIRECTORY}/contrib/gennews > NEWS ||\
126a2dc1f3fSmrg	   error "Could not regenerate NEWS files"
127a2dc1f3fSmrg
128a2dc1f3fSmrg    grep -q "no releases of GCC ${RELEASE_MAJOR} have yet been made" NEWS &&\
129a2dc1f3fSmrg	   error "gcc-${RELEASE_MAJOR}/index.html has not been updated yet"
130a2dc1f3fSmrg
131a2dc1f3fSmrg    grep -q "GCC ${RELEASE_MAJOR} has not been released yet" NEWS &&\
132a2dc1f3fSmrg	   error "gcc-${RELEASE_MAJOR}/changes.html has not been updated yet"
133a2dc1f3fSmrg
134a2dc1f3fSmrg    thisindex="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/index.html"
135a2dc1f3fSmrg    thischanges="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/changes.html"
136a2dc1f3fSmrg    previndex="http:\/\/gcc.gnu.org\/gcc-`expr ${RELEASE_MAJOR} - 1`\/index.html"
137a2dc1f3fSmrg    sed -n -e "/^${thisindex}/,/^${thischanges}/p" NEWS |\
138a2dc1f3fSmrg	   sed -n -e "/Release History/,/References and Acknowledgments/p" |\
139a2dc1f3fSmrg	   grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\
140a2dc1f3fSmrg	   error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\
141a2dc1f3fSmrg		 "in gcc-${RELEASE_MAJOR}/index.html"
142a2dc1f3fSmrg
143a2dc1f3fSmrg    sed -n -e "/^${thischanges}/,/^${previndex}/p" NEWS |\
144a2dc1f3fSmrg	   grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\
145a2dc1f3fSmrg	   error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\
146a2dc1f3fSmrg		 "in gcc-${RELEASE_MAJOR}/changes.html"
147a2dc1f3fSmrg
148a2dc1f3fSmrg    rm -f NEWS
149a2dc1f3fSmrg
150a2dc1f3fSmrg    commit_files=""
1511debfc3dSmrg    for x in `changedir ${SOURCE_DIRECTORY} && \
1521debfc3dSmrg	      find . -name ChangeLog`; do
1531debfc3dSmrg      # Update this ChangeLog file only if it does not yet contain the
1541debfc3dSmrg      # entry we are going to add.  (This is a safety net for repeated
1551debfc3dSmrg      # runs of this script for the same release.)
1561debfc3dSmrg      if ! grep "GCC ${RELEASE} released." ${SOURCE_DIRECTORY}/${x} > /dev/null ; then
1571debfc3dSmrg	cat - ${SOURCE_DIRECTORY}/${x} > ${SOURCE_DIRECTORY}/${x}.new <<EOF
1581debfc3dSmrg${LONG_DATE}  Release Manager
1591debfc3dSmrg
1601debfc3dSmrg	* GCC ${RELEASE} released.
1611debfc3dSmrg
1621debfc3dSmrgEOF
1631debfc3dSmrg	mv ${SOURCE_DIRECTORY}/${x}.new ${SOURCE_DIRECTORY}/${x} \
1641debfc3dSmrg	  || error "Could not update ${x}"
165a2dc1f3fSmrg	commit_files="${commit_files} ${x}"
1661debfc3dSmrg      fi
1671debfc3dSmrg    done
1681debfc3dSmrg
1691debfc3dSmrg    # Update gcc/DEV-PHASE.
1701debfc3dSmrg
1711debfc3dSmrg    if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` != ${RELEASE} ]; then
1721debfc3dSmrg      [ ${RELEASE_MAJOR} -lt 5 ] && \
1731debfc3dSmrg	error "Release number ${RELEASE} does not match BASE-VER"
1741debfc3dSmrg      if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` \
1751debfc3dSmrg	   = ${RELEASE_MAJOR}.`expr ${RELEASE_MINOR} - 1`.1 \
1761debfc3dSmrg	   -a x${RELEASE_REVISION} = x0 ]; then
1771debfc3dSmrg	(changedir ${SOURCE_DIRECTORY}/gcc && \
1781debfc3dSmrg	 echo ${RELEASE} > BASE-VER) || \
1791debfc3dSmrg	error "Could not update BASE-VER"
180a2dc1f3fSmrg	commit_files="${commit_files} gcc/BASE-VER"
1811debfc3dSmrg      else
1821debfc3dSmrg	error "Release number ${RELEASE} does not immediately follow BASE-VER"
1831debfc3dSmrg      fi
1841debfc3dSmrg    fi
1851debfc3dSmrg    (changedir ${SOURCE_DIRECTORY}/gcc && \
1861debfc3dSmrg     : > DEV-PHASE) || \
1871debfc3dSmrg    error "Could not update DEV-PHASE"
188a2dc1f3fSmrg    commit_files="${commit_files} gcc/DEV-PHASE"
1891debfc3dSmrg
1901debfc3dSmrg    (changedir ${SOURCE_DIRECTORY} && \
191a2dc1f3fSmrg     ${GIT} commit -q -m 'Update ChangeLog and version files for release' ${commit_files} && \
192a2dc1f3fSmrg     ${GIT} push) || \
1931debfc3dSmrg    error "Could not commit ChangeLog and version file updates"
1941debfc3dSmrg
1951debfc3dSmrg    # Make sure we tag the sources for a final release.
196a2dc1f3fSmrg    TAG="releases/gcc-${RELEASE}"
1971debfc3dSmrg  fi
1981debfc3dSmrg
1991debfc3dSmrg  # Tag the sources.
2001debfc3dSmrg  if [ -n "${TAG}" ]; then
2011debfc3dSmrg    inform "Tagging sources as ${TAG}"
2021debfc3dSmrg    # We don't want to overwrite an existing tag.  So, if the tag
2031debfc3dSmrg    # already exists, issue an error message; the release manager can
2041debfc3dSmrg    # manually remove the tag if appropriate.
205a2dc1f3fSmrg    if (changedir ${SOURCE_DIRECTORY} && \
206a2dc1f3fSmrg	${GIT} rev-parse "refs/tags/${TAG}" > /dev/null 2>&1); then
2071debfc3dSmrg      error "Tag ${TAG} already exists"
2081debfc3dSmrg    fi
209a2dc1f3fSmrg    (changedir ${SOURCE_DIRECTORY} && \
210a2dc1f3fSmrg     ${GIT} tag -s -m "GCC ${RELEASE} release" "${TAG}" && \
211a2dc1f3fSmrg     ${GIT} push origin tag "${TAG}") || \
2121debfc3dSmrg      error "Could not tag sources"
213a2dc1f3fSmrg    GITBRANCH=${TAG}
2141debfc3dSmrg  fi
2151debfc3dSmrg
216a2dc1f3fSmrg  GITREV=`cd ${SOURCE_DIRECTORY} && ${GIT} rev-parse HEAD`
217a2dc1f3fSmrg  inform "Sources are commit ${GITREV}"
2181debfc3dSmrg
219a2dc1f3fSmrg  # Make sure there are no uncommitted changes in the sources.
220a2dc1f3fSmrg  status=${WORKING_DIRECTORY}/gitstatus.$$
221a2dc1f3fSmrg  (changedir ${SOURCE_DIRECTORY} && \
222a2dc1f3fSmrg   ${GIT} status --porcelain --ignored > "$status") || \
223a2dc1f3fSmrg    error "Could not get source directory status"
224a2dc1f3fSmrg  if [ -s "$status" ]; then
225a2dc1f3fSmrg    cat "$status"
226a2dc1f3fSmrg    error "Source directory has unexpected changes"
227a2dc1f3fSmrg  fi
228a2dc1f3fSmrg  rm "$status"
229a2dc1f3fSmrg
230a2dc1f3fSmrg  # Remove .git from the sources.
231a2dc1f3fSmrg  rm -rf "${SOURCE_DIRECTORY}/.git" || \
232a2dc1f3fSmrg    error "Could not remove .git from sources"
2331debfc3dSmrg
2341debfc3dSmrg  # Run gcc_update on them to set up the timestamps nicely, and (re)write
235a2dc1f3fSmrg  # the LAST_UPDATED file containing the git tag/revision used.
2361debfc3dSmrg  changedir "gcc-${RELEASE}"
2371debfc3dSmrg  contrib/gcc_update --touch
238a2dc1f3fSmrg  echo "Obtained from git: ${GITBRANCH} revision ${GITREV}" > LAST_UPDATED
2391debfc3dSmrg
2401debfc3dSmrg  # For a prerelease or real release, we need to generate additional
241a2dc1f3fSmrg  # files not present in git.
2421debfc3dSmrg  changedir "${SOURCE_DIRECTORY}"
2431debfc3dSmrg  if [ $SNAPSHOT -ne 1 ]; then
2441debfc3dSmrg    # Generate the documentation.
2451debfc3dSmrg    inform "Building install docs"
2461debfc3dSmrg    SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc
2471debfc3dSmrg    DESTDIR=${SOURCE_DIRECTORY}/INSTALL
2481debfc3dSmrg    export SOURCEDIR
2491debfc3dSmrg    export DESTDIR
2501debfc3dSmrg    ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html
2511debfc3dSmrg
2521debfc3dSmrg    # Regenerate the NEWS file.
2531debfc3dSmrg    contrib/gennews > NEWS || \
2541debfc3dSmrg      error "Could not regenerate NEWS files"
2551debfc3dSmrg
2561debfc3dSmrg    # Now, we must build the compiler in order to create any generated
2571debfc3dSmrg    # files that are supposed to go in the source directory.  This is
2581debfc3dSmrg    # also a good sanity check to make sure that the release builds
2591debfc3dSmrg    # on at least one platform.
2601debfc3dSmrg    inform "Building compiler"
2611debfc3dSmrg    OBJECT_DIRECTORY=../objdir
262a2dc1f3fSmrg    num_cpus=1
263a2dc1f3fSmrg    if type -p getconf 2>/dev/null; then
264a2dc1f3fSmrg      num_cpus=`getconf _NPROCESSORS_ONLN 2>/dev/null`
265a2dc1f3fSmrg      case "$num_cpus" in
266a2dc1f3fSmrg	'' | 0* | *[!0-9]*) num_cpus=1;;
267a2dc1f3fSmrg      esac
268a2dc1f3fSmrg    fi
2691debfc3dSmrg    contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
270a2dc1f3fSmrg      -c "--enable-generated-files-in-srcdir --disable-multilib" \
271a2dc1f3fSmrg      -m "-j$num_cpus" build || \
2721debfc3dSmrg      error "Could not rebuild GCC"
2731debfc3dSmrg  fi
2741debfc3dSmrg
2751debfc3dSmrg  # Move message catalogs to source directory.
2761debfc3dSmrg  mv ../objdir/gcc/po/*.gmo gcc/po/
2771debfc3dSmrg  [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/
2781debfc3dSmrg
2791debfc3dSmrg  # Create a "MD5SUMS" file to use for checking the validity of the release.
2801debfc3dSmrg  echo \
2811debfc3dSmrg"# This file contains the MD5 checksums of the files in the
2821debfc3dSmrg# gcc-"${RELEASE}".tar.xz tarball.
2831debfc3dSmrg#
2841debfc3dSmrg# Besides verifying that all files in the tarball were correctly expanded,
2851debfc3dSmrg# it also can be used to determine if any files have changed since the
2861debfc3dSmrg# tarball was expanded or to verify that a patchfile was correctly applied.
2871debfc3dSmrg#
2881debfc3dSmrg# Suggested usage:
2891debfc3dSmrg# md5sum -c MD5SUMS | grep -v \"OK$\"
2901debfc3dSmrg#" > MD5SUMS
2911debfc3dSmrg
2921debfc3dSmrg  find . -type f |
2931debfc3dSmrg  sed -e 's:^\./::' -e '/MD5SUMS/d' |
2941debfc3dSmrg  sort |
2951debfc3dSmrg  xargs md5sum >>MD5SUMS
2961debfc3dSmrg}
2971debfc3dSmrg
2981debfc3dSmrg# Build a single tarfile.  The first argument is the name of the tarfile
2991debfc3dSmrg# to build, without any suffixes.  They will be added automatically.  The
3001debfc3dSmrg# rest of the arguments are files or directories to include, and possibly
3011debfc3dSmrg# other arguments to tar.
3021debfc3dSmrg
3031debfc3dSmrgbuild_tarfile() {
3041debfc3dSmrg  # Get the name of the destination tar file.
3051debfc3dSmrg  TARFILE="$1.tar.xz"
3061debfc3dSmrg  shift
3071debfc3dSmrg
3081debfc3dSmrg  # Build the tar file itself.
3091debfc3dSmrg  (${TAR} cf - "$@" | ${XZ} > ${TARFILE}) || \
3101debfc3dSmrg    error "Could not build tarfile"
3111debfc3dSmrg  FILE_LIST="${FILE_LIST} ${TARFILE}"
3121debfc3dSmrg}
3131debfc3dSmrg
3141debfc3dSmrg# Build the various tar files for the release.
3151debfc3dSmrg
3161debfc3dSmrgbuild_tarfiles() {
3171debfc3dSmrg  inform "Building tarfiles"
3181debfc3dSmrg
3191debfc3dSmrg  changedir "${WORKING_DIRECTORY}"
3201debfc3dSmrg
3211debfc3dSmrg  # The GNU Coding Standards specify that all files should
3221debfc3dSmrg  # world readable.
3231debfc3dSmrg  chmod -R a+r ${SOURCE_DIRECTORY}
3241debfc3dSmrg  # And that all directories have mode 755.
3251debfc3dSmrg  find ${SOURCE_DIRECTORY} -type d -exec chmod 755 {} \;
3261debfc3dSmrg
3271debfc3dSmrg  # Build one huge tarfile for the entire distribution.
3281debfc3dSmrg  build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
3291debfc3dSmrg}
3301debfc3dSmrg
3311debfc3dSmrg# Build .gz files.
3321debfc3dSmrgbuild_gzip() {
3331debfc3dSmrg  for f in ${FILE_LIST}; do
3341debfc3dSmrg    target=${f%.xz}.gz
3351debfc3dSmrg    (${XZ} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
3361debfc3dSmrg  done
3371debfc3dSmrg}
3381debfc3dSmrg
3391debfc3dSmrg# Build diffs against an old release.
3401debfc3dSmrgbuild_diffs() {
3411debfc3dSmrg  old_dir=${1%/*}
3421debfc3dSmrg  old_file=${1##*/}
3431debfc3dSmrg  case "$old_file" in
3441debfc3dSmrg    *.tar.xz) old_vers=${old_file%.tar.xz};;
3451debfc3dSmrg    *) old_vers=${old_file%.tar.bz2};;
3461debfc3dSmrg  esac
3471debfc3dSmrg  old_vers=${old_vers#gcc-}
3481debfc3dSmrg  inform "Building diffs against version $old_vers"
3491debfc3dSmrg  for f in gcc; do
3501debfc3dSmrg    if [ -e ${old_dir}/${f}-${old_vers}.tar.xz ]; then
3511debfc3dSmrg      old_tar=${old_dir}/${f}-${old_vers}.tar.xz
3521debfc3dSmrg    else
3531debfc3dSmrg      old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
3541debfc3dSmrg    fi
3551debfc3dSmrg    new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.xz
3561debfc3dSmrg    if [ ! -e $old_tar ]; then
3571debfc3dSmrg      inform "$old_tar not found; not generating diff file"
3581debfc3dSmrg    elif [ ! -e $new_tar ]; then
3591debfc3dSmrg      inform "$new_tar not found; not generating diff file"
3601debfc3dSmrg    else
3611debfc3dSmrg      build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
3621debfc3dSmrg        ${f}-${old_vers}-${RELEASE}.diff.xz
3631debfc3dSmrg    fi
3641debfc3dSmrg  done
3651debfc3dSmrg}
3661debfc3dSmrg
3671debfc3dSmrg# Build an individual diff.
3681debfc3dSmrgbuild_diff() {
3691debfc3dSmrg  changedir "${WORKING_DIRECTORY}"
3701debfc3dSmrg  tmpdir=gccdiff.$$
3711debfc3dSmrg  mkdir $tmpdir || error "Could not create directory $tmpdir"
3721debfc3dSmrg  changedir $tmpdir
3731debfc3dSmrg  case "$1" in
3741debfc3dSmrg    *.tar.bz2)
3751debfc3dSmrg      (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
3761debfc3dSmrg      ;;
3771debfc3dSmrg    *.tar.xz)
3781debfc3dSmrg      (${XZ} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
3791debfc3dSmrg      ;;
3801debfc3dSmrg  esac
3811debfc3dSmrg  (${XZ} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs"
3821debfc3dSmrg  ${DIFF} $2 $4 > ../${5%.xz}
3831debfc3dSmrg  if [ $? -eq 2 ]; then
3841debfc3dSmrg    error "Trouble making diffs from $1 to $3"
3851debfc3dSmrg  fi
3861debfc3dSmrg  ${XZ} ../${5%.xz} || error "Could not generate ../$5"
3871debfc3dSmrg  changedir ..
3881debfc3dSmrg  rm -rf $tmpdir
3891debfc3dSmrg  FILE_LIST="${FILE_LIST} $5"
3901debfc3dSmrg}
3911debfc3dSmrg
3921debfc3dSmrg# Upload the files to the FTP server.
3931debfc3dSmrgupload_files() {
3941debfc3dSmrg  inform "Uploading files"
3951debfc3dSmrg
3961debfc3dSmrg  changedir "${WORKING_DIRECTORY}"
3971debfc3dSmrg
3981debfc3dSmrg  # Make sure the directory exists on the server.
3991debfc3dSmrg  if [ $LOCAL -eq 0 ]; then
4001debfc3dSmrg    ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
401*8feb0f0bSmrg      mkdir -m 755 -p "${FTP_PATH}/diffs"
4021debfc3dSmrg    UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
4031debfc3dSmrg  else
4041debfc3dSmrg    mkdir -p "${FTP_PATH}/diffs" \
4051debfc3dSmrg      || error "Could not create \`${FTP_PATH}'"
4061debfc3dSmrg    UPLOAD_PATH=${FTP_PATH}
4071debfc3dSmrg  fi
4081debfc3dSmrg
4091debfc3dSmrg  # Then copy files to their respective (sub)directories.
4101debfc3dSmrg  for x in gcc*.gz gcc*.xz; do
4111debfc3dSmrg    if [ -e ${x} ]; then
4121debfc3dSmrg      # Make sure the file will be readable on the server.
4131debfc3dSmrg      chmod a+r ${x}
4141debfc3dSmrg      # Copy it.
4151debfc3dSmrg      case ${x} in
4161debfc3dSmrg        *.diff.*)
4171debfc3dSmrg          SUBDIR="diffs/";
4181debfc3dSmrg          ;;
4191debfc3dSmrg        *)
4201debfc3dSmrg          SUBDIR="";
4211debfc3dSmrg      esac
4221debfc3dSmrg      ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
4231debfc3dSmrg        || error "Could not upload ${x}"
4241debfc3dSmrg    fi
4251debfc3dSmrg  done
4261debfc3dSmrg}
4271debfc3dSmrg
4281debfc3dSmrg# Print description if snapshot exists.
4291debfc3dSmrgsnapshot_print() {
4301debfc3dSmrg  if [ -e ${RELEASE}/$1 ]; then
4311debfc3dSmrg    hash=`openssl  sha256  ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
4321debfc3dSmrg    hash2=`openssl sha1 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
4331debfc3dSmrg
4341debfc3dSmrg    printf " %-37s%s\n\n  %s\n  %s\n\n" "$1" "$2" "$hash" "$hash2" \
4351debfc3dSmrg      >> ${SNAPSHOT_README}
4361debfc3dSmrg
4371debfc3dSmrg     echo "  <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX}
4381debfc3dSmrg     echo "      <td>$2</td></tr>" >> ${SNAPSHOT_INDEX}
4391debfc3dSmrg  fi
4401debfc3dSmrg}
4411debfc3dSmrg
4421debfc3dSmrg# Announce a snapshot, both on the web and via mail.
4431debfc3dSmrgannounce_snapshot() {
4441debfc3dSmrg  inform "Updating links and READMEs on the FTP server"
4451debfc3dSmrg
4461debfc3dSmrg  TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
4471debfc3dSmrg  SNAPSHOT_README=${RELEASE}/README
4481debfc3dSmrg  SNAPSHOT_INDEX=${RELEASE}/index.html
4491debfc3dSmrg
4501debfc3dSmrg  changedir "${SNAPSHOTS_DIR}"
4511debfc3dSmrg  echo \
4521debfc3dSmrg"Snapshot gcc-"${RELEASE}" is now available on
453a2dc1f3fSmrg  https://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
4541debfc3dSmrgand on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
4551debfc3dSmrg
456a2dc1f3fSmrgThis snapshot has been generated from the GCC "${BRANCH}" git branch
457a2dc1f3fSmrgwith the following options: "git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}"
4581debfc3dSmrg
4591debfc3dSmrgYou'll find:
4601debfc3dSmrg" > ${SNAPSHOT_README}
4611debfc3dSmrg
4621debfc3dSmrg  echo \
4631debfc3dSmrg"<html>
4641debfc3dSmrg
4651debfc3dSmrg<head>
4661debfc3dSmrg<title>GCC "${RELEASE}" Snapshot</title>
4671debfc3dSmrg</head>
4681debfc3dSmrg
4691debfc3dSmrg<body>
4701debfc3dSmrg<h1>GCC "${RELEASE}" Snapshot</h1>
4711debfc3dSmrg
4721debfc3dSmrg<p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
4731debfc3dSmrgperiodic snapshots of the GCC source tree available to the public
4741debfc3dSmrgfor testing purposes.</p>
4751debfc3dSmrg
4761debfc3dSmrg<p>If you are planning to download and use one of our snapshots, then
4771debfc3dSmrgwe highly recommend you join the GCC developers list.  Details for
4781debfc3dSmrghow to sign up can be found on the GCC project home page.</p>
4791debfc3dSmrg
480a2dc1f3fSmrg<p>This snapshot has been generated from the GCC "${BRANCH}" git branch
481a2dc1f3fSmrgwith the following options: <code>"git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}"</code></p>
4821debfc3dSmrg
4831debfc3dSmrg<table>" > ${SNAPSHOT_INDEX}
4841debfc3dSmrg
4851debfc3dSmrg  snapshot_print gcc-${RELEASE}.tar.xz "Complete GCC"
4861debfc3dSmrg
4871debfc3dSmrg  echo \
4881debfc3dSmrg"Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
4891debfc3dSmrg
4901debfc3dSmrgWhen a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
4911debfc3dSmrglink is updated and a message is sent to the gcc list.  Please do not use
4921debfc3dSmrga snapshot before it has been announced that way." >> ${SNAPSHOT_README}
4931debfc3dSmrg
4941debfc3dSmrg  echo \
4951debfc3dSmrg"</table>
4961debfc3dSmrg<p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
4971debfc3dSmrg<a href=\"diffs/\">diffs/ subdirectory</a>.</p>
4981debfc3dSmrg
4991debfc3dSmrg<p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
5001debfc3dSmrglink is updated and a message is sent to the gcc list.  Please do not use
5011debfc3dSmrga snapshot before it has been announced that way.</p>
5021debfc3dSmrg
5031debfc3dSmrg<hr />
5041debfc3dSmrg
5051debfc3dSmrg<address>
5061debfc3dSmrg<a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a>
5071debfc3dSmrg<br />
5081debfc3dSmrgLast modified "${TEXT_DATE}"
5091debfc3dSmrg</address>
5101debfc3dSmrg</body>
5111debfc3dSmrg
5121debfc3dSmrg</html>" >> ${SNAPSHOT_INDEX}
5131debfc3dSmrg
5141debfc3dSmrg  rm -f LATEST-${BRANCH}
5151debfc3dSmrg  ln -s ${RELEASE} LATEST-${BRANCH}
5161debfc3dSmrg
5171debfc3dSmrg  inform "Sending mail"
5181debfc3dSmrg
5191debfc3dSmrg  export QMAILHOST=gcc.gnu.org
5201debfc3dSmrg  mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
5211debfc3dSmrg}
5221debfc3dSmrg
5231debfc3dSmrg########################################################################
5241debfc3dSmrg# Initialization
5251debfc3dSmrg########################################################################
5261debfc3dSmrg
5271debfc3dSmrgLC_ALL=C
5281debfc3dSmrgexport LC_ALL
5291debfc3dSmrg
5301debfc3dSmrg# Today's date.
5311debfc3dSmrgDATE=`date "+%Y%m%d"`
5321debfc3dSmrgLONG_DATE=`date "+%Y-%m-%d"`
5331debfc3dSmrg
534a2dc1f3fSmrgGIT=${GIT:-git}
535a2dc1f3fSmrg# The server containing the GCC repository.
536a2dc1f3fSmrgGIT_SERVER="gcc.gnu.org"
5371debfc3dSmrg# The path to the repository on that server.
538a2dc1f3fSmrgGIT_REPOSITORY="/git/gcc.git"
5391debfc3dSmrg# The username to use when connecting to the server.
540a2dc1f3fSmrgGIT_USERNAME="${USER}"
5411debfc3dSmrg
5421debfc3dSmrg# The machine to which files will be uploaded.
5431debfc3dSmrgGCC_HOSTNAME="gcc.gnu.org"
5441debfc3dSmrg# The name of the account on the machine to which files are uploaded.
5451debfc3dSmrgGCC_USERNAME="gccadmin"
5461debfc3dSmrg# The directory in which the files will be placed (do not use ~user syntax).
5471debfc3dSmrgFTP_PATH=/var/ftp/pub/gcc
5481debfc3dSmrg# The directory in which snapshots will be placed.
5491debfc3dSmrgSNAPSHOTS_DIR=${FTP_PATH}/snapshots
5501debfc3dSmrg
5511debfc3dSmrg# The major number for the release.  For release `3.0.2' this would be
5521debfc3dSmrg# `3'
5531debfc3dSmrgRELEASE_MAJOR=""
5541debfc3dSmrg# The minor number for the release.  For release `3.0.2' this would be
5551debfc3dSmrg# `0'.
5561debfc3dSmrgRELEASE_MINOR=""
5571debfc3dSmrg# The revision number for the release.  For release `3.0.2' this would
5581debfc3dSmrg# be `2'.
5591debfc3dSmrgRELEASE_REVISION=""
5601debfc3dSmrg# The complete name of the release.
5611debfc3dSmrgRELEASE=""
5621debfc3dSmrg
5631debfc3dSmrg# The name of the branch from which the release should be made, in a
5641debfc3dSmrg# user-friendly form.
5651debfc3dSmrgBRANCH=""
5661debfc3dSmrg
5671debfc3dSmrg# The name of the branch from which the release should be made, as used
5681debfc3dSmrg# for our version control system.
569a2dc1f3fSmrgGITBRANCH=""
5701debfc3dSmrg
5711debfc3dSmrg# The tag to apply to the sources used for the release.
5721debfc3dSmrgTAG=""
5731debfc3dSmrg
5741debfc3dSmrg# The old tarballs from which to generate diffs.
5751debfc3dSmrgOLD_TARS=""
5761debfc3dSmrg
577c0a68be4Smrg# Local gcc git checkout to speed up git cloning.
578c0a68be4SmrgGIT_REFERENCE=""
579c0a68be4Smrg
5801debfc3dSmrg# The directory that will be used to construct the release.  The
5811debfc3dSmrg# release itself will be placed in a subdirectory of this directory.
5821debfc3dSmrgDESTINATION=${HOME}
5831debfc3dSmrg# The subdirectory.
5841debfc3dSmrgWORKING_DIRECTORY=""
5851debfc3dSmrg# The directory that will contain the GCC sources.
5861debfc3dSmrgSOURCE_DIRECTORY=""
5871debfc3dSmrg
5881debfc3dSmrg# Non-zero if this is the final release, rather than a prerelease.
5891debfc3dSmrgFINAL=0
5901debfc3dSmrg
5911debfc3dSmrg# Non-zero if we are building a snapshot, and don't build gcc or
5921debfc3dSmrg# include generated files.
5931debfc3dSmrgSNAPSHOT=0
5941debfc3dSmrg
5951debfc3dSmrg# Non-zero if we are running locally on gcc.gnu.org, and use local CVS
5961debfc3dSmrg# and copy directly to the FTP directory.
5971debfc3dSmrgLOCAL=0
5981debfc3dSmrg
5991debfc3dSmrg# Major operation modes.
6001debfc3dSmrgMODE_GZIP=0
6011debfc3dSmrgMODE_DIFFS=0
6021debfc3dSmrgMODE_SOURCES=0
6031debfc3dSmrgMODE_TARFILES=0
6041debfc3dSmrgMODE_UPLOAD=0
6051debfc3dSmrg
6061debfc3dSmrg# List of archive files generated; used to create .gz files from .xz.
6071debfc3dSmrgFILE_LIST=""
6081debfc3dSmrg
6091debfc3dSmrg# Programs we use.
6101debfc3dSmrg
6111debfc3dSmrgBZIP2="${BZIP2:-bzip2}"
6121debfc3dSmrgXZ="${XZ:-xz --best}"
6131debfc3dSmrgCVS="${CVS:-cvs -f -Q -z9}"
6141debfc3dSmrgDIFF="${DIFF:-diff -Nrcpad}"
6151debfc3dSmrgENV="${ENV:-env}"
6161debfc3dSmrgGZIP="${GZIP:-gzip --best}"
6171debfc3dSmrgSCP="${SCP:-scp -p}"
6181debfc3dSmrgSSH="${SSH:-ssh}"
6191debfc3dSmrgTAR="${TAR:-tar}"
6201debfc3dSmrg
6211debfc3dSmrg########################################################################
6221debfc3dSmrg# Command Line Processing
6231debfc3dSmrg########################################################################
6241debfc3dSmrg
6251debfc3dSmrg# Parse the options.
626c0a68be4Smrgwhile getopts "d:fr:u:t:p:s:lb:" ARG; do
6271debfc3dSmrg    case $ARG in
6281debfc3dSmrg    d)    DESTINATION="${OPTARG}";;
6291debfc3dSmrg    r)    RELEASE="${OPTARG}";;
6301debfc3dSmrg    t)    TAG="${OPTARG}";;
631a2dc1f3fSmrg    u)    GIT_USERNAME="${OPTARG}";;
6321debfc3dSmrg    f)    FINAL=1;;
6331debfc3dSmrg    s)    SNAPSHOT=1
6341debfc3dSmrg          BRANCH=${OPTARG%:*}
635a2dc1f3fSmrg          GITBRANCH=${OPTARG#*:}
6361debfc3dSmrg          ;;
6371debfc3dSmrg    l)    LOCAL=1
6381debfc3dSmrg	  SCP=cp
6391debfc3dSmrg	  PATH=~:/usr/local/bin:$PATH;;
6401debfc3dSmrg    p)    OLD_TARS="${OLD_TARS} ${OPTARG}"
6411debfc3dSmrg          if [ ! -f ${OPTARG} ]; then
6421debfc3dSmrg	    error "-p argument must name a tarball"
6431debfc3dSmrg	  fi;;
644c0a68be4Smrg    b)    GIT_REFERENCE="${OPTARG}";;
6451debfc3dSmrg    \?)   usage;;
6461debfc3dSmrg    esac
6471debfc3dSmrgdone
6481debfc3dSmrgshift `expr ${OPTIND} - 1`
6491debfc3dSmrg
6501debfc3dSmrg# Handle the major modes.
6511debfc3dSmrgwhile [ $# -ne 0 ]; do
6521debfc3dSmrg    case $1 in
6531debfc3dSmrg    diffs)    MODE_DIFFS=1;;
6541debfc3dSmrg    gzip)     MODE_GZIP=1;;
6551debfc3dSmrg    sources)  MODE_SOURCES=1;;
6561debfc3dSmrg    tarfiles) MODE_TARFILES=1;;
6571debfc3dSmrg    upload)   MODE_UPLOAD=1;;
6581debfc3dSmrg    all)      MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1;
6591debfc3dSmrg              if [ $SNAPSHOT -ne 1 ]; then
6601debfc3dSmrg                # Only for releases and pre-releases.
6611debfc3dSmrg                MODE_GZIP=1;
6621debfc3dSmrg              fi
6631debfc3dSmrg              ;;
6641debfc3dSmrg    *)        error "Unknown mode $1";;
6651debfc3dSmrg    esac
6661debfc3dSmrg    shift
6671debfc3dSmrgdone
6681debfc3dSmrg
6691debfc3dSmrg# Perform consistency checking.
670a2dc1f3fSmrgif [ ${LOCAL} -eq 0 ] && [ -z ${GIT_USERNAME} ]; then
6711debfc3dSmrg  error "No username specified"
6721debfc3dSmrgfi
6731debfc3dSmrg
6741debfc3dSmrgif [ ! -d ${DESTINATION} ]; then
6751debfc3dSmrg  error "\`${DESTINATION}' is not a directory"
6761debfc3dSmrgfi
6771debfc3dSmrg
6781debfc3dSmrgif [ $SNAPSHOT -eq 0 ]; then
6791debfc3dSmrg  if [ -z ${RELEASE} ]; then
6801debfc3dSmrg    error "No release number specified"
6811debfc3dSmrg  fi
6821debfc3dSmrg
6831debfc3dSmrg  # Compute the major and minor release numbers.
6841debfc3dSmrg  RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'`
6851debfc3dSmrg  RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'`
6861debfc3dSmrg  RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'`
6871debfc3dSmrg
6881debfc3dSmrg  if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
6891debfc3dSmrg    error "Release number \`${RELEASE}' is invalid"
6901debfc3dSmrg  fi
6911debfc3dSmrg
6921debfc3dSmrg  # Compute the full name of the release.
6931debfc3dSmrg  if [ -z "${RELEASE_REVISION}" ]; then
6941debfc3dSmrg    RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}"
6951debfc3dSmrg  else
6961debfc3dSmrg    RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}"
6971debfc3dSmrg  fi
6981debfc3dSmrg
6991debfc3dSmrg  # Compute the name of the branch, which is based solely on the major
700a2dc1f3fSmrg  # release number.
701a2dc1f3fSmrg  GITBRANCH="releases/gcc-${RELEASE_MAJOR}"
7021debfc3dSmrg
7031debfc3dSmrg  # If this is not a final release, set various parameters accordingly.
7041debfc3dSmrg  if [ ${FINAL} -ne 1 ]; then
7051debfc3dSmrg    RELEASE="${RELEASE}-RC-${DATE}"
7061debfc3dSmrg    FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}"
7071debfc3dSmrg  else
7081debfc3dSmrg    FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
7091debfc3dSmrg  fi
7101debfc3dSmrgelse
7111debfc3dSmrg  RELEASE=${BRANCH}-${DATE}
7121debfc3dSmrg  FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"
7131debfc3dSmrg
7141debfc3dSmrg  # If diffs are requested when building locally on gcc.gnu.org, we (usually)
7151debfc3dSmrg  # know what the last snapshot date was and take the corresponding tarballs,
7161debfc3dSmrg  # unless the user specified tarballs explicitly.
7171debfc3dSmrg  if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then
7181debfc3dSmrg    LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
7191debfc3dSmrg    OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
7201debfc3dSmrg    if [ ! -e $OLD_TARS ]; then
7211debfc3dSmrg      OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.xz
7221debfc3dSmrg    fi
7231debfc3dSmrg  fi
7241debfc3dSmrgfi
7251debfc3dSmrg
7261debfc3dSmrg# Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
7271debfc3dSmrgWORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
7281debfc3dSmrgSOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"
7291debfc3dSmrg
730a2dc1f3fSmrg# Set up GITROOT.
7311debfc3dSmrgif [ $LOCAL -eq 0 ]; then
732a2dc1f3fSmrg    GITROOT="git+ssh://${GIT_USERNAME}@${GIT_SERVER}${GIT_REPOSITORY}"
7331debfc3dSmrgelse
734a2dc1f3fSmrg    GITROOT="/git/gcc.git"
7351debfc3dSmrgfi
736a2dc1f3fSmrgexport GITROOT
7371debfc3dSmrg
7381debfc3dSmrg########################################################################
7391debfc3dSmrg# Main Program
7401debfc3dSmrg########################################################################
7411debfc3dSmrg
7421debfc3dSmrg# Set the timezone to UTC
7431debfc3dSmrgTZ="UTC0"
7441debfc3dSmrgexport TZ
7451debfc3dSmrg
7461debfc3dSmrg# Build the source directory.
7471debfc3dSmrg
7481debfc3dSmrgif [ $MODE_SOURCES -ne 0 ]; then
7491debfc3dSmrg  build_sources
7501debfc3dSmrgfi
7511debfc3dSmrg
7521debfc3dSmrg# Build the tar files.
7531debfc3dSmrg
7541debfc3dSmrgif [ $MODE_TARFILES -ne 0 ]; then
7551debfc3dSmrg  build_tarfiles
7561debfc3dSmrgfi
7571debfc3dSmrg
7581debfc3dSmrg# Build diffs
7591debfc3dSmrg
7601debfc3dSmrgif [ $MODE_DIFFS -ne 0 ]; then
7611debfc3dSmrg  # Possibly build diffs.
7621debfc3dSmrg  if [ -n "$OLD_TARS" ]; then
7631debfc3dSmrg    for old_tar in $OLD_TARS; do
7641debfc3dSmrg      build_diffs $old_tar
7651debfc3dSmrg    done
7661debfc3dSmrg  fi
7671debfc3dSmrgfi
7681debfc3dSmrg
7691debfc3dSmrg# Build gzip files
7701debfc3dSmrgif [ $MODE_GZIP -ne 0 ]; then
7711debfc3dSmrg  build_gzip
7721debfc3dSmrgfi
7731debfc3dSmrg
7741debfc3dSmrg# Upload them to the FTP server.
7751debfc3dSmrgif [ $MODE_UPLOAD -ne 0 ]; then
7761debfc3dSmrg  upload_files
7771debfc3dSmrg
7781debfc3dSmrg  # For snapshots, make some further updates.
7791debfc3dSmrg  if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
7801debfc3dSmrg    announce_snapshot
7811debfc3dSmrg
7821debfc3dSmrg    # Update snapshot date file.
7831debfc3dSmrg    changedir ~
7841debfc3dSmrg    echo $DATE > .snapshot_date-${BRANCH}
7851debfc3dSmrg
7861debfc3dSmrg    # Remove working directory
7871debfc3dSmrg    rm -rf ${WORKING_DIRECTORY}
7881debfc3dSmrg  fi
7891debfc3dSmrgfi
790