#!/bin/bash -e

if ! [ "$1" ]
then
   echo "usage: $0 <version>"
   exit 1
fi

if ! [ -d ".git" ]
then
   echo "Should be run from the LuaRocks git repo dir."
   exit 1
fi

make clean || exit 1

if [ "$1" != "dev" ]
then

ROCKSPEC="luarocks-$1-1.rockspec"

[ -e "$ROCKSPEC" ] || {
   echo
   echo "$ROCKSPEC is missing. Please check rockspec version is correct."
}

grep -q "LuaRocks version $1" "configure" || {
   echo
   echo "version in configure is incorrect. Please fix it."
   exit 1
}

grep -q "\"$1-1\"" "$ROCKSPEC" || {
   echo
   echo "version in rockspec is incorrect. Please fix it."
   exit 1
}

grep -q "program_version = \"$1\"" src/luarocks/core/cfg.lua || {
   echo
   echo "program_version in src/luarocks/core/cfg.lua is incorrect. Please fix it."
   exit 1
}

grep -q "version: $1\\." appveyor.yml || {
   echo
   echo "version in appveyor.yml is incorrect. Please fix it."
   exit 1
}

grep -q "LUAROCKS_VER: $1" appveyor.yml || {
   echo
   echo "LUAROCKS_VER in appveyor.yml is incorrect. Please fix it."
   exit 1
}

# e.g. if $1 is "2.3.0", $program_series is "2.3"
program_series=${1%.*}

grep -q "program_series = \"$program_series\"" src/luarocks/core/cfg.lua || {
   echo
   echo "program_series in src/luarocks/core/cfg.lua is incorrect. Please fix it."
   exit 1
}

grep -q "vars.VERSION = \"$program_series\"" install.bat || {
   echo
   echo "vars.VERSION in install.bat is incorrect. Please fix it."
   exit 1
}

fi

out="luarocks-$1"
rm -rf "$out"
mkdir "$out"

shift

git ls-files | while read i
do
   if [ -f "$i" ]
   then
      dir=`dirname $i`
      mkdir -p "$out/$dir"
      cp "$i" "$out/$dir"
   fi
done

rm -rf "release-unix" "release-windows" "$out.tar.gz" "$out-win32.zip"

mkdir "release-unix"
cp -a "$out" "release-unix"
mkdir "release-windows"
mv "$out" "release-windows/$out-win32"

cd "release-unix/$out"
rm -rf makedist install.bat win32 .travis.yml .gitignore appveyor* .appveyor
cd ..
tar czvpf ../"$out.tar.gz" "$out"
rm -f ../"$out.tar.gz.asc"
cd ..
rm -rf "release-unix"

cd "release-windows/$out-win32"
rm -rf makedist Makefile GNUmakefile configure .travis.yml .gitignore test appveyor* .appveyor
cd ..
zip -r ../"$out-win32.zip" "$out-win32"
rm -f ../"$out-win32.zip.asc"
cd ..
rm -rf "release-windows"

if [ "$1" = "binary" ]
then
   shift

   ./configure

   make binary
   cd build-binary
   mkdir "$out-linux-x86_64"
   cp luarocks.exe "$out-linux-x86_64/luarocks"
   cp luarocks-admin.exe "$out-linux-x86_64/luarocks-admin"
   zip "../$out-linux-x86_64.zip" "$out-linux-x86_64"/*
   cd ..
   rm -f "$out-linux-x86_64.zip.asc"

   make windows-binary
   cd build-windows-binary
   mkdir "$out-windows-32"
   cp luarocks.exe "$out-windows-32/luarocks.exe"
   cp luarocks-admin.exe "$out-windows-32/luarocks-admin.exe"
   zip "../$out-windows-32.zip" "$out-windows-32"/*
   cd ..
   rm -f "$out-windows-32.zip.asc"

fi

if [ "$1" = "sign" ]
then
   shift

   for f in \
      $out-windows-32.zip \
      $out-linux-x86_64.zip \
      $out-win32.zip \
      $out.tar.gz
   do
      [ -e "$f" -a ! -e "$f.asc" ] && gpg --armor --output "$f.asc" --detach-sign "$f"
   done
fi