#! /bin/sh

########################################################################
#
# File:   gcc_release
# Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell
# Date:   2001-05-25
#
# Contents:
#   Script to create a GCC release.
#
# Copyright (c) 2001, 2002, 2006, 2009, 2010, 2011 Free Software Foundation.
#
# This file is part of GCC.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GCC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.
#
########################################################################

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

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

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

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

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

# Issue the informational message given by $1.

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

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

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

Options:

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

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

# Change to the directory given by $1.

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

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

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

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

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

	* GCC ${RELEASE} released.

EOF
        mv ${x}.new ${x} || \
            error "Could not update ${x}"
        (changedir `dirname ${x}` && \
            ${SVN} -q ci -m 'Mark ChangeLog' `basename ${x}`) || \
            error "Could not commit ${x}"
      fi
    done

    # Update gcc/DEV-PHASE.

    [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` = ${RELEASE} ] || \
    error "Release number ${RELEASE} does not match BASE-VER"
    (changedir ${SOURCE_DIRECTORY}/gcc && \
     : > DEV-PHASE && \
     ${SVN} -q ci -m 'Mark as release' DEV-PHASE) || \
    error "Could not update DEV-PHASE"

    # Make sure we tag the sources for a final release.
    TAG="tags/gcc_`echo ${RELEASE} | tr . _`_release"

    rm -rf ${SOURCE_DIRECTORY}
  fi

  # Tag the sources.
  if [ -n "${TAG}" ]; then
    inform "Tagging sources as ${TAG}"
    # We don't want to overwrite an existing tag.  So, if the tag
    # already exists, issue an error message; the release manager can
    # manually remove the tag if appropriate.
    echo "${SVN} ls ${SVNROOT}/${TAG}/ChangeLog" 
    if ${SVN} ls "${SVNROOT}/${TAG}/ChangeLog"; then 
      error "Tag ${TAG} already exists"
    fi
    ${SVN} -m "Tagging source as ${TAG}" cp "${SVNROOT}/${SVNBRANCH}" "${SVNROOT}/${TAG}" || \
      error "Could not tag sources"
    SVNBRANCH=${TAG}
  fi
  SVNREV=`${SVN} info "${SVNROOT}/${SVNBRANCH}"|awk '/Revision:/ {print $2}'`

  # Export the current sources.
  inform "Retrieving sources (svn export -r ${SVNREV} ${SVNROOT}/${SVNBRANCH})"

  ${SVN} -q export -r${SVNREV} "${SVNROOT}/${SVNBRANCH}" "`basename ${SOURCE_DIRECTORY}`" ||\
    error "Could not retrieve sources"

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

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

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

    # Now, we must build the compiler in order to create any generated
    # files that are supposed to go in the source directory.  This is
    # also a good sanity check to make sure that the release builds
    # on at least one platform.
    inform "Building compiler"
    OBJECT_DIRECTORY=../objdir
    contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
      -c "--enable-generated-files-in-srcdir --disable-multilib" build || \
      error "Could not rebuild GCC"
  fi

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

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

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

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

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

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

# Build the various tar files for the release.

build_tarfiles() {
  inform "Building tarfiles"

  changedir "${WORKING_DIRECTORY}"

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

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

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

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

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

  changedir "${WORKING_DIRECTORY}"

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

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

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

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

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

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

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

This snapshot has been generated from the GCC "${BRANCH}" SVN branch
with the following options: "svn://gcc.gnu.org/svn/gcc/${SVNBRANCH} revision ${SVNREV}"

You'll find:
" > ${SNAPSHOT_README}

  echo \
"<html>

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

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

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

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

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

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

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

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

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

<hr />

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

</html>" >> ${SNAPSHOT_INDEX}

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

  inform "Sending mail"

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

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

LC_ALL=C
export LC_ALL

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

SVN=${SVN:-svn}
# The CVS server containing the GCC repository.
SVN_SERVER="gcc.gnu.org"
# The path to the repository on that server.
SVN_REPOSITORY="/svn/gcc"
# The username to use when connecting to the server.
SVN_USERNAME="${USER}"

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

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

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

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

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

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

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

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

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

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

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

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

# Programs we use.

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

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

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

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

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

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

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

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

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

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

  # Compute the name of the branch, which is based solely on the major
  # and minor release numbers.
  SVNBRANCH="branches/gcc-${RELEASE_MAJOR}_${RELEASE_MINOR}-branch"

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

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

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

# Set up SVNROOT.
if [ $LOCAL -eq 0 ]; then
    SVNROOT="svn+ssh://${SVN_USERNAME}@${SVN_SERVER}${SVN_REPOSITORY}"
else
    SVNROOT="file:///svn/gcc"
fi
export SVNROOT

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

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

# Build the source directory.

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

# Build the tar files.

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

# Build diffs

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

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

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

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

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

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