#!/bin/sh
# Script to build release-archives with. Note that this requires a checkout
# from git and you should first run ./buildconf and build curl once.
#
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

CURL="tiny-curl"
version=$1

if [ -z "$version" ]; then
  echo "Specify a version number!"
  exit
fi

if [ "xonly" = "x$2" ]; then
  echo "Setup version number only!"
  only=1
fi

libversion="$version"

# we make curl the same version as libcurl
curlversion=$libversion

major=`echo $libversion | cut -d. -f1 | sed -e "s/[^0-9]//g"`
minor=`echo $libversion | cut -d. -f2 | sed -e "s/[^0-9]//g"`
patch=`echo $libversion | cut -d. -f3 | cut -d- -f1 | sed -e "s/[^0-9]//g"`

if test -z "$patch"; then
  echo "invalid version number? needs to be z.y.z"
  exit
fi

#
# As a precaution, remove all *.dist files that may be lying around, to reduce
# the risk of old leftovers getting shipped. The root 'Makefile.dist' is the
# exception.
echo "removing all old *.dist files"
find . -name "*.dist" -a ! -name Makefile.dist -exec rm {} \;

numeric=`perl -e 'printf("%02x%02x%02x\n", '"$major, $minor, $patch);"`

HEADER=include/curl/curlver.h
CHEADER=src/tool_version.h
PLIST=lib/libcurl.plist

if test -z "$only"; then
  ext=".dist"
  # when not setting up version numbers locally
  for a in $HEADER $CHEADER $PLIST; do
    cp $a "$a$ext"
  done
  HEADER="$HEADER$ext"
  CHEADER="$CHEADER$ext"
  PLIST="$PLIST$ext"
fi

# requires a date command that knows + for format
datestamp=`date +"%F"`

# Replace version number in header file:
sed -i.bak \
    -e 's/^#define LIBCURL_VERSION .*/#define LIBCURL_VERSION "'$libversion'"/g' \
    -e 's/^#define LIBCURL_VERSION_NUM .*/#define LIBCURL_VERSION_NUM 0x'$numeric'/g' \
    -e 's/^#define LIBCURL_VERSION_MAJOR .*/#define LIBCURL_VERSION_MAJOR '$major'/g' \
    -e 's/^#define LIBCURL_VERSION_MINOR .*/#define LIBCURL_VERSION_MINOR '$minor'/g' \
    -e 's/^#define LIBCURL_VERSION_PATCH .*/#define LIBCURL_VERSION_PATCH '$patch'/g' \
    -e "s/^#define LIBCURL_TIMESTAMP .*/#define LIBCURL_TIMESTAMP \"$datestamp\"/g" \
    $HEADER
rm -f "$HEADER.bak"

# Replace version number in header file:
sed -i.bak 's/#define CURL_VERSION .*/#define CURL_VERSION "'$curlversion'"/g' $CHEADER
rm -f "$CHEADER.bak"

# Replace version number in plist file:
sed -i.bak "s/7\.12\.3/$libversion/g" $PLIST
rm -f "$PLIST.bak"

if test -n "$only"; then
  # done!
  exit;
fi

echo "$CURL version $curlversion"
echo "libcurl version $libversion"
echo "libcurl numerical $numeric"
echo "datestamp $datestamp"

findprog() {
  file="$1"
  for part in `echo $PATH| tr ':' ' '`; do
    path="$part/$file"
    if [ -x "$path" ]; then
      # there it is!
      return 1
    fi
  done

  # no such executable
  return 0
}

############################################################################
#
# Enforce a rerun of configure (updates the VERSION)
#

echo "Re-running config.status"
./config.status --recheck >/dev/null

############################################################################
#
# automake is needed to run to make a non-GNU Makefile.in if Makefile.am has
# been modified.
#

if { findprog automake >/dev/null 2>/dev/null; } then
  echo "- Could not find or run automake, I hope you know what you're doing!"
else
  echo "Runs automake --include-deps"
  automake --include-deps Makefile >/dev/null
fi

############################################################################
#
# Modify the man pages to display the version number and date.
#

echo "update man pages"
./scripts/updatemanpages.pl $version >/dev/null

# make the generated file newer than the man page
touch src/tool_hugehelp.c

############################################################################
#
# Update the IDE files
echo "make vc-ide"
make -s vc-ide

echo "produce CHANGES"
git log --pretty=fuller --no-color --date=short --decorate=full -1000 | ./scripts/log2changes.pl > CHANGES.dist

echo "generate patch set from ${major}.${minor}.${patch}"
git diff curl-${major}_${minor}_${patch} >$CURL-${major}.${minor}.${patch}.patch.dist

############################################################################
#
# Now run make dist to generate a tar.gz archive
#

echo "make dist"
targz="$CURL-$version.tar.gz"
make -sj dist VERSION=$version PACKAGE="$CURL"

############################################################################
#
# Now make a bz2 archive from the tar.gz original
#

bzip2="$CURL-$version.tar.bz2"
echo "Generating $bzip2"
gzip -dc $targz | bzip2 --best > $bzip2

############################################################################
#
# Now make an xz archive from the tar.gz original
#

xz="$CURL-$version.tar.xz"
echo "Generating $xz"
gzip -dc $targz | xz -6e - > $xz

############################################################################
#
# Now make a zip archive from the tar.gz original
#
makezip() {
  rm -rf $tempdir
  mkdir $tempdir
  cd $tempdir
  gzip -dc ../$targz | tar -xf -
  find . | zip $zip -@ >/dev/null
  mv $zip ../
  cd ..
  rm -rf $tempdir
}

zip="$CURL-$version.zip"
echo "Generating $zip"
tempdir=".builddir"
makezip

echo "------------------"
echo "maketgz $CURL report:"
echo ""
ls -l $targz $bzip2 $zip $xz

echo "Run this:"
echo "gpg -b -a $targz && gpg -b -a $bzip2 && gpg -b -a $zip && gpg -b -a $xz"
