#!/bin/sh
#
# Copyright (C) 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

set -e
cd dist-w32

tmp="`echo $0 | sed 's,.*gnupg-\([^/]*\)/.*,\1,'`"

topdir=
bindir=..

if [ -f "../gnupg-$tmp/README" ]; then
    srcdir="../gnupg-$tmp"
    bindir="../gnupg-$tmp"
    topdir=".."
elif [ -f ../README ]; then
    srcdir=..
elif [ -f ../../README ]; then
    srcdir=../..
    bindir=..
elif [ -f ../../gnupg-stable/README ]; then
    srcdir=../../gnupg-stable
elif [ -f ../../../gnupg-stable/README ]; then
    srcdir=../../../gnupg-stable
else
    echo "cannot figure out the source dir" >&2
    exit 1
fi

# Windows uses an internal build number.  We use the last day of the
# year concatenated with the hour. for it.  If it happens that a new
# release of the same version is to be made in the next year, the
# build number must be given manually by adding the appropriate number
# of days.
if [ "$1" = "--build-number" -a -n "$2" ]; then
   build_number="$2"
   shift 
   shift
else
   build_number=$(date -u '+%j%k' | sed 's/^0*\(.*\)/\1/')
fi


if i586-mingw32msvc-strip --version >/dev/null 2>&1 ; then
   STRIP=i586-mingw32msvc-strip
else
   STRIP="mingw32 strip"
fi

# If we don't have an installer we don't need to prepare for it.
if ! makensis -version >/dev/null 2>&1 ; then
    topdir=
fi


# A function to return a plain ASCII (or Latin-1) encoded description
# text for a language identifier.  We need this to display the list of
# available languages in the installer.  NSIS does not support utf-8
# so we need to standardize on one character set.  Note that this
# script itself is written in utf-8 but the resulting file will get
# converted to Latin-1
get_langname () {
    case "$1" in
        be)    r="Belarusian"; ;;
        ca)    r="Català"; ;;
        cs)    r="Cesky"; ;;
        da)    r="Danish"; ;;
        de)    r="Deutsch"; ;;
        el)    r="Greek"; ;;
        en|en@*)  r="English"; ;;
        eo)    r="Esperanto"; ;;
        es)    r="Español"; ;;
        et)    r="Eesti keel"; ;;
        fi)    r="Suomi"; ;;
        fr)    r="Français"; ;;
        gl)    r="Galician"; ;;
        hu)    r="Magyar"; ;;
        id)    r="Indonesian"; ;;
        it)    r="Italiano"; ;;
        ja)    r="Japanese"; ;;
        pl)    r="Polski"; ;;
        pt)    r="Português"; ;;
        pt_BR) r="Português (do Brasil)"; ;;
        ro)    r="Romana"; ;;
        ru)    r="Russian"; ;;
        sk)    r="Slovensky"; ;;
        sv)    r="Svenska"; ;;
        tr)    r="Türkçe"; ;;
        zh_CN) r="Chinese (simplified)"; ;;
        zh_TW) r="Chinese (traditional)"; ;;

        *) r="" ;;
    esac
    echo "$r"
}


# Figure out the version
version=$(sed -n 's/^#[ ]*define[ ][ ]*VERSION[ ][ ]*\"\([0-9.a-z-]*\)\"/\1/p' $bindir/config.h)
prod_version=$(echo "$version"|awk -F'[^0-9]' '{print $1 "." $2 "." $3 }')
prod_version="${prod_version}.${build_number}"
echo "building version $version ($prod_version)"

rm * >/dev/null 2>/dev/null || true

cp ${bindir}/g10/gpg.exe gpg.exe
$STRIP gpg.exe
cp ${bindir}/g10/gpgv.exe gpgv.exe
$STRIP gpgv.exe
for name in hkp http ldap finger; do 
  cp ${bindir}/keyserver/gpgkeys_$name.exe gpgkeys_$name.exe
  $STRIP gpgkeys_$name.exe
done
cp ${bindir}/tools/gpgsplit.exe gpgsplit.exe
$STRIP gpgsplit.exe

for i in FAQ; do
  cp ${bindir}/doc/$i $i.txt
  todos $i.txt
done
man -Tlatin1 -l ${srcdir}/doc/gpg.1 | sed `printf "s/\b.//g"`  >gpg.man
todos gpg.man
man -Tlatin1 -l ${srcdir}/doc/gpgv.1 | sed `printf "s/\b.//g"`  >gpgv.man
todos gpgv.man
man -Tlatin1 -l ${srcdir}/doc/gnupg.7 | sed `printf "s/\b.//g"`  >gnupg.man
todos gnupg.man
for i in README COPYING NEWS; do
  cp ${srcdir}/$i $i.txt
  todos $i.txt
done

cp ${srcdir}/doc/README.W32 README-W32.txt
todos README-W32.txt

patches_defs=
for i in `find "$topdir/patches" -type f -name '*.diff'`; do
  cp $i .
  patches_defs="-DWITH_PATCHES"
done


# We must distribute the MO files in UTF-8, the conversion is done by
# gpg at runtime.  To include English at the right position in the list we 
# need a special case.
langlist=""
langdesclist=""
for i in `(ls ${srcdir}/po/*.po; echo ${srcdir}/po/en.po) | sort`; do
   lang=$(basename $i .po)
   if [ $lang != "en" ]; then
       grep -s $lang ${srcdir}/po/LINGUAS >/dev/null || continue
       [ -f$lang.mo -a $lang.mo -nt $i ] && continue
    
       fromset=`sed -n '/^"Content-Type:/ s/.*charset=\([a-zA-Z0-9_-]*\).*/\1/p' $i`
       case "$fromset" in 
         utf8|utf-8|UTF8|UTF-8) 
           echo "$lang: keeping $fromset" >&2 
           msgfmt --output-file=$lang.mo $i
           ;;
         *)
           echo "$lang: converting from $fromset to utf-8" >&2 
           iconv --silent --from-code=$fromset --to-code=utf-8 < $i | \
             sed "/^\"Content-Type:/ s/charset=[a-zA-Z0-9_-]*/charset=utf-8/"|\
             msgfmt --output-file=$lang.mo -
           ;;
       esac
   fi
   langlist="$langlist $lang"
   langname="`get_langname $lang`"
   [ -n "$langdesclist" ] && langdesclist="${langdesclist}|"
   langdesclist="${langdesclist}${lang} - ${langname}"
done


# Create the option file for use with the NSIS installer.
cat <<EOF | iconv --silent --from-code=utf-8 --to-code=latin1 >opt.ini
[Settings]
NumFields=1

[Field 1]
Type=DropList
Left=0
Right=130
Top=20
Bottom=100
ListItems="$langdesclist"
EOF


# If we have a topdir, assume the full build environment and 
# prepare the installer
if [ -n "$topdir" ]; then
  winpt_defs=
  src_defs=
  buildinfo="`date -u '+%Y-%m-%d %H:%M UTC'`"

  # iconv.dll is a hard requirement
  if [ ! -f "$topdir/iconv/iconv.dll" ]; then
    echo "iconv.dll not available" >&2
    exit 1
  fi
  ln "$topdir/iconv/iconv.dll" iconv.dll
  for i in COPYING.LIB README.iconv; do
     cp ${topdir}/iconv/$i $i.txt
     todos $i.txt
  done
  
  # WinPT is optional
  if [ -f "$topdir/winpt/WinPT.exe" ]; then
     ln "$topdir/winpt/WinPT.exe"      WinPT.exe
     ln "$topdir/winpt/PTD.dll"        PTD.dll
     cp "$topdir/winpt/README-0.9.txt" README.winpt.txt
     cp "$topdir/winpt/NEWS-0.9.txt"   NEWS.winpt.txt
     cp "$topdir/winpt/keyserver.conf" keyserver.conf
     winpt_defs="-DWITH_WINPT"
  fi

  # See whether we should include the source and figure out the
  # version numbers of the source files.
  if [ -d "$topdir/tarballs" ]; then
    have_gnupg_src=no
    have_libiconv_src=no
    have_winpt_src=no
    for i in `find "$topdir/tarballs" -type f -name '*.tar.gz'`; do
       fname=$(basename "$i" .gz)
       zcat "$i" > "$fname"
       case "$fname" in
           gnupg-*)
               tmp=$(echo "$fname" | \
                     sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p')
               echo "gnupg source version is $tmp" >&2
               if [ "$version" != "$tmp" ]; then
                   echo "gnupg source version does not match" >&2
                   exit 1
               fi
               have_gnupg_src=yes
               ;;
           libiconv-*)
               tmp=$(echo "$fname" | \
                     sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p')
               echo "libiconv source version is $tmp" >&2
               src_defs="$src_defs -DLIBICONV_VERSION=$tmp"
               have_libiconv_src=yes
               ;;
           winpt-*)
               tmp=$(echo "$fname" | \
                     sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p')
               echo "winpt source version is $tmp" >&2
               src_defs="$src_defs -DWINPT_VERSION=$tmp"
               have_winpt_src=yes
               ;;
               
           *) 
               echo "WARNING: unknown source file $fname ignored" >&2
               ;;
       esac
    done
    if [ -n "$src_defs" ]; then
        if [ $have_gnupg_src = "no" ]; then
            echo "gnupg source missing" >&2
            exit 1
        fi
        if [ $have_libiconv_src = "no" ]; then
            echo "libiconv source missing" >&2
            exit 1
        fi
        if [ -n "$winpt_defs" ]; then
            if [ $have_winpt_src = "no" ]; then
                echo "winpt source missing" >&2
                exit 1
            fi
        fi

        src_defs="$src_defs -DWITH_SOURCE"
    fi

  fi

  # Now run the installer
  echo "invoking installer as:"
  echo makensis -v0  -nocd -DVERSION="${version}" \
           -DPROD_VERSION="${prod_version}" \
           -DGNUPG_SRCDIR="${srcdir}" ${winpt_defs} ${src_defs} \
           ${patches_defs} ${srcdir}/scripts/w32installer.nsi
  BUILDINFO=$buildinfo makensis -v0 -nocd -DVERSION="${version}" \
           -DPROD_VERSION="${prod_version}" \
           -DGNUPG_SRCDIR="${srcdir}" ${winpt_defs} ${src_defs} \
           ${patches_defs} ${srcdir}/scripts/w32installer.nsi
  echo "Installer created" >&2
else
  zip -9 "gnupg-w32cli-${version}.zip" *
  echo "ZIP archive created" >&2
fi