xref: /netbsd-src/external/gpl3/gcc/dist/maintainer-scripts/gcc_release (revision 76c7fc5f6b13ed0b1508e6b313e88e59977ed78e)
1#! /bin/sh
2
3########################################################################
4#
5# File:   gcc_release
6# Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell
7# Date:   2001-05-25
8#
9# Contents:
10#   Script to create a GCC release.
11#
12# Copyright (c) 2001-2015 Free Software Foundation.
13#
14# This file is part of GCC.
15#
16# GCC is free software; you can redistribute it and/or modify
17# it under the terms of the GNU General Public License as published by
18# the Free Software Foundation; either version 3, or (at your option)
19# any later version.
20#
21# GCC is distributed in the hope that it will be useful,
22# but WITHOUT ANY WARRANTY; without even the implied warranty of
23# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24# GNU General Public License for more details.
25#
26# You should have received a copy of the GNU General Public License
27# along with GCC; see the file COPYING3.  If not see
28# <http://www.gnu.org/licenses/>.
29#
30########################################################################
31
32########################################################################
33# Notes
34########################################################################
35
36# Here is an example usage of this script, to create a GCC 3.0.2
37# prerelease:
38#
39#   gcc_release -r 3.0.2
40#
41# This script will automatically use the head of the release branch
42# to generate the release.
43
44########################################################################
45# Functions
46########################################################################
47
48# Issue the error message given by $1 and exit with a non-zero
49# exit code.
50
51error() {
52    echo "gcc_release: error: $1"
53    exit 1
54}
55
56# Issue the informational message given by $1.
57
58inform() {
59    echo "gcc_release: $1"
60}
61
62# Issue a usage message explaining how to use this script.
63
64usage() {
65cat <<EOF
66gcc_release -r release [-f] [further options]
67gcc_release -s name:svnbranch [further options]
68
69Options:
70
71  -r release           Version of the form X.Y or X.Y.Z.
72  -s name:svnbranch    Create a snapshot, not a real release.
73
74  -d destination       Local working directory where we will build the release
75                       (default=${HOME}).
76  -f                   Create a final release (and update ChangeLogs,...).
77  -l                   Indicate that we are running on gcc.gnu.org.
78  -p previous-tarball  Location of a previous tarball (to generate diff files).
79  -t tag               Tag to mark the release in SVN.
80  -u username          Username for upload operations.
81EOF
82    exit 1
83}
84
85# Change to the directory given by $1.
86
87changedir() {
88  cd $1 || \
89    error "Could not change directory to $1"
90}
91
92# Build the source tree that will be the basis for the release
93# in ${WORKING_DIRECTORY}/gcc-${RELEASE}.
94
95build_sources() {
96  # If the WORKING_DIRECTORY already exists, do not risk destroying it.
97  if [ -r ${WORKING_DIRECTORY} ]; then
98    error "\`${WORKING_DIRECTORY}' already exists"
99  fi
100  # Create the WORKING_DIRECTORY.
101  mkdir "${WORKING_DIRECTORY}" \
102    || error "Could not create \`${WORKING_DIRECTORY}'"
103  changedir "${WORKING_DIRECTORY}"
104
105  # If this is a final release, make sure that the ChangeLogs
106  # and version strings are updated.
107  if [ ${FINAL} -ne 0 ]; then
108    inform "Updating ChangeLogs and version files"
109
110    ${SVN} -q co "${SVNROOT}/${SVNBRANCH}" "`basename ${SOURCE_DIRECTORY}`" ||\
111           error "Could not check out release sources"
112    svnciargs=""
113    for x in `changedir ${SOURCE_DIRECTORY} && \
114	      find . -name ChangeLog`; do
115      # Update this ChangeLog file only if it does not yet contain the
116      # entry we are going to add.  (This is a safety net for repeated
117      # runs of this script for the same release.)
118      if ! grep "GCC ${RELEASE} released." ${SOURCE_DIRECTORY}/${x} > /dev/null ; then
119	cat - ${SOURCE_DIRECTORY}/${x} > ${SOURCE_DIRECTORY}/${x}.new <<EOF
120${LONG_DATE}  Release Manager
121
122	* GCC ${RELEASE} released.
123
124EOF
125	mv ${SOURCE_DIRECTORY}/${x}.new ${SOURCE_DIRECTORY}/${x} \
126	  || error "Could not update ${x}"
127	svnciargs="${svnciargs} ${x}"
128      fi
129    done
130
131    # Update gcc/DEV-PHASE.
132
133    if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` != ${RELEASE} ]; then
134      [ ${RELEASE_MAJOR} -lt 5 ] && \
135	error "Release number ${RELEASE} does not match BASE-VER"
136      if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` \
137	   = ${RELEASE_MAJOR}.`expr ${RELEASE_MINOR} - 1`.1 \
138	   -a x${RELEASE_REVISION} = x0 ]; then
139	(changedir ${SOURCE_DIRECTORY}/gcc && \
140	 echo ${RELEASE} > BASE-VER) || \
141	error "Could not update BASE-VER"
142	svnciargs="${svnciargs} gcc/BASE-VER"
143      else
144	error "Release number ${RELEASE} does not immediately follow BASE-VER"
145      fi
146    fi
147    (changedir ${SOURCE_DIRECTORY}/gcc && \
148     : > DEV-PHASE) || \
149    error "Could not update DEV-PHASE"
150    svnciargs="${svnciargs} gcc/DEV-PHASE"
151
152    (changedir ${SOURCE_DIRECTORY} && \
153     ${SVN} -q ci -m 'Update ChangeLog and version files for release' ${svnciargs}) || \
154    error "Could not commit ChangeLog and version file updates"
155
156    # Make sure we tag the sources for a final release.
157    TAG="tags/gcc_`echo ${RELEASE} | tr . _`_release"
158
159    rm -rf ${SOURCE_DIRECTORY}
160  fi
161
162  # Tag the sources.
163  if [ -n "${TAG}" ]; then
164    inform "Tagging sources as ${TAG}"
165    # We don't want to overwrite an existing tag.  So, if the tag
166    # already exists, issue an error message; the release manager can
167    # manually remove the tag if appropriate.
168    echo "${SVN} ls ${SVNROOT}/${TAG}/ChangeLog"
169    if ${SVN} ls "${SVNROOT}/${TAG}/ChangeLog"; then
170      error "Tag ${TAG} already exists"
171    fi
172    ${SVN} -m "Tagging source as ${TAG}" cp "${SVNROOT}/${SVNBRANCH}" "${SVNROOT}/${TAG}" || \
173      error "Could not tag sources"
174    SVNBRANCH=${TAG}
175  fi
176  SVNREV=`${SVN} info "${SVNROOT}/${SVNBRANCH}"|awk '/Revision:/ {print $2}'`
177
178  # Export the current sources.
179  inform "Retrieving sources (svn export -r ${SVNREV} ${SVNROOT}/${SVNBRANCH})"
180
181  ${SVN} -q export -r${SVNREV} "${SVNROOT}/${SVNBRANCH}" "`basename ${SOURCE_DIRECTORY}`" ||\
182    error "Could not retrieve sources"
183
184  # Run gcc_update on them to set up the timestamps nicely, and (re)write
185  # the LAST_UPDATED file containing the SVN tag/revision used.
186  changedir "gcc-${RELEASE}"
187  contrib/gcc_update --touch
188  echo "Obtained from SVN: ${SVNBRANCH} revision ${SVNREV}" > LAST_UPDATED
189
190  # For a prerelease or real release, we need to generate additional
191  # files not present in SVN.
192  changedir "${SOURCE_DIRECTORY}"
193  if [ $SNAPSHOT -ne 1 ]; then
194    # Generate the documentation.
195    inform "Building install docs"
196    SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc
197    DESTDIR=${SOURCE_DIRECTORY}/INSTALL
198    export SOURCEDIR
199    export DESTDIR
200    ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html
201
202    # Regenerate the NEWS file.
203    contrib/gennews > NEWS || \
204      error "Could not regenerate NEWS files"
205
206    # Now, we must build the compiler in order to create any generated
207    # files that are supposed to go in the source directory.  This is
208    # also a good sanity check to make sure that the release builds
209    # on at least one platform.
210    inform "Building compiler"
211    OBJECT_DIRECTORY=../objdir
212    num_cpus=1
213    if type -p getconf 2>/dev/null; then
214      num_cpus=`getconf _NPROCESSORS_ONLN 2>/dev/null`
215      case "$num_cpus" in
216	'' | 0* | *[!0-9]*) num_cpus=1;;
217      esac
218    fi
219    contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
220      -c "--enable-generated-files-in-srcdir --disable-multilib" \
221      -m "-j$num_cpus" build || \
222      error "Could not rebuild GCC"
223  fi
224
225  # Move message catalogs to source directory.
226  mv ../objdir/gcc/po/*.gmo gcc/po/
227  [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/
228
229  # Create a "MD5SUMS" file to use for checking the validity of the release.
230  echo \
231"# This file contains the MD5 checksums of the files in the
232# gcc-"${RELEASE}".tar.xz tarball.
233#
234# Besides verifying that all files in the tarball were correctly expanded,
235# it also can be used to determine if any files have changed since the
236# tarball was expanded or to verify that a patchfile was correctly applied.
237#
238# Suggested usage:
239# md5sum -c MD5SUMS | grep -v \"OK$\"
240#" > MD5SUMS
241
242  find . -type f |
243  sed -e 's:^\./::' -e '/MD5SUMS/d' |
244  sort |
245  xargs md5sum >>MD5SUMS
246}
247
248# Build a single tarfile.  The first argument is the name of the tarfile
249# to build, without any suffixes.  They will be added automatically.  The
250# rest of the arguments are files or directories to include, and possibly
251# other arguments to tar.
252
253build_tarfile() {
254  # Get the name of the destination tar file.
255  TARFILE="$1.tar.xz"
256  shift
257
258  # Build the tar file itself.
259  (${TAR} cf - "$@" | ${XZ} > ${TARFILE}) || \
260    error "Could not build tarfile"
261  FILE_LIST="${FILE_LIST} ${TARFILE}"
262}
263
264# Build the various tar files for the release.
265
266build_tarfiles() {
267  inform "Building tarfiles"
268
269  changedir "${WORKING_DIRECTORY}"
270
271  # The GNU Coding Standards specify that all files should
272  # world readable.
273  chmod -R a+r ${SOURCE_DIRECTORY}
274  # And that all directories have mode 755.
275  find ${SOURCE_DIRECTORY} -type d -exec chmod 755 {} \;
276
277  # Build one huge tarfile for the entire distribution.
278  build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
279}
280
281# Build .gz files.
282build_gzip() {
283  for f in ${FILE_LIST}; do
284    target=${f%.xz}.gz
285    (${XZ} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
286  done
287}
288
289# Build diffs against an old release.
290build_diffs() {
291  old_dir=${1%/*}
292  old_file=${1##*/}
293  case "$old_file" in
294    *.tar.xz) old_vers=${old_file%.tar.xz};;
295    *) old_vers=${old_file%.tar.bz2};;
296  esac
297  old_vers=${old_vers#gcc-}
298  inform "Building diffs against version $old_vers"
299  for f in gcc; do
300    if [ -e ${old_dir}/${f}-${old_vers}.tar.xz ]; then
301      old_tar=${old_dir}/${f}-${old_vers}.tar.xz
302    else
303      old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
304    fi
305    new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.xz
306    if [ ! -e $old_tar ]; then
307      inform "$old_tar not found; not generating diff file"
308    elif [ ! -e $new_tar ]; then
309      inform "$new_tar not found; not generating diff file"
310    else
311      build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
312        ${f}-${old_vers}-${RELEASE}.diff.xz
313    fi
314  done
315}
316
317# Build an individual diff.
318build_diff() {
319  changedir "${WORKING_DIRECTORY}"
320  tmpdir=gccdiff.$$
321  mkdir $tmpdir || error "Could not create directory $tmpdir"
322  changedir $tmpdir
323  case "$1" in
324    *.tar.bz2)
325      (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
326      ;;
327    *.tar.xz)
328      (${XZ} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
329      ;;
330  esac
331  (${XZ} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs"
332  ${DIFF} $2 $4 > ../${5%.xz}
333  if [ $? -eq 2 ]; then
334    error "Trouble making diffs from $1 to $3"
335  fi
336  ${XZ} ../${5%.xz} || error "Could not generate ../$5"
337  changedir ..
338  rm -rf $tmpdir
339  FILE_LIST="${FILE_LIST} $5"
340}
341
342# Upload the files to the FTP server.
343upload_files() {
344  inform "Uploading files"
345
346  changedir "${WORKING_DIRECTORY}"
347
348  # Make sure the directory exists on the server.
349  if [ $LOCAL -eq 0 ]; then
350    ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
351      mkdir -p "${FTP_PATH}/diffs"
352    UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
353  else
354    mkdir -p "${FTP_PATH}/diffs" \
355      || error "Could not create \`${FTP_PATH}'"
356    UPLOAD_PATH=${FTP_PATH}
357  fi
358
359  # Then copy files to their respective (sub)directories.
360  for x in gcc*.gz gcc*.xz; do
361    if [ -e ${x} ]; then
362      # Make sure the file will be readable on the server.
363      chmod a+r ${x}
364      # Copy it.
365      case ${x} in
366        *.diff.*)
367          SUBDIR="diffs/";
368          ;;
369        *)
370          SUBDIR="";
371      esac
372      ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
373        || error "Could not upload ${x}"
374    fi
375  done
376}
377
378# Print description if snapshot exists.
379snapshot_print() {
380  if [ -e ${RELEASE}/$1 ]; then
381    hash=`openssl  sha256  ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
382    hash2=`openssl sha1 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
383
384    printf " %-37s%s\n\n  %s\n  %s\n\n" "$1" "$2" "$hash" "$hash2" \
385      >> ${SNAPSHOT_README}
386
387     echo "  <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX}
388     echo "      <td>$2</td></tr>" >> ${SNAPSHOT_INDEX}
389  fi
390}
391
392# Announce a snapshot, both on the web and via mail.
393announce_snapshot() {
394  inform "Updating links and READMEs on the FTP server"
395
396  TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
397  SNAPSHOT_README=${RELEASE}/README
398  SNAPSHOT_INDEX=${RELEASE}/index.html
399
400  changedir "${SNAPSHOTS_DIR}"
401  echo \
402"Snapshot gcc-"${RELEASE}" is now available on
403  ftp://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
404and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
405
406This snapshot has been generated from the GCC "${BRANCH}" SVN branch
407with the following options: "svn://gcc.gnu.org/svn/gcc/${SVNBRANCH} revision ${SVNREV}"
408
409You'll find:
410" > ${SNAPSHOT_README}
411
412  echo \
413"<html>
414
415<head>
416<title>GCC "${RELEASE}" Snapshot</title>
417</head>
418
419<body>
420<h1>GCC "${RELEASE}" Snapshot</h1>
421
422<p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
423periodic snapshots of the GCC source tree available to the public
424for testing purposes.</p>
425
426<p>If you are planning to download and use one of our snapshots, then
427we highly recommend you join the GCC developers list.  Details for
428how to sign up can be found on the GCC project home page.</p>
429
430<p>This snapshot has been generated from the GCC "${BRANCH}" SVN branch
431with the following options: <code>"svn://gcc.gnu.org/svn/gcc/${SVNBRANCH} revision ${SVNREV}"</code></p>
432
433<table>" > ${SNAPSHOT_INDEX}
434
435  snapshot_print gcc-${RELEASE}.tar.xz "Complete GCC"
436
437  echo \
438"Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
439
440When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
441link is updated and a message is sent to the gcc list.  Please do not use
442a snapshot before it has been announced that way." >> ${SNAPSHOT_README}
443
444  echo \
445"</table>
446<p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
447<a href=\"diffs/\">diffs/ subdirectory</a>.</p>
448
449<p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
450link is updated and a message is sent to the gcc list.  Please do not use
451a snapshot before it has been announced that way.</p>
452
453<hr />
454
455<address>
456<a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a>
457<br />
458Last modified "${TEXT_DATE}"
459</address>
460</body>
461
462</html>" >> ${SNAPSHOT_INDEX}
463
464  rm -f LATEST-${BRANCH}
465  ln -s ${RELEASE} LATEST-${BRANCH}
466
467  inform "Sending mail"
468
469  export QMAILHOST=gcc.gnu.org
470  mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
471}
472
473########################################################################
474# Initialization
475########################################################################
476
477LC_ALL=C
478export LC_ALL
479
480# Today's date.
481DATE=`date "+%Y%m%d"`
482LONG_DATE=`date "+%Y-%m-%d"`
483
484SVN=${SVN:-svn}
485# The CVS server containing the GCC repository.
486SVN_SERVER="gcc.gnu.org"
487# The path to the repository on that server.
488SVN_REPOSITORY="/svn/gcc"
489# The username to use when connecting to the server.
490SVN_USERNAME="${USER}"
491
492# The machine to which files will be uploaded.
493GCC_HOSTNAME="gcc.gnu.org"
494# The name of the account on the machine to which files are uploaded.
495GCC_USERNAME="gccadmin"
496# The directory in which the files will be placed (do not use ~user syntax).
497FTP_PATH=/var/ftp/pub/gcc
498# The directory in which snapshots will be placed.
499SNAPSHOTS_DIR=${FTP_PATH}/snapshots
500
501# The major number for the release.  For release `3.0.2' this would be
502# `3'
503RELEASE_MAJOR=""
504# The minor number for the release.  For release `3.0.2' this would be
505# `0'.
506RELEASE_MINOR=""
507# The revision number for the release.  For release `3.0.2' this would
508# be `2'.
509RELEASE_REVISION=""
510# The complete name of the release.
511RELEASE=""
512
513# The name of the branch from which the release should be made, in a
514# user-friendly form.
515BRANCH=""
516
517# The name of the branch from which the release should be made, as used
518# for our version control system.
519SVNBRANCH=""
520
521# The tag to apply to the sources used for the release.
522TAG=""
523
524# The old tarballs from which to generate diffs.
525OLD_TARS=""
526
527# The directory that will be used to construct the release.  The
528# release itself will be placed in a subdirectory of this directory.
529DESTINATION=${HOME}
530# The subdirectory.
531WORKING_DIRECTORY=""
532# The directory that will contain the GCC sources.
533SOURCE_DIRECTORY=""
534
535# Non-zero if this is the final release, rather than a prerelease.
536FINAL=0
537
538# Non-zero if we are building a snapshot, and don't build gcc or
539# include generated files.
540SNAPSHOT=0
541
542# Non-zero if we are running locally on gcc.gnu.org, and use local CVS
543# and copy directly to the FTP directory.
544LOCAL=0
545
546# Major operation modes.
547MODE_GZIP=0
548MODE_DIFFS=0
549MODE_SOURCES=0
550MODE_TARFILES=0
551MODE_UPLOAD=0
552
553# List of archive files generated; used to create .gz files from .xz.
554FILE_LIST=""
555
556# Programs we use.
557
558BZIP2="${BZIP2:-bzip2}"
559XZ="${XZ:-xz --best}"
560CVS="${CVS:-cvs -f -Q -z9}"
561DIFF="${DIFF:-diff -Nrcpad}"
562ENV="${ENV:-env}"
563GZIP="${GZIP:-gzip --best}"
564SCP="${SCP:-scp -p}"
565SSH="${SSH:-ssh}"
566TAR="${TAR:-tar}"
567
568########################################################################
569# Command Line Processing
570########################################################################
571
572# Parse the options.
573while getopts "d:fr:u:t:p:s:l" ARG; do
574    case $ARG in
575    d)    DESTINATION="${OPTARG}";;
576    r)    RELEASE="${OPTARG}";;
577    t)    TAG="${OPTARG}";;
578    u)    SVN_USERNAME="${OPTARG}";;
579    f)    FINAL=1;;
580    s)    SNAPSHOT=1
581          BRANCH=${OPTARG%:*}
582          SVNBRANCH=${OPTARG#*:}
583          ;;
584    l)    LOCAL=1
585	  SCP=cp
586	  PATH=~:/usr/local/bin:$PATH;;
587    p)    OLD_TARS="${OLD_TARS} ${OPTARG}"
588          if [ ! -f ${OPTARG} ]; then
589	    error "-p argument must name a tarball"
590	  fi;;
591    \?)   usage;;
592    esac
593done
594shift `expr ${OPTIND} - 1`
595
596# Handle the major modes.
597while [ $# -ne 0 ]; do
598    case $1 in
599    diffs)    MODE_DIFFS=1;;
600    gzip)     MODE_GZIP=1;;
601    sources)  MODE_SOURCES=1;;
602    tarfiles) MODE_TARFILES=1;;
603    upload)   MODE_UPLOAD=1;;
604    all)      MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1;
605              if [ $SNAPSHOT -ne 1 ]; then
606                # Only for releases and pre-releases.
607                MODE_GZIP=1;
608              fi
609              ;;
610    *)        error "Unknown mode $1";;
611    esac
612    shift
613done
614
615# Perform consistency checking.
616if [ ${LOCAL} -eq 0 ] && [ -z ${SVN_USERNAME} ]; then
617  error "No username specified"
618fi
619
620if [ ! -d ${DESTINATION} ]; then
621  error "\`${DESTINATION}' is not a directory"
622fi
623
624if [ $SNAPSHOT -eq 0 ]; then
625  if [ -z ${RELEASE} ]; then
626    error "No release number specified"
627  fi
628
629  # Compute the major and minor release numbers.
630  RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'`
631  RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'`
632  RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'`
633
634  if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
635    error "Release number \`${RELEASE}' is invalid"
636  fi
637
638  # Compute the full name of the release.
639  if [ -z "${RELEASE_REVISION}" ]; then
640    RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}"
641  else
642    RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}"
643  fi
644
645  # Compute the name of the branch, which is based solely on the major
646  # and minor release numbers.
647  if [ ${RELEASE_MAJOR} -ge 5 ]; then
648    SVNBRANCH="branches/gcc-${RELEASE_MAJOR}-branch"
649  else
650    SVNBRANCH="branches/gcc-${RELEASE_MAJOR}_${RELEASE_MINOR}-branch"
651  fi
652
653  # If this is not a final release, set various parameters accordingly.
654  if [ ${FINAL} -ne 1 ]; then
655    RELEASE="${RELEASE}-RC-${DATE}"
656    FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}"
657  else
658    FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
659  fi
660else
661  RELEASE=${BRANCH}-${DATE}
662  FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"
663
664  # If diffs are requested when building locally on gcc.gnu.org, we (usually)
665  # know what the last snapshot date was and take the corresponding tarballs,
666  # unless the user specified tarballs explicitly.
667  if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then
668    LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
669    OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
670    if [ ! -e $OLD_TARS ]; then
671      OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.xz
672    fi
673  fi
674fi
675
676# Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
677WORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
678SOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"
679
680# Set up SVNROOT.
681if [ $LOCAL -eq 0 ]; then
682    SVNROOT="svn+ssh://${SVN_USERNAME}@${SVN_SERVER}${SVN_REPOSITORY}"
683else
684    SVNROOT="file:///svn/gcc"
685fi
686export SVNROOT
687
688########################################################################
689# Main Program
690########################################################################
691
692# Set the timezone to UTC
693TZ="UTC0"
694export TZ
695
696# Build the source directory.
697
698if [ $MODE_SOURCES -ne 0 ]; then
699  build_sources
700fi
701
702# Build the tar files.
703
704if [ $MODE_TARFILES -ne 0 ]; then
705  build_tarfiles
706fi
707
708# Build diffs
709
710if [ $MODE_DIFFS -ne 0 ]; then
711  # Possibly build diffs.
712  if [ -n "$OLD_TARS" ]; then
713    for old_tar in $OLD_TARS; do
714      build_diffs $old_tar
715    done
716  fi
717fi
718
719# Build gzip files
720if [ $MODE_GZIP -ne 0 ]; then
721  build_gzip
722fi
723
724# Upload them to the FTP server.
725if [ $MODE_UPLOAD -ne 0 ]; then
726  upload_files
727
728  # For snapshots, make some further updates.
729  if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
730    announce_snapshot
731
732    # Update snapshot date file.
733    changedir ~
734    echo $DATE > .snapshot_date-${BRANCH}
735
736    # Remove working directory
737    rm -rf ${WORKING_DIRECTORY}
738  fi
739fi
740