Home | History | Annotate | Line # | Download | only in maintainer-scripts
gcc_release revision 1.5.2.1
      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 
     51 error() {
     52     echo "gcc_release: error: $1"
     53     exit 1
     54 }
     55 
     56 # Issue the informational message given by $1.
     57 
     58 inform() {
     59     echo "gcc_release: $1"
     60 }
     61 
     62 # Issue a usage message explaining how to use this script.
     63 
     64 usage() {
     65 cat <<EOF
     66 gcc_release -r release [-f] [further options]
     67 gcc_release -s name:svnbranch [further options]
     68 
     69 Options:
     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.
     81 EOF
     82     exit 1
     83 }
     84 
     85 # Change to the directory given by $1.
     86 
     87 changedir() {
     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 
     95 build_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 
    124 EOF
    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     contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
    213       -c "--enable-generated-files-in-srcdir --disable-multilib" build || \
    214       error "Could not rebuild GCC"
    215   fi
    216 
    217   # Move message catalogs to source directory.
    218   mv ../objdir/gcc/po/*.gmo gcc/po/
    219   [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/
    220 
    221   # Create a "MD5SUMS" file to use for checking the validity of the release.
    222   echo \
    223 "# This file contains the MD5 checksums of the files in the 
    224 # gcc-"${RELEASE}".tar.bz2 tarball.
    225 #
    226 # Besides verifying that all files in the tarball were correctly expanded,
    227 # it also can be used to determine if any files have changed since the
    228 # tarball was expanded or to verify that a patchfile was correctly applied.
    229 #
    230 # Suggested usage:
    231 # md5sum -c MD5SUMS | grep -v \"OK$\"
    232 #" > MD5SUMS
    233 
    234   find . -type f |
    235   sed -e 's:^\./::' -e '/MD5SUMS/d' |
    236   sort |
    237   xargs md5sum >>MD5SUMS
    238 }
    239 
    240 # Build a single tarfile.  The first argument is the name of the tarfile
    241 # to build, without any suffixes.  They will be added automatically.  The
    242 # rest of the arguments are files or directories to include, and possibly
    243 # other arguments to tar.
    244 
    245 build_tarfile() {
    246   # Get the name of the destination tar file.
    247   TARFILE="$1.tar.bz2"
    248   shift
    249 
    250   # Build the tar file itself.
    251   (${TAR} cf - "$@" | ${BZIP2} > ${TARFILE}) || \
    252     error "Could not build tarfile"
    253   FILE_LIST="${FILE_LIST} ${TARFILE}"
    254 }
    255 
    256 # Build the various tar files for the release.
    257 
    258 build_tarfiles() {
    259   inform "Building tarfiles"
    260 
    261   changedir "${WORKING_DIRECTORY}"
    262 
    263   # The GNU Coding Standards specify that all files should
    264   # world readable.
    265   chmod -R a+r ${SOURCE_DIRECTORY}
    266   # And that all directories have mode 755.
    267   find ${SOURCE_DIRECTORY} -type d -exec chmod 755 {} \;
    268  
    269   # Build one huge tarfile for the entire distribution.
    270   build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
    271 }
    272 
    273 # Build .gz files.
    274 build_gzip() {
    275   for f in ${FILE_LIST}; do
    276     target=${f%.bz2}.gz
    277     (${BZIP2} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
    278   done
    279 }
    280 
    281 # Build diffs against an old release.
    282 build_diffs() {
    283   old_dir=${1%/*}
    284   old_file=${1##*/}
    285   old_vers=${old_file%.tar.bz2}
    286   old_vers=${old_vers#gcc-}
    287   inform "Building diffs against version $old_vers"
    288   for f in gcc; do
    289     old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
    290     new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.bz2
    291     if [ ! -e $old_tar ]; then
    292       inform "$old_tar not found; not generating diff file"
    293     elif [ ! -e $new_tar ]; then
    294       inform "$new_tar not found; not generating diff file"
    295     else
    296       build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
    297         ${f}-${old_vers}-${RELEASE}.diff.bz2
    298     fi
    299   done
    300 }
    301 
    302 # Build an individual diff.
    303 build_diff() {
    304   changedir "${WORKING_DIRECTORY}"
    305   tmpdir=gccdiff.$$
    306   mkdir $tmpdir || error "Could not create directory $tmpdir"
    307   changedir $tmpdir
    308   (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
    309   (${BZIP2} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs"
    310   ${DIFF} $2 $4 > ../${5%.bz2}
    311   if [ $? -eq 2 ]; then
    312     error "Trouble making diffs from $1 to $3"
    313   fi
    314   ${BZIP2} ../${5%.bz2} || error "Could not generate ../$5"
    315   changedir ..
    316   rm -rf $tmpdir
    317   FILE_LIST="${FILE_LIST} $5"
    318 }
    319 
    320 # Upload the files to the FTP server.
    321 upload_files() {
    322   inform "Uploading files"
    323 
    324   changedir "${WORKING_DIRECTORY}"
    325 
    326   # Make sure the directory exists on the server.
    327   if [ $LOCAL -eq 0 ]; then
    328     ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
    329       mkdir -p "${FTP_PATH}/diffs"
    330     UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
    331   else
    332     mkdir -p "${FTP_PATH}/diffs" \
    333       || error "Could not create \`${FTP_PATH}'"
    334     UPLOAD_PATH=${FTP_PATH}
    335   fi
    336 
    337   # Then copy files to their respective (sub)directories.
    338   for x in gcc*.gz gcc*.bz2; do
    339     if [ -e ${x} ]; then
    340       # Make sure the file will be readable on the server.
    341       chmod a+r ${x}
    342       # Copy it.
    343       case ${x} in
    344         *.diff.*)
    345           SUBDIR="diffs/";
    346           ;;
    347         *)
    348           SUBDIR="";
    349       esac
    350       ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
    351         || error "Could not upload ${x}"
    352     fi
    353   done
    354 }
    355 
    356 # Print description if snapshot exists.
    357 snapshot_print() {
    358   if [ -e ${RELEASE}/$1 ]; then
    359     hash=`openssl  md5  ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
    360     hash2=`openssl sha1 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
    361 
    362     printf " %-37s%s\n\n  %s\n  %s\n\n" "$1" "$2" "$hash" "$hash2" \
    363       >> ${SNAPSHOT_README}
    364 
    365      echo "  <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX}
    366      echo "      <td>$2</td></tr>" >> ${SNAPSHOT_INDEX}
    367   fi
    368 }
    369 
    370 # Announce a snapshot, both on the web and via mail.
    371 announce_snapshot() {
    372   inform "Updating links and READMEs on the FTP server"
    373   
    374   TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
    375   SNAPSHOT_README=${RELEASE}/README
    376   SNAPSHOT_INDEX=${RELEASE}/index.html
    377 
    378   changedir "${SNAPSHOTS_DIR}"
    379   echo \
    380 "Snapshot gcc-"${RELEASE}" is now available on
    381   ftp://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
    382 and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
    383 
    384 This snapshot has been generated from the GCC "${BRANCH}" SVN branch
    385 with the following options: "svn://gcc.gnu.org/svn/gcc/${SVNBRANCH} revision ${SVNREV}"
    386 
    387 You'll find:
    388 " > ${SNAPSHOT_README}
    389 
    390   echo \
    391 "<html>
    392 
    393 <head>
    394 <title>GCC "${RELEASE}" Snapshot</title>
    395 </head>
    396 
    397 <body>
    398 <h1>GCC "${RELEASE}" Snapshot</h1>
    399 
    400 <p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
    401 periodic snapshots of the GCC source tree available to the public
    402 for testing purposes.</p>
    403 	
    404 <p>If you are planning to download and use one of our snapshots, then
    405 we highly recommend you join the GCC developers list.  Details for
    406 how to sign up can be found on the GCC project home page.</p>
    407 
    408 <p>This snapshot has been generated from the GCC "${BRANCH}" SVN branch
    409 with the following options: <code>"svn://gcc.gnu.org/svn/gcc/${SVNBRANCH} revision ${SVNREV}"</code></p>
    410 
    411 <table>" > ${SNAPSHOT_INDEX}
    412        
    413   snapshot_print gcc-${RELEASE}.tar.bz2 "Complete GCC"
    414 
    415   echo \
    416 "Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
    417 
    418 When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
    419 link is updated and a message is sent to the gcc list.  Please do not use
    420 a snapshot before it has been announced that way." >> ${SNAPSHOT_README}
    421 
    422   echo \
    423 "</table>
    424 <p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
    425 <a href=\"diffs/\">diffs/ subdirectory</a>.</p>
    426 
    427 <p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
    428 link is updated and a message is sent to the gcc list.  Please do not use
    429 a snapshot before it has been announced that way.</p>
    430 
    431 <hr />
    432 
    433 <address>
    434 <a href=\"mailto:gcc (at] gcc.gnu.org\">gcc (at] gcc.gnu.org</a>
    435 <br />
    436 Last modified "${TEXT_DATE}"
    437 </address>
    438 </body>
    439 
    440 </html>" >> ${SNAPSHOT_INDEX}
    441 
    442   rm -f LATEST-${BRANCH}
    443   ln -s ${RELEASE} LATEST-${BRANCH}
    444 
    445   inform "Sending mail"
    446 
    447   export QMAILHOST=gcc.gnu.org
    448   mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
    449 }
    450 
    451 ########################################################################
    452 # Initialization
    453 ########################################################################
    454 
    455 LC_ALL=C
    456 export LC_ALL
    457 
    458 # Today's date.
    459 DATE=`date "+%Y%m%d"`
    460 LONG_DATE=`date "+%Y-%m-%d"`
    461 
    462 SVN=${SVN:-svn}
    463 # The CVS server containing the GCC repository.
    464 SVN_SERVER="gcc.gnu.org"
    465 # The path to the repository on that server.
    466 SVN_REPOSITORY="/svn/gcc"
    467 # The username to use when connecting to the server.
    468 SVN_USERNAME="${USER}"
    469 
    470 # The machine to which files will be uploaded.
    471 GCC_HOSTNAME="gcc.gnu.org"
    472 # The name of the account on the machine to which files are uploaded.
    473 GCC_USERNAME="gccadmin"
    474 # The directory in which the files will be placed (do not use ~user syntax).
    475 FTP_PATH=/var/ftp/pub/gcc
    476 # The directory in which snapshots will be placed.
    477 SNAPSHOTS_DIR=${FTP_PATH}/snapshots
    478 
    479 # The major number for the release.  For release `3.0.2' this would be 
    480 # `3'
    481 RELEASE_MAJOR=""
    482 # The minor number for the release.  For release `3.0.2' this would be
    483 # `0'.
    484 RELEASE_MINOR=""
    485 # The revision number for the release.  For release `3.0.2' this would
    486 # be `2'.
    487 RELEASE_REVISION=""
    488 # The complete name of the release.
    489 RELEASE=""
    490 
    491 # The name of the branch from which the release should be made, in a 
    492 # user-friendly form.
    493 BRANCH=""
    494 
    495 # The name of the branch from which the release should be made, as used
    496 # for our version control system.
    497 SVNBRANCH=""
    498 
    499 # The tag to apply to the sources used for the release.
    500 TAG=""
    501 
    502 # The old tarballs from which to generate diffs.
    503 OLD_TARS=""
    504 
    505 # The directory that will be used to construct the release.  The
    506 # release itself will be placed in a subdirectory of this directory.
    507 DESTINATION=${HOME}
    508 # The subdirectory.
    509 WORKING_DIRECTORY=""
    510 # The directory that will contain the GCC sources.
    511 SOURCE_DIRECTORY=""
    512 
    513 # Non-zero if this is the final release, rather than a prerelease.
    514 FINAL=0
    515 
    516 # Non-zero if we are building a snapshot, and don't build gcc or
    517 # include generated files.
    518 SNAPSHOT=0
    519 
    520 # Non-zero if we are running locally on gcc.gnu.org, and use local CVS
    521 # and copy directly to the FTP directory.
    522 LOCAL=0
    523 
    524 # Major operation modes.
    525 MODE_GZIP=0
    526 MODE_DIFFS=0
    527 MODE_SOURCES=0
    528 MODE_TARFILES=0
    529 MODE_UPLOAD=0
    530 
    531 # List of archive files generated; used to create .gz files from .bz2.
    532 FILE_LIST=""
    533 
    534 # Programs we use.
    535 
    536 BZIP2="${BZIP2:-bzip2}"
    537 CVS="${CVS:-cvs -f -Q -z9}"
    538 DIFF="${DIFF:-diff -Nrcpad}"
    539 ENV="${ENV:-env}"
    540 GZIP="${GZIP:-gzip --best}"
    541 SCP="${SCP:-scp -p}"
    542 SSH="${SSH:-ssh}"
    543 TAR="${TAR:-tar}"
    544 
    545 ########################################################################
    546 # Command Line Processing
    547 ########################################################################
    548 
    549 # Parse the options.
    550 while getopts "d:fr:u:t:p:s:l" ARG; do
    551     case $ARG in
    552     d)    DESTINATION="${OPTARG}";;
    553     r)    RELEASE="${OPTARG}";;
    554     t)    TAG="${OPTARG}";;
    555     u)    SVN_USERNAME="${OPTARG}";;
    556     f)    FINAL=1;;
    557     s)    SNAPSHOT=1
    558           BRANCH=${OPTARG%:*}
    559           SVNBRANCH=${OPTARG#*:}
    560           ;;
    561     l)    LOCAL=1
    562 	  SCP=cp
    563 	  PATH=~:/usr/local/bin:$PATH;;
    564     p)    OLD_TARS="${OLD_TARS} ${OPTARG}"
    565           if [ ! -f ${OPTARG} ]; then
    566 	    error "-p argument must name a tarball"
    567 	  fi;;
    568     \?)   usage;;
    569     esac
    570 done
    571 shift `expr ${OPTIND} - 1`
    572 
    573 # Handle the major modes.
    574 while [ $# -ne 0 ]; do
    575     case $1 in
    576     diffs)    MODE_DIFFS=1;;
    577     gzip)     MODE_GZIP=1;;
    578     sources)  MODE_SOURCES=1;;
    579     tarfiles) MODE_TARFILES=1;;
    580     upload)   MODE_UPLOAD=1;;
    581     all)      MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1;
    582               if [ $SNAPSHOT -ne 1 ]; then
    583                 # Only for releases and pre-releases.
    584                 MODE_GZIP=1;
    585               fi
    586               ;;
    587     *)        error "Unknown mode $1";;
    588     esac
    589     shift
    590 done
    591 
    592 # Perform consistency checking.
    593 if [ ${LOCAL} -eq 0 ] && [ -z ${SVN_USERNAME} ]; then
    594   error "No username specified"
    595 fi
    596 
    597 if [ ! -d ${DESTINATION} ]; then
    598   error "\`${DESTINATION}' is not a directory"
    599 fi
    600 
    601 if [ $SNAPSHOT -eq 0 ]; then
    602   if [ -z ${RELEASE} ]; then
    603     error "No release number specified"
    604   fi
    605 
    606   # Compute the major and minor release numbers.
    607   RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'`
    608   RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'`
    609   RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'`
    610 
    611   if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
    612     error "Release number \`${RELEASE}' is invalid"
    613   fi
    614 
    615   # Compute the full name of the release.
    616   if [ -z "${RELEASE_REVISION}" ]; then
    617     RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}"
    618   else
    619     RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}"
    620   fi
    621 
    622   # Compute the name of the branch, which is based solely on the major
    623   # and minor release numbers.
    624   if [ ${RELEASE_MAJOR} -ge 5 ]; then
    625     SVNBRANCH="branches/gcc-${RELEASE_MAJOR}-branch"
    626   else
    627     SVNBRANCH="branches/gcc-${RELEASE_MAJOR}_${RELEASE_MINOR}-branch"
    628   fi
    629 
    630   # If this is not a final release, set various parameters accordingly.
    631   if [ ${FINAL} -ne 1 ]; then
    632     RELEASE="${RELEASE}-RC-${DATE}"
    633     FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}"
    634   else
    635     FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
    636   fi
    637 else
    638   RELEASE=${BRANCH}-${DATE}
    639   FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"
    640 
    641   # If diffs are requested when building locally on gcc.gnu.org, we (usually)
    642   # know what the last snapshot date was and take the corresponding tarballs,
    643   # unless the user specified tarballs explicitly.
    644   if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then
    645     LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
    646     OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
    647   fi
    648 fi
    649 
    650 # Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
    651 WORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
    652 SOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"
    653 
    654 # Set up SVNROOT.
    655 if [ $LOCAL -eq 0 ]; then
    656     SVNROOT="svn+ssh://${SVN_USERNAME}@${SVN_SERVER}${SVN_REPOSITORY}"
    657 else
    658     SVNROOT="file:///svn/gcc"
    659 fi
    660 export SVNROOT
    661 
    662 ########################################################################
    663 # Main Program
    664 ########################################################################
    665 
    666 # Set the timezone to UTC
    667 TZ="UTC0"
    668 export TZ
    669 
    670 # Build the source directory.
    671 
    672 if [ $MODE_SOURCES -ne 0 ]; then
    673   build_sources
    674 fi
    675 
    676 # Build the tar files.
    677 
    678 if [ $MODE_TARFILES -ne 0 ]; then
    679   build_tarfiles
    680 fi
    681 
    682 # Build diffs
    683 
    684 if [ $MODE_DIFFS -ne 0 ]; then
    685   # Possibly build diffs.
    686   if [ -n "$OLD_TARS" ]; then
    687     for old_tar in $OLD_TARS; do
    688       build_diffs $old_tar
    689     done
    690   fi
    691 fi
    692 
    693 # Build gzip files
    694 if [ $MODE_GZIP -ne 0 ]; then
    695   build_gzip
    696 fi
    697 
    698 # Upload them to the FTP server.
    699 if [ $MODE_UPLOAD -ne 0 ]; then
    700   upload_files
    701 
    702   # For snapshots, make some further updates.
    703   if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
    704     announce_snapshot
    705 
    706     # Update snapshot date file.
    707     changedir ~
    708     echo $DATE > .snapshot_date-${BRANCH}
    709 
    710     # Remove working directory
    711     rm -rf ${WORKING_DIRECTORY}
    712   fi
    713 fi
    714