xref: /netbsd-src/external/gpl3/gcc/dist/maintainer-scripts/gcc_release (revision fb8a8121f28072308659629b86cfb7c449bd93e1)
14fee23f9Smrg#! /bin/sh
24fee23f9Smrg
34fee23f9Smrg########################################################################
44fee23f9Smrg#
54fee23f9Smrg# File:   gcc_release
64fee23f9Smrg# Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell
74fee23f9Smrg# Date:   2001-05-25
84fee23f9Smrg#
94fee23f9Smrg# Contents:
104fee23f9Smrg#   Script to create a GCC release.
114fee23f9Smrg#
12181254a7Smrg# Copyright (c) 2001-2020 Free Software Foundation.
134fee23f9Smrg#
144fee23f9Smrg# This file is part of GCC.
154fee23f9Smrg#
164fee23f9Smrg# GCC is free software; you can redistribute it and/or modify
174fee23f9Smrg# it under the terms of the GNU General Public License as published by
184fee23f9Smrg# the Free Software Foundation; either version 3, or (at your option)
194fee23f9Smrg# any later version.
204fee23f9Smrg#
214fee23f9Smrg# GCC is distributed in the hope that it will be useful,
224fee23f9Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of
234fee23f9Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
244fee23f9Smrg# GNU General Public License for more details.
254fee23f9Smrg#
264fee23f9Smrg# You should have received a copy of the GNU General Public License
274fee23f9Smrg# along with GCC; see the file COPYING3.  If not see
284fee23f9Smrg# <http://www.gnu.org/licenses/>.
294fee23f9Smrg#
304fee23f9Smrg########################################################################
314fee23f9Smrg
324fee23f9Smrg########################################################################
334fee23f9Smrg# Notes
344fee23f9Smrg########################################################################
354fee23f9Smrg
364fee23f9Smrg# Here is an example usage of this script, to create a GCC 3.0.2
374fee23f9Smrg# prerelease:
384fee23f9Smrg#
394fee23f9Smrg#   gcc_release -r 3.0.2
404fee23f9Smrg#
414fee23f9Smrg# This script will automatically use the head of the release branch
424fee23f9Smrg# to generate the release.
434fee23f9Smrg
444fee23f9Smrg########################################################################
454fee23f9Smrg# Functions
464fee23f9Smrg########################################################################
474fee23f9Smrg
48a3e9eb18Smrg# Issue the error message given by $@ and exit with a non-zero
494fee23f9Smrg# exit code.
504fee23f9Smrg
514fee23f9Smrgerror() {
52a3e9eb18Smrg    echo "gcc_release: error: $@"
534fee23f9Smrg    exit 1
544fee23f9Smrg}
554fee23f9Smrg
56a3e9eb18Smrg# Issue the informational message given by $@.
574fee23f9Smrg
584fee23f9Smrginform() {
59a3e9eb18Smrg    echo "gcc_release: $@"
604fee23f9Smrg}
614fee23f9Smrg
624fee23f9Smrg# Issue a usage message explaining how to use this script.
634fee23f9Smrg
644fee23f9Smrgusage() {
654fee23f9Smrgcat <<EOF
664fee23f9Smrggcc_release -r release [-f] [further options]
67a3e9eb18Smrggcc_release -s name:gitbranch [further options]
684fee23f9Smrg
694fee23f9SmrgOptions:
704fee23f9Smrg
714fee23f9Smrg  -r release           Version of the form X.Y or X.Y.Z.
72a3e9eb18Smrg  -s name:gitbranch    Create a snapshot, not a real release.
734fee23f9Smrg
744fee23f9Smrg  -d destination       Local working directory where we will build the release
754fee23f9Smrg                       (default=${HOME}).
764fee23f9Smrg  -f                   Create a final release (and update ChangeLogs,...).
774fee23f9Smrg  -l                   Indicate that we are running on gcc.gnu.org.
784fee23f9Smrg  -p previous-tarball  Location of a previous tarball (to generate diff files).
79a3e9eb18Smrg  -t tag               Tag to mark the release in git.
804fee23f9Smrg  -u username          Username for upload operations.
81181254a7Smrg  -b local-git-repo    Local git repository to speed up cloning.
824fee23f9SmrgEOF
834fee23f9Smrg    exit 1
844fee23f9Smrg}
854fee23f9Smrg
864fee23f9Smrg# Change to the directory given by $1.
874fee23f9Smrg
884fee23f9Smrgchangedir() {
894fee23f9Smrg  cd $1 || \
904fee23f9Smrg    error "Could not change directory to $1"
914fee23f9Smrg}
924fee23f9Smrg
934fee23f9Smrg# Build the source tree that will be the basis for the release
944fee23f9Smrg# in ${WORKING_DIRECTORY}/gcc-${RELEASE}.
954fee23f9Smrg
964fee23f9Smrgbuild_sources() {
974fee23f9Smrg  # If the WORKING_DIRECTORY already exists, do not risk destroying it.
984fee23f9Smrg  if [ -r ${WORKING_DIRECTORY} ]; then
994fee23f9Smrg    error "\`${WORKING_DIRECTORY}' already exists"
1004fee23f9Smrg  fi
1014fee23f9Smrg  # Create the WORKING_DIRECTORY.
1024fee23f9Smrg  mkdir "${WORKING_DIRECTORY}" \
1034fee23f9Smrg    || error "Could not create \`${WORKING_DIRECTORY}'"
1044fee23f9Smrg  changedir "${WORKING_DIRECTORY}"
1054fee23f9Smrg
106a3e9eb18Smrg  # Check out the sources.
107181254a7Smrg  if [ -n "${GIT_REFERENCE}" ]; then
108181254a7Smrg    ${GIT} clone -q --dissociate --reference "${GIT_REFERENCE}" \
109181254a7Smrg		 -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \
110181254a7Smrg        error "Could not check out release sources"
111181254a7Smrg  else
112a3e9eb18Smrg    ${GIT} clone -q -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \
113a3e9eb18Smrg        error "Could not check out release sources"
114181254a7Smrg  fi
115a3e9eb18Smrg
1164fee23f9Smrg  # If this is a final release, make sure that the ChangeLogs
1174fee23f9Smrg  # and version strings are updated.
1184fee23f9Smrg  if [ ${FINAL} -ne 0 ]; then
1194fee23f9Smrg    inform "Updating ChangeLogs and version files"
1204fee23f9Smrg
121a3e9eb18Smrg    grep -q "gcc-${RELEASE_MAJOR}/index.html gcc-${RELEASE_MAJOR}/changes.html" \
122a3e9eb18Smrg	 ${SOURCE_DIRECTORY}/contrib/gennews ||\
123a3e9eb18Smrg	   error "New release not listed in contrib/gennews"
124a3e9eb18Smrg
125a3e9eb18Smrg    ${SOURCE_DIRECTORY}/contrib/gennews > NEWS ||\
126a3e9eb18Smrg	   error "Could not regenerate NEWS files"
127a3e9eb18Smrg
128a3e9eb18Smrg    grep -q "no releases of GCC ${RELEASE_MAJOR} have yet been made" NEWS &&\
129a3e9eb18Smrg	   error "gcc-${RELEASE_MAJOR}/index.html has not been updated yet"
130a3e9eb18Smrg
131a3e9eb18Smrg    grep -q "GCC ${RELEASE_MAJOR} has not been released yet" NEWS &&\
132a3e9eb18Smrg	   error "gcc-${RELEASE_MAJOR}/changes.html has not been updated yet"
133a3e9eb18Smrg
134a3e9eb18Smrg    thisindex="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/index.html"
135a3e9eb18Smrg    thischanges="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/changes.html"
136a3e9eb18Smrg    previndex="http:\/\/gcc.gnu.org\/gcc-`expr ${RELEASE_MAJOR} - 1`\/index.html"
137a3e9eb18Smrg    sed -n -e "/^${thisindex}/,/^${thischanges}/p" NEWS |\
138a3e9eb18Smrg	   sed -n -e "/Release History/,/References and Acknowledgments/p" |\
139a3e9eb18Smrg	   grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\
140a3e9eb18Smrg	   error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\
141a3e9eb18Smrg		 "in gcc-${RELEASE_MAJOR}/index.html"
142a3e9eb18Smrg
143a3e9eb18Smrg    sed -n -e "/^${thischanges}/,/^${previndex}/p" NEWS |\
144a3e9eb18Smrg	   grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\
145a3e9eb18Smrg	   error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\
146a3e9eb18Smrg		 "in gcc-${RELEASE_MAJOR}/changes.html"
147a3e9eb18Smrg
148a3e9eb18Smrg    rm -f NEWS
149a3e9eb18Smrg
150a3e9eb18Smrg    commit_files=""
151f9a78e0eSmrg    for x in `changedir ${SOURCE_DIRECTORY} && \
152f9a78e0eSmrg	      find . -name ChangeLog`; do
1534fee23f9Smrg      # Update this ChangeLog file only if it does not yet contain the
1544fee23f9Smrg      # entry we are going to add.  (This is a safety net for repeated
1554fee23f9Smrg      # runs of this script for the same release.)
156f9a78e0eSmrg      if ! grep "GCC ${RELEASE} released." ${SOURCE_DIRECTORY}/${x} > /dev/null ; then
157f9a78e0eSmrg	cat - ${SOURCE_DIRECTORY}/${x} > ${SOURCE_DIRECTORY}/${x}.new <<EOF
1584fee23f9Smrg${LONG_DATE}  Release Manager
1594fee23f9Smrg
1604fee23f9Smrg	* GCC ${RELEASE} released.
1614fee23f9Smrg
1624fee23f9SmrgEOF
163f9a78e0eSmrg	mv ${SOURCE_DIRECTORY}/${x}.new ${SOURCE_DIRECTORY}/${x} \
164f9a78e0eSmrg	  || error "Could not update ${x}"
165a3e9eb18Smrg	commit_files="${commit_files} ${x}"
1664fee23f9Smrg      fi
1674fee23f9Smrg    done
1684fee23f9Smrg
1694fee23f9Smrg    # Update gcc/DEV-PHASE.
1704fee23f9Smrg
171f9a78e0eSmrg    if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` != ${RELEASE} ]; then
172f9a78e0eSmrg      [ ${RELEASE_MAJOR} -lt 5 ] && \
1734fee23f9Smrg	error "Release number ${RELEASE} does not match BASE-VER"
174f9a78e0eSmrg      if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` \
175f9a78e0eSmrg	   = ${RELEASE_MAJOR}.`expr ${RELEASE_MINOR} - 1`.1 \
176f9a78e0eSmrg	   -a x${RELEASE_REVISION} = x0 ]; then
1774fee23f9Smrg	(changedir ${SOURCE_DIRECTORY}/gcc && \
178f9a78e0eSmrg	 echo ${RELEASE} > BASE-VER) || \
179f9a78e0eSmrg	error "Could not update BASE-VER"
180a3e9eb18Smrg	commit_files="${commit_files} gcc/BASE-VER"
181f9a78e0eSmrg      else
182f9a78e0eSmrg	error "Release number ${RELEASE} does not immediately follow BASE-VER"
183f9a78e0eSmrg      fi
184f9a78e0eSmrg    fi
185f9a78e0eSmrg    (changedir ${SOURCE_DIRECTORY}/gcc && \
186f9a78e0eSmrg     : > DEV-PHASE) || \
1874fee23f9Smrg    error "Could not update DEV-PHASE"
188a3e9eb18Smrg    commit_files="${commit_files} gcc/DEV-PHASE"
189f9a78e0eSmrg
190f9a78e0eSmrg    (changedir ${SOURCE_DIRECTORY} && \
191a3e9eb18Smrg     ${GIT} commit -q -m 'Update ChangeLog and version files for release' ${commit_files} && \
192a3e9eb18Smrg     ${GIT} push) || \
193f9a78e0eSmrg    error "Could not commit ChangeLog and version file updates"
1944fee23f9Smrg
1954fee23f9Smrg    # Make sure we tag the sources for a final release.
196a3e9eb18Smrg    TAG="releases/gcc-${RELEASE}"
1974fee23f9Smrg  fi
1984fee23f9Smrg
1994fee23f9Smrg  # Tag the sources.
2004fee23f9Smrg  if [ -n "${TAG}" ]; then
2014fee23f9Smrg    inform "Tagging sources as ${TAG}"
2024fee23f9Smrg    # We don't want to overwrite an existing tag.  So, if the tag
2034fee23f9Smrg    # already exists, issue an error message; the release manager can
2044fee23f9Smrg    # manually remove the tag if appropriate.
205a3e9eb18Smrg    if (changedir ${SOURCE_DIRECTORY} && \
206a3e9eb18Smrg	${GIT} rev-parse "refs/tags/${TAG}" > /dev/null 2>&1); then
2074fee23f9Smrg      error "Tag ${TAG} already exists"
2084fee23f9Smrg    fi
209a3e9eb18Smrg    (changedir ${SOURCE_DIRECTORY} && \
210a3e9eb18Smrg     ${GIT} tag -s -m "GCC ${RELEASE} release" "${TAG}" && \
211a3e9eb18Smrg     ${GIT} push origin tag "${TAG}") || \
2124fee23f9Smrg      error "Could not tag sources"
213a3e9eb18Smrg    GITBRANCH=${TAG}
2144fee23f9Smrg  fi
2154fee23f9Smrg
216a3e9eb18Smrg  GITREV=`cd ${SOURCE_DIRECTORY} && ${GIT} rev-parse HEAD`
217a3e9eb18Smrg  inform "Sources are commit ${GITREV}"
2184fee23f9Smrg
219a3e9eb18Smrg  # Make sure there are no uncommitted changes in the sources.
220a3e9eb18Smrg  status=${WORKING_DIRECTORY}/gitstatus.$$
221a3e9eb18Smrg  (changedir ${SOURCE_DIRECTORY} && \
222a3e9eb18Smrg   ${GIT} status --porcelain --ignored > "$status") || \
223a3e9eb18Smrg    error "Could not get source directory status"
224a3e9eb18Smrg  if [ -s "$status" ]; then
225a3e9eb18Smrg    cat "$status"
226a3e9eb18Smrg    error "Source directory has unexpected changes"
227a3e9eb18Smrg  fi
228a3e9eb18Smrg  rm "$status"
229a3e9eb18Smrg
230a3e9eb18Smrg  # Remove .git from the sources.
231a3e9eb18Smrg  rm -rf "${SOURCE_DIRECTORY}/.git" || \
232a3e9eb18Smrg    error "Could not remove .git from sources"
2334fee23f9Smrg
2344fee23f9Smrg  # Run gcc_update on them to set up the timestamps nicely, and (re)write
235a3e9eb18Smrg  # the LAST_UPDATED file containing the git tag/revision used.
2364fee23f9Smrg  changedir "gcc-${RELEASE}"
2374fee23f9Smrg  contrib/gcc_update --touch
238a3e9eb18Smrg  echo "Obtained from git: ${GITBRANCH} revision ${GITREV}" > LAST_UPDATED
2394fee23f9Smrg
2404fee23f9Smrg  # For a prerelease or real release, we need to generate additional
241a3e9eb18Smrg  # files not present in git.
2424fee23f9Smrg  changedir "${SOURCE_DIRECTORY}"
2434fee23f9Smrg  if [ $SNAPSHOT -ne 1 ]; then
2444fee23f9Smrg    # Generate the documentation.
2454fee23f9Smrg    inform "Building install docs"
2464fee23f9Smrg    SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc
2474fee23f9Smrg    DESTDIR=${SOURCE_DIRECTORY}/INSTALL
2484fee23f9Smrg    export SOURCEDIR
2494fee23f9Smrg    export DESTDIR
2504fee23f9Smrg    ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html
2514fee23f9Smrg
2524fee23f9Smrg    # Regenerate the NEWS file.
2534fee23f9Smrg    contrib/gennews > NEWS || \
2544fee23f9Smrg      error "Could not regenerate NEWS files"
2554fee23f9Smrg
2564fee23f9Smrg    # Now, we must build the compiler in order to create any generated
2574fee23f9Smrg    # files that are supposed to go in the source directory.  This is
2584fee23f9Smrg    # also a good sanity check to make sure that the release builds
2594fee23f9Smrg    # on at least one platform.
2604fee23f9Smrg    inform "Building compiler"
2614fee23f9Smrg    OBJECT_DIRECTORY=../objdir
262a3e9eb18Smrg    num_cpus=1
263a3e9eb18Smrg    if type -p getconf 2>/dev/null; then
264a3e9eb18Smrg      num_cpus=`getconf _NPROCESSORS_ONLN 2>/dev/null`
265a3e9eb18Smrg      case "$num_cpus" in
266a3e9eb18Smrg	'' | 0* | *[!0-9]*) num_cpus=1;;
267a3e9eb18Smrg      esac
268a3e9eb18Smrg    fi
2694fee23f9Smrg    contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
270a3e9eb18Smrg      -c "--enable-generated-files-in-srcdir --disable-multilib" \
271a3e9eb18Smrg      -m "-j$num_cpus" build || \
2724fee23f9Smrg      error "Could not rebuild GCC"
2734fee23f9Smrg  fi
2744fee23f9Smrg
2754fee23f9Smrg  # Move message catalogs to source directory.
2764fee23f9Smrg  mv ../objdir/gcc/po/*.gmo gcc/po/
2774fee23f9Smrg  [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/
2784fee23f9Smrg
2794fee23f9Smrg  # Create a "MD5SUMS" file to use for checking the validity of the release.
2804fee23f9Smrg  echo \
2814fee23f9Smrg"# This file contains the MD5 checksums of the files in the
282b17d1066Smrg# gcc-"${RELEASE}".tar.xz tarball.
2834fee23f9Smrg#
2844fee23f9Smrg# Besides verifying that all files in the tarball were correctly expanded,
2854fee23f9Smrg# it also can be used to determine if any files have changed since the
2864fee23f9Smrg# tarball was expanded or to verify that a patchfile was correctly applied.
2874fee23f9Smrg#
2884fee23f9Smrg# Suggested usage:
2894fee23f9Smrg# md5sum -c MD5SUMS | grep -v \"OK$\"
2903002e98eSmrg#" > MD5SUMS
2914fee23f9Smrg
2924fee23f9Smrg  find . -type f |
2934fee23f9Smrg  sed -e 's:^\./::' -e '/MD5SUMS/d' |
2944fee23f9Smrg  sort |
2954fee23f9Smrg  xargs md5sum >>MD5SUMS
2964fee23f9Smrg}
2974fee23f9Smrg
2984fee23f9Smrg# Build a single tarfile.  The first argument is the name of the tarfile
2994fee23f9Smrg# to build, without any suffixes.  They will be added automatically.  The
3004fee23f9Smrg# rest of the arguments are files or directories to include, and possibly
3014fee23f9Smrg# other arguments to tar.
3024fee23f9Smrg
3034fee23f9Smrgbuild_tarfile() {
3044fee23f9Smrg  # Get the name of the destination tar file.
305b17d1066Smrg  TARFILE="$1.tar.xz"
3064fee23f9Smrg  shift
3074fee23f9Smrg
3084fee23f9Smrg  # Build the tar file itself.
309b17d1066Smrg  (${TAR} cf - "$@" | ${XZ} > ${TARFILE}) || \
3104fee23f9Smrg    error "Could not build tarfile"
3114fee23f9Smrg  FILE_LIST="${FILE_LIST} ${TARFILE}"
3124fee23f9Smrg}
3134fee23f9Smrg
3144fee23f9Smrg# Build the various tar files for the release.
3154fee23f9Smrg
3164fee23f9Smrgbuild_tarfiles() {
3174fee23f9Smrg  inform "Building tarfiles"
3184fee23f9Smrg
3194fee23f9Smrg  changedir "${WORKING_DIRECTORY}"
3204fee23f9Smrg
3214fee23f9Smrg  # The GNU Coding Standards specify that all files should
3224fee23f9Smrg  # world readable.
3234fee23f9Smrg  chmod -R a+r ${SOURCE_DIRECTORY}
3244fee23f9Smrg  # And that all directories have mode 755.
3254fee23f9Smrg  find ${SOURCE_DIRECTORY} -type d -exec chmod 755 {} \;
3264fee23f9Smrg
3274fee23f9Smrg  # Build one huge tarfile for the entire distribution.
3284fee23f9Smrg  build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
3294fee23f9Smrg}
3304fee23f9Smrg
3314fee23f9Smrg# Build .gz files.
3324fee23f9Smrgbuild_gzip() {
3334fee23f9Smrg  for f in ${FILE_LIST}; do
334b17d1066Smrg    target=${f%.xz}.gz
335b17d1066Smrg    (${XZ} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
3364fee23f9Smrg  done
3374fee23f9Smrg}
3384fee23f9Smrg
3394fee23f9Smrg# Build diffs against an old release.
3404fee23f9Smrgbuild_diffs() {
3414fee23f9Smrg  old_dir=${1%/*}
3424fee23f9Smrg  old_file=${1##*/}
343b17d1066Smrg  case "$old_file" in
344b17d1066Smrg    *.tar.xz) old_vers=${old_file%.tar.xz};;
345b17d1066Smrg    *) old_vers=${old_file%.tar.bz2};;
346b17d1066Smrg  esac
3474fee23f9Smrg  old_vers=${old_vers#gcc-}
3484fee23f9Smrg  inform "Building diffs against version $old_vers"
34948fb7bfaSmrg  for f in gcc; do
350b17d1066Smrg    if [ -e ${old_dir}/${f}-${old_vers}.tar.xz ]; then
351b17d1066Smrg      old_tar=${old_dir}/${f}-${old_vers}.tar.xz
352b17d1066Smrg    else
3534fee23f9Smrg      old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
354b17d1066Smrg    fi
355b17d1066Smrg    new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.xz
3564fee23f9Smrg    if [ ! -e $old_tar ]; then
3574fee23f9Smrg      inform "$old_tar not found; not generating diff file"
3584fee23f9Smrg    elif [ ! -e $new_tar ]; then
3594fee23f9Smrg      inform "$new_tar not found; not generating diff file"
3604fee23f9Smrg    else
3614fee23f9Smrg      build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
362b17d1066Smrg        ${f}-${old_vers}-${RELEASE}.diff.xz
3634fee23f9Smrg    fi
3644fee23f9Smrg  done
3654fee23f9Smrg}
3664fee23f9Smrg
3674fee23f9Smrg# Build an individual diff.
3684fee23f9Smrgbuild_diff() {
3694fee23f9Smrg  changedir "${WORKING_DIRECTORY}"
3704fee23f9Smrg  tmpdir=gccdiff.$$
3714fee23f9Smrg  mkdir $tmpdir || error "Could not create directory $tmpdir"
3724fee23f9Smrg  changedir $tmpdir
373b17d1066Smrg  case "$1" in
374b17d1066Smrg    *.tar.bz2)
3754fee23f9Smrg      (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
376b17d1066Smrg      ;;
377b17d1066Smrg    *.tar.xz)
378b17d1066Smrg      (${XZ} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
379b17d1066Smrg      ;;
380b17d1066Smrg  esac
381b17d1066Smrg  (${XZ} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs"
382b17d1066Smrg  ${DIFF} $2 $4 > ../${5%.xz}
3834fee23f9Smrg  if [ $? -eq 2 ]; then
3844fee23f9Smrg    error "Trouble making diffs from $1 to $3"
3854fee23f9Smrg  fi
386b17d1066Smrg  ${XZ} ../${5%.xz} || error "Could not generate ../$5"
3874fee23f9Smrg  changedir ..
3884fee23f9Smrg  rm -rf $tmpdir
3894fee23f9Smrg  FILE_LIST="${FILE_LIST} $5"
3904fee23f9Smrg}
3914fee23f9Smrg
3924fee23f9Smrg# Upload the files to the FTP server.
3934fee23f9Smrgupload_files() {
3944fee23f9Smrg  inform "Uploading files"
3954fee23f9Smrg
3964fee23f9Smrg  changedir "${WORKING_DIRECTORY}"
3974fee23f9Smrg
3984fee23f9Smrg  # Make sure the directory exists on the server.
3994fee23f9Smrg  if [ $LOCAL -eq 0 ]; then
4004fee23f9Smrg    ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
401*fb8a8121Smrg      mkdir -m 755 -p "${FTP_PATH}/diffs"
4024fee23f9Smrg    UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
4034fee23f9Smrg  else
4044fee23f9Smrg    mkdir -p "${FTP_PATH}/diffs" \
4054fee23f9Smrg      || error "Could not create \`${FTP_PATH}'"
4064fee23f9Smrg    UPLOAD_PATH=${FTP_PATH}
4074fee23f9Smrg  fi
4084fee23f9Smrg
4094fee23f9Smrg  # Then copy files to their respective (sub)directories.
410b17d1066Smrg  for x in gcc*.gz gcc*.xz; do
4114fee23f9Smrg    if [ -e ${x} ]; then
4124fee23f9Smrg      # Make sure the file will be readable on the server.
4134fee23f9Smrg      chmod a+r ${x}
4144fee23f9Smrg      # Copy it.
4154fee23f9Smrg      case ${x} in
4164fee23f9Smrg        *.diff.*)
4174fee23f9Smrg          SUBDIR="diffs/";
4184fee23f9Smrg          ;;
4194fee23f9Smrg        *)
4204fee23f9Smrg          SUBDIR="";
4214fee23f9Smrg      esac
4224fee23f9Smrg      ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
4234fee23f9Smrg        || error "Could not upload ${x}"
4244fee23f9Smrg    fi
4254fee23f9Smrg  done
4264fee23f9Smrg}
4274fee23f9Smrg
4284fee23f9Smrg# Print description if snapshot exists.
4294fee23f9Smrgsnapshot_print() {
4304fee23f9Smrg  if [ -e ${RELEASE}/$1 ]; then
431b17d1066Smrg    hash=`openssl  sha256  ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
43248fb7bfaSmrg    hash2=`openssl sha1 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
43348fb7bfaSmrg
43448fb7bfaSmrg    printf " %-37s%s\n\n  %s\n  %s\n\n" "$1" "$2" "$hash" "$hash2" \
43548fb7bfaSmrg      >> ${SNAPSHOT_README}
43648fb7bfaSmrg
4374fee23f9Smrg     echo "  <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX}
4384fee23f9Smrg     echo "      <td>$2</td></tr>" >> ${SNAPSHOT_INDEX}
4394fee23f9Smrg  fi
4404fee23f9Smrg}
4414fee23f9Smrg
4424fee23f9Smrg# Announce a snapshot, both on the web and via mail.
4434fee23f9Smrgannounce_snapshot() {
4444fee23f9Smrg  inform "Updating links and READMEs on the FTP server"
4454fee23f9Smrg
4464fee23f9Smrg  TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
4474fee23f9Smrg  SNAPSHOT_README=${RELEASE}/README
4484fee23f9Smrg  SNAPSHOT_INDEX=${RELEASE}/index.html
4494fee23f9Smrg
4504fee23f9Smrg  changedir "${SNAPSHOTS_DIR}"
4514fee23f9Smrg  echo \
4524fee23f9Smrg"Snapshot gcc-"${RELEASE}" is now available on
453a3e9eb18Smrg  https://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
4544fee23f9Smrgand on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
4554fee23f9Smrg
456a3e9eb18SmrgThis snapshot has been generated from the GCC "${BRANCH}" git branch
457a3e9eb18Smrgwith the following options: "git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}"
4584fee23f9Smrg
4594fee23f9SmrgYou'll find:
4604fee23f9Smrg" > ${SNAPSHOT_README}
4614fee23f9Smrg
4624fee23f9Smrg  echo \
4634fee23f9Smrg"<html>
4644fee23f9Smrg
4654fee23f9Smrg<head>
4664fee23f9Smrg<title>GCC "${RELEASE}" Snapshot</title>
4674fee23f9Smrg</head>
4684fee23f9Smrg
4694fee23f9Smrg<body>
4704fee23f9Smrg<h1>GCC "${RELEASE}" Snapshot</h1>
4714fee23f9Smrg
4724fee23f9Smrg<p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
4734fee23f9Smrgperiodic snapshots of the GCC source tree available to the public
4744fee23f9Smrgfor testing purposes.</p>
4754fee23f9Smrg
4764fee23f9Smrg<p>If you are planning to download and use one of our snapshots, then
4774fee23f9Smrgwe highly recommend you join the GCC developers list.  Details for
4784fee23f9Smrghow to sign up can be found on the GCC project home page.</p>
4794fee23f9Smrg
480a3e9eb18Smrg<p>This snapshot has been generated from the GCC "${BRANCH}" git branch
481a3e9eb18Smrgwith the following options: <code>"git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}"</code></p>
4824fee23f9Smrg
4834fee23f9Smrg<table>" > ${SNAPSHOT_INDEX}
4844fee23f9Smrg
485b17d1066Smrg  snapshot_print gcc-${RELEASE}.tar.xz "Complete GCC"
4864fee23f9Smrg
4874fee23f9Smrg  echo \
4884fee23f9Smrg"Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
4894fee23f9Smrg
4904fee23f9SmrgWhen a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
4914fee23f9Smrglink is updated and a message is sent to the gcc list.  Please do not use
4924fee23f9Smrga snapshot before it has been announced that way." >> ${SNAPSHOT_README}
4934fee23f9Smrg
4944fee23f9Smrg  echo \
4954fee23f9Smrg"</table>
4964fee23f9Smrg<p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
4974fee23f9Smrg<a href=\"diffs/\">diffs/ subdirectory</a>.</p>
4984fee23f9Smrg
4994fee23f9Smrg<p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
5004fee23f9Smrglink is updated and a message is sent to the gcc list.  Please do not use
5014fee23f9Smrga snapshot before it has been announced that way.</p>
5024fee23f9Smrg
5034fee23f9Smrg<hr />
5044fee23f9Smrg
5054fee23f9Smrg<address>
5064fee23f9Smrg<a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a>
5074fee23f9Smrg<br />
5084fee23f9SmrgLast modified "${TEXT_DATE}"
5094fee23f9Smrg</address>
5104fee23f9Smrg</body>
5114fee23f9Smrg
5124fee23f9Smrg</html>" >> ${SNAPSHOT_INDEX}
5134fee23f9Smrg
5144fee23f9Smrg  rm -f LATEST-${BRANCH}
5154fee23f9Smrg  ln -s ${RELEASE} LATEST-${BRANCH}
5164fee23f9Smrg
5174fee23f9Smrg  inform "Sending mail"
5184fee23f9Smrg
5194fee23f9Smrg  export QMAILHOST=gcc.gnu.org
5204fee23f9Smrg  mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
5214fee23f9Smrg}
5224fee23f9Smrg
5234fee23f9Smrg########################################################################
5244fee23f9Smrg# Initialization
5254fee23f9Smrg########################################################################
5264fee23f9Smrg
5274fee23f9SmrgLC_ALL=C
5284fee23f9Smrgexport LC_ALL
5294fee23f9Smrg
5304fee23f9Smrg# Today's date.
5314fee23f9SmrgDATE=`date "+%Y%m%d"`
5324fee23f9SmrgLONG_DATE=`date "+%Y-%m-%d"`
5334fee23f9Smrg
534a3e9eb18SmrgGIT=${GIT:-git}
535a3e9eb18Smrg# The server containing the GCC repository.
536a3e9eb18SmrgGIT_SERVER="gcc.gnu.org"
5374fee23f9Smrg# The path to the repository on that server.
538a3e9eb18SmrgGIT_REPOSITORY="/git/gcc.git"
5394fee23f9Smrg# The username to use when connecting to the server.
540a3e9eb18SmrgGIT_USERNAME="${USER}"
5414fee23f9Smrg
5424fee23f9Smrg# The machine to which files will be uploaded.
5434fee23f9SmrgGCC_HOSTNAME="gcc.gnu.org"
5444fee23f9Smrg# The name of the account on the machine to which files are uploaded.
5454fee23f9SmrgGCC_USERNAME="gccadmin"
5464fee23f9Smrg# The directory in which the files will be placed (do not use ~user syntax).
5474fee23f9SmrgFTP_PATH=/var/ftp/pub/gcc
5484fee23f9Smrg# The directory in which snapshots will be placed.
5494fee23f9SmrgSNAPSHOTS_DIR=${FTP_PATH}/snapshots
5504fee23f9Smrg
5514fee23f9Smrg# The major number for the release.  For release `3.0.2' this would be
5524fee23f9Smrg# `3'
5534fee23f9SmrgRELEASE_MAJOR=""
5544fee23f9Smrg# The minor number for the release.  For release `3.0.2' this would be
5554fee23f9Smrg# `0'.
5564fee23f9SmrgRELEASE_MINOR=""
5574fee23f9Smrg# The revision number for the release.  For release `3.0.2' this would
5584fee23f9Smrg# be `2'.
5594fee23f9SmrgRELEASE_REVISION=""
5604fee23f9Smrg# The complete name of the release.
5614fee23f9SmrgRELEASE=""
5624fee23f9Smrg
5634fee23f9Smrg# The name of the branch from which the release should be made, in a
5644fee23f9Smrg# user-friendly form.
5654fee23f9SmrgBRANCH=""
5664fee23f9Smrg
5674fee23f9Smrg# The name of the branch from which the release should be made, as used
5684fee23f9Smrg# for our version control system.
569a3e9eb18SmrgGITBRANCH=""
5704fee23f9Smrg
5714fee23f9Smrg# The tag to apply to the sources used for the release.
5724fee23f9SmrgTAG=""
5734fee23f9Smrg
5744fee23f9Smrg# The old tarballs from which to generate diffs.
5754fee23f9SmrgOLD_TARS=""
5764fee23f9Smrg
577181254a7Smrg# Local gcc git checkout to speed up git cloning.
578181254a7SmrgGIT_REFERENCE=""
579181254a7Smrg
5804fee23f9Smrg# The directory that will be used to construct the release.  The
5814fee23f9Smrg# release itself will be placed in a subdirectory of this directory.
5824fee23f9SmrgDESTINATION=${HOME}
5834fee23f9Smrg# The subdirectory.
5844fee23f9SmrgWORKING_DIRECTORY=""
5854fee23f9Smrg# The directory that will contain the GCC sources.
5864fee23f9SmrgSOURCE_DIRECTORY=""
5874fee23f9Smrg
5884fee23f9Smrg# Non-zero if this is the final release, rather than a prerelease.
5894fee23f9SmrgFINAL=0
5904fee23f9Smrg
5914fee23f9Smrg# Non-zero if we are building a snapshot, and don't build gcc or
5924fee23f9Smrg# include generated files.
5934fee23f9SmrgSNAPSHOT=0
5944fee23f9Smrg
5954fee23f9Smrg# Non-zero if we are running locally on gcc.gnu.org, and use local CVS
5964fee23f9Smrg# and copy directly to the FTP directory.
5974fee23f9SmrgLOCAL=0
5984fee23f9Smrg
5994fee23f9Smrg# Major operation modes.
6004fee23f9SmrgMODE_GZIP=0
6014fee23f9SmrgMODE_DIFFS=0
6024fee23f9SmrgMODE_SOURCES=0
6034fee23f9SmrgMODE_TARFILES=0
6044fee23f9SmrgMODE_UPLOAD=0
6054fee23f9Smrg
606b17d1066Smrg# List of archive files generated; used to create .gz files from .xz.
6074fee23f9SmrgFILE_LIST=""
6084fee23f9Smrg
6094fee23f9Smrg# Programs we use.
6104fee23f9Smrg
6114fee23f9SmrgBZIP2="${BZIP2:-bzip2}"
612b17d1066SmrgXZ="${XZ:-xz --best}"
6134fee23f9SmrgCVS="${CVS:-cvs -f -Q -z9}"
6144fee23f9SmrgDIFF="${DIFF:-diff -Nrcpad}"
6154fee23f9SmrgENV="${ENV:-env}"
6164fee23f9SmrgGZIP="${GZIP:-gzip --best}"
6174fee23f9SmrgSCP="${SCP:-scp -p}"
6184fee23f9SmrgSSH="${SSH:-ssh}"
6194fee23f9SmrgTAR="${TAR:-tar}"
6204fee23f9Smrg
6214fee23f9Smrg########################################################################
6224fee23f9Smrg# Command Line Processing
6234fee23f9Smrg########################################################################
6244fee23f9Smrg
6254fee23f9Smrg# Parse the options.
626181254a7Smrgwhile getopts "d:fr:u:t:p:s:lb:" ARG; do
6274fee23f9Smrg    case $ARG in
6284fee23f9Smrg    d)    DESTINATION="${OPTARG}";;
6294fee23f9Smrg    r)    RELEASE="${OPTARG}";;
6304fee23f9Smrg    t)    TAG="${OPTARG}";;
631a3e9eb18Smrg    u)    GIT_USERNAME="${OPTARG}";;
6324fee23f9Smrg    f)    FINAL=1;;
6334fee23f9Smrg    s)    SNAPSHOT=1
6344fee23f9Smrg          BRANCH=${OPTARG%:*}
635a3e9eb18Smrg          GITBRANCH=${OPTARG#*:}
6364fee23f9Smrg          ;;
6374fee23f9Smrg    l)    LOCAL=1
6384fee23f9Smrg	  SCP=cp
6394fee23f9Smrg	  PATH=~:/usr/local/bin:$PATH;;
6404fee23f9Smrg    p)    OLD_TARS="${OLD_TARS} ${OPTARG}"
6414fee23f9Smrg          if [ ! -f ${OPTARG} ]; then
6424fee23f9Smrg	    error "-p argument must name a tarball"
6434fee23f9Smrg	  fi;;
644181254a7Smrg    b)    GIT_REFERENCE="${OPTARG}";;
6454fee23f9Smrg    \?)   usage;;
6464fee23f9Smrg    esac
6474fee23f9Smrgdone
6484fee23f9Smrgshift `expr ${OPTIND} - 1`
6494fee23f9Smrg
6504fee23f9Smrg# Handle the major modes.
6514fee23f9Smrgwhile [ $# -ne 0 ]; do
6524fee23f9Smrg    case $1 in
6534fee23f9Smrg    diffs)    MODE_DIFFS=1;;
6544fee23f9Smrg    gzip)     MODE_GZIP=1;;
6554fee23f9Smrg    sources)  MODE_SOURCES=1;;
6564fee23f9Smrg    tarfiles) MODE_TARFILES=1;;
6574fee23f9Smrg    upload)   MODE_UPLOAD=1;;
6584fee23f9Smrg    all)      MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1;
6594fee23f9Smrg              if [ $SNAPSHOT -ne 1 ]; then
6604fee23f9Smrg                # Only for releases and pre-releases.
6614fee23f9Smrg                MODE_GZIP=1;
6624fee23f9Smrg              fi
6634fee23f9Smrg              ;;
6644fee23f9Smrg    *)        error "Unknown mode $1";;
6654fee23f9Smrg    esac
6664fee23f9Smrg    shift
6674fee23f9Smrgdone
6684fee23f9Smrg
6694fee23f9Smrg# Perform consistency checking.
670a3e9eb18Smrgif [ ${LOCAL} -eq 0 ] && [ -z ${GIT_USERNAME} ]; then
6714fee23f9Smrg  error "No username specified"
6724fee23f9Smrgfi
6734fee23f9Smrg
6744fee23f9Smrgif [ ! -d ${DESTINATION} ]; then
6754fee23f9Smrg  error "\`${DESTINATION}' is not a directory"
6764fee23f9Smrgfi
6774fee23f9Smrg
6784fee23f9Smrgif [ $SNAPSHOT -eq 0 ]; then
6794fee23f9Smrg  if [ -z ${RELEASE} ]; then
6804fee23f9Smrg    error "No release number specified"
6814fee23f9Smrg  fi
6824fee23f9Smrg
6834fee23f9Smrg  # Compute the major and minor release numbers.
6844fee23f9Smrg  RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'`
6854fee23f9Smrg  RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'`
6864fee23f9Smrg  RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'`
6874fee23f9Smrg
6884fee23f9Smrg  if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
6894fee23f9Smrg    error "Release number \`${RELEASE}' is invalid"
6904fee23f9Smrg  fi
6914fee23f9Smrg
6924fee23f9Smrg  # Compute the full name of the release.
6934fee23f9Smrg  if [ -z "${RELEASE_REVISION}" ]; then
6944fee23f9Smrg    RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}"
6954fee23f9Smrg  else
6964fee23f9Smrg    RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}"
6974fee23f9Smrg  fi
6984fee23f9Smrg
6994fee23f9Smrg  # Compute the name of the branch, which is based solely on the major
700a3e9eb18Smrg  # release number.
701a3e9eb18Smrg  GITBRANCH="releases/gcc-${RELEASE_MAJOR}"
7024fee23f9Smrg
7034fee23f9Smrg  # If this is not a final release, set various parameters accordingly.
7044fee23f9Smrg  if [ ${FINAL} -ne 1 ]; then
7054fee23f9Smrg    RELEASE="${RELEASE}-RC-${DATE}"
7064fee23f9Smrg    FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}"
7074fee23f9Smrg  else
7084fee23f9Smrg    FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
7094fee23f9Smrg  fi
7104fee23f9Smrgelse
7114fee23f9Smrg  RELEASE=${BRANCH}-${DATE}
7124fee23f9Smrg  FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"
7134fee23f9Smrg
7144fee23f9Smrg  # If diffs are requested when building locally on gcc.gnu.org, we (usually)
7154fee23f9Smrg  # know what the last snapshot date was and take the corresponding tarballs,
7164fee23f9Smrg  # unless the user specified tarballs explicitly.
7174fee23f9Smrg  if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then
7184fee23f9Smrg    LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
7194fee23f9Smrg    OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
720b17d1066Smrg    if [ ! -e $OLD_TARS ]; then
721b17d1066Smrg      OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.xz
722b17d1066Smrg    fi
7234fee23f9Smrg  fi
7244fee23f9Smrgfi
7254fee23f9Smrg
7264fee23f9Smrg# Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
7274fee23f9SmrgWORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
7284fee23f9SmrgSOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"
7294fee23f9Smrg
730a3e9eb18Smrg# Set up GITROOT.
7314fee23f9Smrgif [ $LOCAL -eq 0 ]; then
732a3e9eb18Smrg    GITROOT="git+ssh://${GIT_USERNAME}@${GIT_SERVER}${GIT_REPOSITORY}"
7334fee23f9Smrgelse
734a3e9eb18Smrg    GITROOT="/git/gcc.git"
7354fee23f9Smrgfi
736a3e9eb18Smrgexport GITROOT
7374fee23f9Smrg
7384fee23f9Smrg########################################################################
7394fee23f9Smrg# Main Program
7404fee23f9Smrg########################################################################
7414fee23f9Smrg
7424fee23f9Smrg# Set the timezone to UTC
7434fee23f9SmrgTZ="UTC0"
7444fee23f9Smrgexport TZ
7454fee23f9Smrg
7464fee23f9Smrg# Build the source directory.
7474fee23f9Smrg
7484fee23f9Smrgif [ $MODE_SOURCES -ne 0 ]; then
7494fee23f9Smrg  build_sources
7504fee23f9Smrgfi
7514fee23f9Smrg
7524fee23f9Smrg# Build the tar files.
7534fee23f9Smrg
7544fee23f9Smrgif [ $MODE_TARFILES -ne 0 ]; then
7554fee23f9Smrg  build_tarfiles
7564fee23f9Smrgfi
7574fee23f9Smrg
7584fee23f9Smrg# Build diffs
7594fee23f9Smrg
7604fee23f9Smrgif [ $MODE_DIFFS -ne 0 ]; then
7614fee23f9Smrg  # Possibly build diffs.
7624fee23f9Smrg  if [ -n "$OLD_TARS" ]; then
7634fee23f9Smrg    for old_tar in $OLD_TARS; do
7644fee23f9Smrg      build_diffs $old_tar
7654fee23f9Smrg    done
7664fee23f9Smrg  fi
7674fee23f9Smrgfi
7684fee23f9Smrg
7694fee23f9Smrg# Build gzip files
7704fee23f9Smrgif [ $MODE_GZIP -ne 0 ]; then
7714fee23f9Smrg  build_gzip
7724fee23f9Smrgfi
7734fee23f9Smrg
7744fee23f9Smrg# Upload them to the FTP server.
7754fee23f9Smrgif [ $MODE_UPLOAD -ne 0 ]; then
7764fee23f9Smrg  upload_files
7774fee23f9Smrg
7784fee23f9Smrg  # For snapshots, make some further updates.
7794fee23f9Smrg  if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
7804fee23f9Smrg    announce_snapshot
7814fee23f9Smrg
7824fee23f9Smrg    # Update snapshot date file.
7834fee23f9Smrg    changedir ~
7844fee23f9Smrg    echo $DATE > .snapshot_date-${BRANCH}
7854fee23f9Smrg
7864fee23f9Smrg    # Remove working directory
7874fee23f9Smrg    rm -rf ${WORKING_DIRECTORY}
7884fee23f9Smrg  fi
7894fee23f9Smrgfi
790