#!/bin/sh
#
# Copyright (C) 2000-2020 Kern Sibbald
# License: BSD 2-Clause; see file LICENSE-FOSS
#
# This script is used to make a Bacula release
#   bacula
#   regress
#   gui
# It writes in the current directory, so we recommend that you
#  do not run it in the Bacula source or Git directory, but
#  in a special release directory.
#
# Commit all changes, update the language files,
#    export the release, make a release tar.
#
# source config
. ./config

tagbase=Release-
base_dir=bacula
base_pkg=bacula

remote=$2
branch=$3
ver=$4

if [ $# != 4 ] ; then
  echo "Need $0 <source-directory> <remote-name> <branch> <version>"
  echo "e.g. $0 release-source bee Branch-4.0 4.0.3"
  exit 1
fi
cd $1
if [ $? -ne 0 ]; then
   echo "Directory: $1 does not exist"
   exit 1
fi
src=`pwd`
current=`git branch | awk '/*/ { print $2 }'`
cd $base_dir
if [ $?  -ne 0 ]; then
   echo "Directory: $1 does not exist"
   exit 1
fi
if [ "$current" != "$branch" ]; then
    echo "Checkout branch=${branch} src=${src}"
    git checkout ${branch}
fi

if [ $dopull != 0 ]; then 
    git pull ${remote} ${branch}
    if [ $? -ne 0 ]; then
        echo "Checkout of branch ${branch} failed."
        exit 1
    fi
fi

sha=`git rev-parse --short HEAD`

fulltag=$tagbase$ver
echo " "
echo "Making $reltype for $base_pkg-$ver ..."
echo " "
#echo "OK?  ctl-c to stop"
#read a
rm -rf Release-$ver
if [ $repo = "release" ] ; then
   cd src
   cp -fp version.h 1
   sed 's%^#define DEVELOPER 1%/* #define DEVELOPER 1 */%g' 1 >version.h
   rm -f 1
   cd ..
fi
if [ a$updatepo != ano ]; then
   ./configure --enable-client-only
   cd po
   make update-po
   cd ${src}
fi

bdate=`date "+%d %B %Y"`
lsmdate=`date +%d%b%y`
sed -i "s/#define BDATE .*/#define BDATE \"$bdate\"/" $src/bacula/src/version.h
sed -i "s/#define LSMDATE .*/#define LSMDATE \"$lsmdate\"/" $src/bacula/src/version.h

# Generate ChangeLog
if [ $repo != "release" ]; then
    cd $cwd
    ./makereleasenotes Release-${ver}..HEAD | awk '/============================/ { exit } { print }' > $cwd/1
    cat $src/bacula/ChangeLog >> $cwd/1
    cp -f $cwd/1 $src/bacula/ChangeLog
    cd $src
fi

# Generate a file with the different SHA for each repo
PKG=BACULA
pkg=bacula

echo "#define ${PKG}_SHA \"$sha\"" >> $cwd/$PKG.sha
echo "#define ${PKG}_STR \"$pkg\"" >> $cwd/$PKG.sha
echo $PKG >> $cwd/pkg.list

cat bacula/src/c > bacula/src/git_version.h
echo "/* File generated by release process. Do not edit. $bdate */" >> bacula/src/git_version.h
echo "#define BACULA_RELTYPE \"$repo\"" >> bacula/src/git_version.h

sort $cwd/pkg.list > $cwd/pkg.list.sorted

while read PKG
do
    cat $cwd/$PKG.sha >> bacula/src/git_version.h
done < $cwd/pkg.list.sorted

echo "git_repo git_info[] = {" >> bacula/src/git_version.h
while read PKG
do
    echo "   {${PKG}_STR, ${PKG}_SHA}," >> bacula/src/git_version.h
done < $cwd/pkg.list.sorted

echo "{NULL, NULL}" >> bacula/src/git_version.h
echo "};"           >> bacula/src/git_version.h

git add bacula/src/git_version.h

git commit -am "Update changelog and version"

git tag -d ${fulltag}
echo "Creating new tag -- $fulltag"
git tag $fulltag
if [ $? != 0 ] ; then
  echo " "
  echo "Non-zero return status from Git"
  echo " "
  exit 1
fi
echo "Create Tag $fulltag done"
cd ${cwd}
rm -rf $base_pkg-$ver $base_pkg-$ver.tar.gz $base_pkg-$ver.tar.gz.sig
rm -rf $fulltag
cd ${src}
git archive --format=tar --prefix=$base_pkg-$ver/ $fulltag | gzip >${cwd}/$base_pkg-$ver.tar.gz

if [ $? != 0 ] ; then
  echo " "
  echo "Non-zero return status from Git"
  echo " "
  exit 1
fi
echo "Exported release into ${cwd}/$base_pkg-$ver.tar.gz"
cd ${cwd}
tar xfz $base_pkg-$ver.tar.gz
# First remove Enterprise Win32 plugin source
cd $base_pkg-$ver/bacula
cp -fp ReleaseNotes ChangeLog src/version.h ${cwd}/
cp -fp LICENSE* ${cwd}/
grep -R -a "Copyright.*Bacula Systems" *
if [ $? != 0 ] ; then
  echo "error: !!!!! Bacula Systems Copyrights detected !!!!!"
  exit
fi

cd ${cwd}/$base_pkg-$ver
# Move directories to release names including version
mv bacula $base_pkg-$ver
mv gui $base_pkg-gui-$ver
mv regress $base_pkg-regress-$ver
# Tar each component individually
tar cfz ../$base_pkg-$ver.tar.gz $base_pkg-$ver
tar cfz ../$base_pkg-gui-$ver.tar.gz $base_pkg-gui-$ver
tar cfz ../$base_pkg-regress-$ver.tar.gz $base_pkg-regress-$ver
cd ..
rm -rf $base_pkg-$ver
./sign $base_pkg-$ver.tar.gz
./sign $base_pkg-gui-$ver.tar.gz
./sign $base_pkg-regress-$ver.tar.gz

if [ a$push != ano ]; then
   cd ${src}
   git push ${remote} ${branch}
   git push ${remote} tag ${fulltag}
   echo "Pushed ${remote} and push tag ${fulltag}"
fi

cd ${src}
git checkout ${current}
