#!/bin/bash
#
# Ceres Solver - A fast non-linear least squares minimizer
# Copyright 2015 Google Inc. All rights reserved.
# http://ceres-solver.org/
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
#   this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
#   this list of conditions and the following disclaimer in the documentation
#   and/or other materials provided with the distribution.
# * Neither the name of Google Inc. nor the names of its contributors may be
#   used to endorse or promote products derived from this software without
#   specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Author: mierle@gmail.com (Keir Mierle)
#
# Note: You will need Sphinx and Pygments installed for this to work.

if [ -z $1 ] ; then
  echo 'usage: scripts/make_release <version>'
  echo '       must be run from toplevel Ceres source directory'
  exit 1
fi

TMP="/tmp/ceres-solver-$1"
DOCS_TMP="/tmp/ceres-solver-docs-$1"
VERSION=$(grep 'SET(CERES_VERSION_' CMakeLists.txt | \
          sed -e 's/\(.*\) \(.*\))/\2/' | \
          tr '\n' '.' | sed -e 's/.$//')
ABI_VERSION=$(grep 'SET(CERES_ABI_VERSION' CMakeLists.txt | \
              sed -e 's/SET(CERES_ABI_VERSION //' | \
              sed -e 's/)//')
VERSION_IN_SPEC=$(grep '^Version:' scripts/ceres-solver.spec | \
                  sed -e 's/Version: *//')
GIT_COMMIT=$(git log -1 HEAD |grep commit)

if [[ $1 != $VERSION ]] ; then
  echo "ERROR: Version from the command line $1 does not match CERES_VERSION"
  echo "       in CMakeLists.txt, which is $VERSION. You may not be in the "
  echo "       toplevel source dir."
  exit 1
fi

if [[ $VERSION_IN_SPEC != $VERSION ]] ; then
  echo "ERROR: Version string from scripts/ceres-solver.spec, which is"
  echo "       $VERSION_IN_SPEC, does not match the version"
  echo "       from the toplevel CMakeLists.txt, which is $ABI_VERSION."
  echo "       You may not be in the toplevel source directory, or the"
  echo "       versions are out of sync."
  exit 1
fi

# Export repository.
git checkout-index -f -a --prefix=$TMP/

# Build the VERSION file.
VERSIONFILE=$TMP/VERSION
echo "version $VERSION" >> $VERSIONFILE
echo "abi_version $VERSION" >> $VERSIONFILE
echo "$GIT_COMMIT" >> $VERSIONFILE

# Build the documentation.
python $TMP/scripts/make_docs.py $TMP $DOCS_TMP
cp -pr $DOCS_TMP/html $TMP/docs

# Build the tarball.
cd /tmp
tar -cvzf "ceres-solver-$1.tar.gz" "ceres-solver-$1"

# Don't leave a mess behind.
rm -rf $TMP
rm -rf $DOCS_TMP

# Reminder to upload.
cat <<EOF

TODO:
  - Upload /tmp/ceres-solver-$1.tar.gz

  - Update the release string in scripts/ceres-solver.spec if this is a RC
    release or the first release after a RC release.

  - Build and upload RPM package.

EOF
