#!/bin/sh
#
# makesrcdist - make a distribution of FLTK.
#
# There are 3 different modes of operation, dependent on commandline arguments:
#
# (1) Create snapshot:
#
#     ./makesrcdist [snapshot]
#
#     Use no arguments or "snapshot" (verbatim).
#
# (2) Create distribution tarballs for test and verification:
#
#     ./makesrcdist <version> <doc-dir>
#
#     <version> : Use a version number as argument, e.g. "1.3.3" or "1.3.4rc2".
#     This can be used for local testing.
#
#     <doc-dir> : This *MUST* be a CMake build folder where all the
#     documentation (HTML, PDF, Fluid-HTML, and Fluid-PDF) were built.
#     The directory name can be relative to the FLTK root or absolute.
#
#     Note: the release tarballs will be created from the current
#     'HEAD' revision of your local Git repository. Make sure that
#     you committed all changes.
#
# (3) Create distribution tarballs (final):
#
#     ./makesrcdist <version> <doc-dir> tag
#
#     Same as (2), but create Git tag with version number.
#     Enter "tag" (verbatim) as 3rd argument.
#     This will create the Git tag "release-<version>" for the
#     current revision in the (local) FLTK Git repository and export the
#     FLTK sources from this tag for creation of distribution files.
#
#     Note: You need to 'git push' the Git tag manually when you
#     are satisfied with the result. You may use:
#       $ git push <origin> release-<version>
#     where <origin> is your remote repository, e.g. "origin" or "upstream"
#     and <version> is the version number (argument #1)
#
# Note: define FLTK_TAR if you want to use a different compatible tar
# command than "tar", e.g. to use "gtar" (bash syntax):
#   $ export FLTK_TAR="gtar"
#

TAR="tar"
if test "x$FLTK_TAR" != "x"; then
  TAR="$FLTK_TAR"
fi

# Default version numbers from commandline, overwritten later for snapshots
version="$1"
fileversion="$1"

# Set DOC_DIR for full source distribution with documentation.
# This is not used for snapshots, see comments above.

DOC_DIR="$2"

# These are the release and snapshot download URL's currently in use.
# The 'DOWNLOAD' URL is on GitHub since FLTK 1.4.1,
# the 'SNAPSHOT' URL is on fltk.org.

DOWNLOAD="https://github.com/fltk/fltk/releases/download" # /release-$1/fltk-$1-source.tar.gz
SNAPSHOT='https://www.fltk.org/pub/fltk/snapshots'

DATE="`date +'%Y%m%d'`"

GIT_REVISION=$(git rev-parse HEAD)
     git_rev=$(git rev-parse --short=12 HEAD)

# VS = short version number ('major.minor'), for instance '1.4'.
# Note: VS is used only for snapshot generation
# fltk_version = full version number w/o 'rcN' (from file fltk_version.dat)
# git_rev = short Git revision (12 chars)

fltk_version="`cat fltk_version.dat`"
VS="`echo $fltk_version | cut -f 1-2 -d '.'`"

echo "Getting distribution..."

if test $# = 0 -o "x$1" = "xsnapshot"; then
  echo Getting snapshot revision...
  version="${VS}-${git_rev}"
  fileversion="${VS}.x-${DATE}-$git_rev"
  fileurl="$SNAPSHOT/fltk-$fileversion.tar.gz"
else
  # DOC_DIR must be specified
  if test $# = 1 ; then
    echo "ERROR: doc-dir (2nd argument) must be specified"
    exit
  fi
  # DOC_DIR must be a CMake build folder
  if test ! -f $DOC_DIR/CMakeCache.txt ; then
    echo "ERROR: doc-dir (2nd argument) must be a CMake build folder."
    echo "Please generate all docs in this CMake build before distributing:"
    echo "  cd $DOC_DIR"
    echo "  make|ninja html pdf fluid_docs fluid_pdf"
    exit
  fi
  if test ! -e "$DOC_DIR/documentation/html/"; then
    echo "ERROR: Please generate the HTML documentation before distributing:"
    echo "  cd $DOC_DIR"
    echo "  make|ninja html pdf fluid_docs fluid_pdf"
    exit
  fi
  if test ! -e "$DOC_DIR/documentation/fltk.pdf"; then
    echo "ERROR: Please generate the PDF documentation before distributing:"
    echo "  cd $DOC_DIR"
    echo "  make|ninja pdf fluid_docs fluid_pdf"
    exit
  fi
  if test ! -e "$DOC_DIR/fluid/documentation/fluid.pdf"; then
    echo "ERROR: Please generate the fluid documentation before distributing:"
    echo "  cd $DOC_DIR"
    echo "  ninja fluid_docs fluid_pdf"
    exit
  fi

  fileurl="$DOWNLOAD/release-$version/fltk-$fileversion-source.tar.gz"

  if test "x$3" = "xtag"; then
    echo "Creating Git tag 'release-$version' ..."
    git tag -a -m "Release $version" release-$version || exit 1
  fi
fi

# where to build the distribution tarballs and other files:

TEMP_DIR="/tmp/fltk-$version"

# subdirectory of $TEMP_DIR for documentation in their tarballs
#
# This resembles the directory structure of releases where documentation
# would likely be installed in "/usr/share/doc/fltk".

DOC_TEMPDIR="share/doc/fltk"

# Debug:
### echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
### echo "fltk_version = $fltk_version"
### echo "version      = $version"
### echo "fileversion  = $fileversion"
### echo "fileurl      = $fileurl"
### echo "GIT_REVISION = $GIT_REVISION"
### echo "git_rev      = $git_rev"
### echo "TEMP_DIR     = $TEMP_DIR"
### echo "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"

echo Exporting $fltk_version to $TEMP_DIR/...
rm -rf /tmp/fltk-$version
mkdir /tmp/fltk-$version
git archive --format=tar HEAD | $TAR -C /tmp/fltk-$version -x --

if test $# != 0 -a "x$1" != "xsnapshot"; then

  mkdir -p $TEMP_DIR/$DOC_TEMPDIR/fluid

  echo "Copying HTML and PDF documentation..."
  cp -r $DOC_DIR/documentation/html $TEMP_DIR/$DOC_TEMPDIR/
  cp $DOC_DIR/documentation/fltk.pdf $TEMP_DIR/$DOC_TEMPDIR/

  echo "Copying FLUID HTML and PDF documentation..."
  cp -r $DOC_DIR/fluid/documentation/html $TEMP_DIR/$DOC_TEMPDIR/fluid/
  cp $DOC_DIR/fluid/documentation/fluid.pdf $TEMP_DIR/$DOC_TEMPDIR/
fi

echo Applying version number...
cd /tmp/fltk-$version

sed -e '1,$s/@FLTK_VERSION@/'$version'/' \
    -e '1,$s#^Source:.*#Source: '$fileurl'#' \
    <fltk.spec.in >fltk.spec

# Debug:
### echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
### echo "$ egrep --color -1 'Source:|$version|$git_rev' fltk.spec"
### echo "··································································"
### egrep --color -1 "Source:|$version|$git_rev" fltk.spec
### echo "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"

# Write git revision file with full git revision
# which will be stored in the distribution tarball

echo Writing git revision file...
echo "$GIT_REVISION" > fltk_git_rev.dat

echo Creating configure script...
autoconf -f

echo Cleaning developer files...
rm -rf OpenGL autom4te* bc5 config forms glut images packages themes

cd ..

if test $# != 0 -a "x$1" != "xsnapshot"; then
  echo "Making HTML docs distribution..."
  $TAR czf fltk-$fileversion-docs-html.tar.gz fltk-$version/$DOC_TEMPDIR/html/

  echo "Making PDF docs distribution..."
  $TAR czf fltk-$fileversion-docs-pdf.tar.gz fltk-$version/$DOC_TEMPDIR/fltk.pdf

  echo "Making Fluid HTML docs distribution..."
  $TAR czf fltk-$fileversion-fluid-docs-html.tar.gz fltk-$version/$DOC_TEMPDIR/fluid/html/

  echo "Making Fluid PDF docs distribution..."
  $TAR czf fltk-$fileversion-fluid-docs-pdf.tar.gz fltk-$version/$DOC_TEMPDIR/fluid.pdf

fi

echo "Removing documentation..."
rm -rf fltk-$version/documentation/html/
rm -f fltk-$version/documentation/fltk.pdf
rm -rf fltk-$version/fluid-documentation/html/
rm -f fltk-$version/fluid-documentation/fltk.pdf

echo "Making UNIX (.tar.gz) distribution..."
$TAR czf fltk-$fileversion-source.tar.gz fltk-$version

echo "Making UNIX (.tar.bz2) distribution..."
$TAR cjf fltk-$fileversion-source.tar.bz2 fltk-$version

# echo "Making Windows (.zip) distribution..."
# rm -f fltk-$fileversion-source.zip
# zip -r9 fltk-$fileversion-source.zip fltk-$version

echo "Removing distribution directory..."

rm -rf fltk-$version

# Create releases.txt and sha256sums.txt

OUT="`pwd`/fltk-$fileversion-releases.txt"
SHA="`pwd`/fltk-$fileversion-sha256sums.txt"

echo
echo "Creating Release Info in $OUT and $SHA"

echo "" > $OUT
echo "github $fltk_version $fileversion" >> $OUT
echo "" >> $OUT
rm -f $SHA
touch $SHA

# make sure the order is source, html, pdf, fluid-html, fluid-pdf and gz, bz2

for f in source docs-html docs-pdf fluid-docs-html fluid-docs-pdf; do
  for t in gz bz2; do
    FILE="fltk-$fileversion-$f.tar.$t"
    if [ -f $FILE ] ; then

      # (a) releases file:
      MD5=`md5sum $FILE | cut -f1 -d' '`
      SIZ=`wc -c  $FILE | cut -f1 -d' '`
      echo "$MD5 $FILE $SIZ" >> $OUT

      # (b) sha256sum file
      sha256sum $FILE >> $SHA
    fi
  done
done

# finally add the sha256sum file (after it is complete) to the releases file

FILE="fltk-$fileversion-sha256sums.txt"
MD5=`md5sum $FILE | cut -f1 -d' '`
SIZ=`wc -c  $FILE | cut -f1 -d' '`
echo "$MD5 $FILE $SIZ" >> $OUT

echo
echo "Done!"
echo
echo "================================================================================"
echo
echo "$OUT:"
echo
echo "--- copy the contents of this file to the top of data/releases.dat:"
cat $OUT
echo "--- end of file ---"

echo
echo "$SHA:"
echo
cat $SHA

if test "x$3" = "xtag"; then
  echo
  echo "================================================================================"
  echo "Don't forget to push the Git tag if the result is OK"
  echo "(assuming your remote Git repository is 'origin'):"
  echo
  echo "Use: \$ git push origin release-$version"
  echo
  echo "If test results are not OK you can delete the tag before pushing:"
  echo
  echo "$ git tag -d release-$version"
fi

echo
echo "================================================================================"
echo
