#! /bin/sh

# Bootstrap this package from CVS.

# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

# Written by Paul Eggert.

nl='
'

# Ensure file names are sorted consistently across platforms.
# Also, ensure diagnostics are in English, e.g., "wget --help" below.
LC_ALL=C
export LC_ALL

usage() {
  echo >&2 "\
Usage: $0 [OPTION]...
Bootstrap this package from the CVS sources.

Options:
 --gnulib-srcdir=DIRNAME  Specify the local directory where gnulib
                          sources reside.  Use this if you already
                          have gnulib sources on your machine, and
                          do not want to waste your bandwidth dowloading
                          them again.
 --force                  Bootstrap even if the sources didn't come from CVS.
 --skip-po                Do not download po files.
 --cvs-user=USERNAME      Set the CVS username to be used when accessing
                          the gnulib repository.

If the file .bootstrap.conf exists in the current working directory, its
contents are read as shell variables to configure the bootstrap.

Running without arguments will suffice in most cases.
"
}

# Configuration.

# List of gnulib modules needed.
gnulib_modules=

# Any gnulib files needed that are not in modules.
gnulib_files=

# Translation Project URL, for the registry of all projects
# and for the translation-team master directory.
TP_URL='http://www.iro.umontreal.ca/translation/registry.cgi?domain='
TP_PO_URL='http://www.iro.umontreal.ca/translation/teams/PO/'

extract_package_name='
  /^AC_INIT(/{
     /.*,.*,.*,/{
       s///
       s/[][]//g
       p
       q
     }
     s/AC_INIT(\[*//
     s/]*,.*//
     s/^GNU //
     y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
     s/[^A-Za-z0-9_]/-/g
     p
  }
'
package=`sed -n "$extract_package_name" configure.ac` || exit

# Extra files from gnulib, which override files from other sources.
gnulib_extra_files='
	build-aux/install-sh
	build-aux/missing
	build-aux/mdate-sh
	build-aux/texinfo.tex
	build-aux/depcomp
	build-aux/config.guess
	build-aux/config.sub
	doc/INSTALL
'

# Other locale categories that need message catalogs.
EXTRA_LOCALE_CATEGORIES=

# Additional xgettext options to use.  Use "\\\newline" to break lines.
XGETTEXT_OPTIONS='\\\
 --flag=_:1:pass-c-format\\\
 --flag=N_:1:pass-c-format\\\
 --flag=error:3:c-format --flag=error_at_line:5:c-format\\\
'

# Files we don't want to import.
excluded_files=

# File that should exist with CVS checkout, but not with
# the distributed version.
CVS_only_file=CVS

# Override the default configuration, if necessary.
test -r bootstrap.conf && . ./bootstrap.conf

# Translate configuration into internal form.

# Parse options.

for option
do
  case $option in
  --help)
    usage
    exit;;
  --gnulib-srcdir=*)
    GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
  --cvs-user=*)
    CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
  --skip-po)
    SKIP_PO=t;;
  --force)
    CVS_only_file=;;
  *)
    echo >&2 "$0: $option: unknown option"
    exit 1;;
  esac
done

if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
  echo "$0: Bootstrapping from a non-CVS distribution is a bit risky." >&2
  exit 1
fi

echo "$0: Bootstrapping CVS $package..."

cleanup_gnulib() {
  status=$?
  rm -fr gnulib
  exit $status
}

# Get gnulib files.

case ${GNULIB_SRCDIR--} in
-)
  if [ ! -d gnulib ]; then
    echo "$0: getting gnulib files..."

    case ${CVS_AUTH-pserver} in
    pserver)
      CVS_PREFIX=':pserver:anonymous@';;
    ssh)
      CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
    *)
      echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
      exit 1;;
    esac

    case $CVS_RSH in
    '') CVS_RSH=ssh; export CVS_RSH;;
    esac

    trap cleanup_gnulib 1 2 13 15

    cvs -z3 -q -d ${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/gnulib co gnulib ||
      cleanup_gnulib

    trap - 1 2 13 15
  fi
  GNULIB_SRCDIR=gnulib
esac

gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
<$gnulib_tool || exit

# Get translations.

get_translations() {
  subdir=$1
  domain=$2

  case $WGET_COMMAND in
  '')
    echo "$0: wget not available; skipping translations";;
  ?*)
    echo "$0: getting translations into $subdir for $domain..." &&

    (cd $subdir && rm -f dummy `ls | sed -n '/\.gmo$/p; /\.po/p'`) &&
    $WGET_COMMAND -O "$subdir/$domain.html" "$TP_URL$domain" &&

    sed -n 's|.*"http://[^"]*/translation/teams/PO/\([^/"]*\)/'"$domain"'-\([^/"]*\)\.[^."]*\.po".*|\1.\2|p' <"$subdir/$domain.html" |
    sort -k 1,1 -k 2,2n -k2,2 -k3,3n -k3,3 -k4,4n -k4,4 -k5,5n -k5.5 |
    awk -F. '
      { if (lang && $1 != lang) print lang, ver }
      { lang = $1; ver = substr($0, index($0, ".") + 1) }
      END { if (lang) print lang, ver }
    ' | awk -v domain="$domain" -v subdir="$subdir" '
      {
	lang = $1
	ver = $2
	urlfmt = ""
	printf "{ $WGET_COMMAND -O %s/%s.po '\'"$TP_PO_URL"'/%s/%s-%s.%s.po'\'' &&\n", subdir, lang, lang, domain, ver, lang
	printf "  msgfmt -c -o /dev/null %s/%s.po || {\n", subdir, lang
	printf "    echo >&2 '\'"$0"': omitting translation for %s'\''\n", lang
	printf "    rm -f %s/%s.po; }; } &&\n", subdir, lang
      }
      END { print ":" }
    ' | WGET_COMMAND="$WGET_COMMAND" sh;;
  esac &&
  ls "$subdir"/*.po 2>/dev/null |
    sed 's|.*/||; s|\.po$||' >"$subdir/LINGUAS" &&
  rm -f "$subdir/$domain.html"
}

case $SKIP_PO in
'')
  case `wget --help` in
  *'--no-cache'*)
    WGET_COMMAND='wget -nv --no-cache';;
  *'--cache=on/off'*)
    WGET_COMMAND='wget -nv --cache=off';;
  *'--non-verbose'*)
    WGET_COMMAND='wget -nv';;
  *)
    WGET_COMMAND='';;
  esac

  get_translations po $package || exit

  if test -d runtime-po; then
    get_translations runtime-po $package-runtime || exit
  fi;;
esac

symlink_to_gnulib()
{
  src=$GNULIB_SRCDIR/$1
  dst=${2-$1}
  dot_dots=

  case $src in
  /*) ;;
  *)
    case /$dst/ in
    *//* | */../* | */./* | /*/*/*/*/*/)
       echo >&2 "$0: invalid symlink calculation: $src -> $dst"
       exit 1;;
    /*/*/*/*/)	dot_dots=../../../;;
    /*/*/*/)	dot_dots=../../;;
    /*/*/)	dot_dots=../;;
    esac;;
  esac

  test -f "$src" && {
    test -h "$dst" &&
    src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
    dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
    test "$src_i" = "$dst_i" || {
      echo "$0: ln -fs $dot_dots$src $dst" &&
      ln -fs "$dot_dots$src" "$dst"
    }
  }
}

cp_mark_as_generated()
{
  cp_src=$1
  cp_dst=$2

  if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
    symlink_to_gnulib "$cp_dst"
  else
    case $cp_dst in
      *.[ch])             c1='/* '; c2=' */';;
      *.texi)             c1='@c '; c2=     ;;
      *.m4|*/Make*|Make*) c1='# ' ; c2=     ;;
      *)                  c1=     ; c2=     ;;
    esac

    if test -z "$c1"; then
      cmp -s "$cp_src" "$cp_dst" || {
	echo "$0: cp -f $cp_src $cp_dst" &&
	cp -f "$cp_src" "$cp_dst"
      }
    else
      # Copy the file first to get proper permissions if it
      # doesn't already exist.  Then overwrite the copy.
      cp "$cp_src" "$cp_dst-t" &&
      (
	echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
	echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
	cat "$cp_src"
      ) > $cp_dst-t &&
      if cmp -s "$cp_dst-t" "$cp_dst"; then
	rm -f "$cp_dst-t"
      else
	echo "$0: cp $cp_src $cp_dst # with edits" &&
	mv -f "$cp_dst-t" "$cp_dst"
      fi
    fi
  fi
}

slurp() {
  for dir in . `(cd $1 && find * -type d -print)`; do
    copied=
    sep=
    for file in `ls $1/$dir`; do
      test -d $1/$dir/$file && continue
      for excluded_file in $excluded_files; do
	test "$dir/$file" = "$excluded_file" && continue 2
      done
      if test $file = Makefile.am; then
        copied=$copied${sep}gnulib.mk; sep=$nl
	remove_intl='/^[^#].*\/intl/s/^/#/'
	no_dep=no-dependencies
	remove_no_dep="/^AUTOMAKE_OPTIONS =.* $no_dep/s/ $no_dep//"
	sed_xform="$remove_intl;$remove_no_dep"
        sed "$sed_xform" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
	  echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
	  rm -f $dir/gnulib.mk &&
	  sed "$sed_xform" $1/$dir/$file >$dir/gnulib.mk
	}
      elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
	   grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
	     grep -q '^/[^/]*/[0-9]'; then
	echo "$0: $dir/$file overrides $1/$dir/$file"
      else
	copied=$copied$sep$file; sep=$nl
	if test $file = gettext.m4; then
	  echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
	  rm -f $dir/$file
	  sed '
	    /^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
	      AC_DEFUN([AM_INTL_SUBDIR], [
	    /^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
	      AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
	    $a\
	      AC_DEFUN([gl_LOCK_EARLY], [])
	  ' $1/$dir/$file >$dir/$file
	else
	  cp_mark_as_generated $1/$dir/$file $dir/$file
	fi
      fi || exit
    done

    ig=$dir/.cvsignore
    if test -n "$copied" && test -f $ig; then
      echo "$copied" | sort -u - $ig | cmp -s - $ig ||
      echo "$copied" | sort -u - $ig -o $ig || exit
    fi
  done
}


# Create boot temporary directories to import from gnulib and gettext.

bt='.#bootmp'
bt2=${bt}2
rm -fr $bt $bt2 &&
mkdir $bt $bt2 || exit

# Import from gnulib.

gnulib_tool_options="\
 --import\
 --no-changelog\
 --aux-dir $bt/build-aux\
 --doc-base $bt/doc\
 --lib lib$package\
 --m4-base $bt/m4/\
 --source-base $bt/lib/\
 --tests-base $bt/tests\
 --local-dir gl\
"
echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
slurp $bt || exit

for file in $gnulib_files; do
  symlink_to_gnulib $file || exit
done


# Import from gettext.

echo "$0: (cd $bt2; autopoint) ..."
cp configure.ac $bt2 &&
(cd $bt2 && autopoint && rm configure.ac) &&
slurp $bt2 $bt || exit

rm -fr $bt $bt2 || exit


# Reconfigure, getting other files.

for command in \
  'aclocal --force -I m4' \
  'autoconf --force' \
  'autoheader --force' \
  'automake --add-missing --copy --force-missing';
do
  echo "$0: $command ..."
  $command || exit
done


# Get some extra files from gnulib, overriding existing files.

for file in $gnulib_extra_files; do
  case $file in
  */INSTALL) dst=INSTALL;;
  *) dst=$file;;
  esac
  symlink_to_gnulib $file $dst || exit
done


# Create gettext configuration.
echo "$0: Creating po/Makevars from po/Makevars.template ..."
rm -f po/Makevars
sed '
  /^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
  /^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
  /^XGETTEXT_OPTIONS *=/{
    s/$/ \\/
    a\
	'"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
  }
' po/Makevars.template >po/Makevars

if test -d runtime-po; then
  # Likewise for runtime-po/Makevars, except also change a few other parameters.
  rm -f runtime-po/Makevars
  sed '
    s/^\(DOMAIN\) *=.*/\1 = '"$package"'-runtime/
    s/^\(subdir\) *=.*/\1 = runtime-po/
    s/^\(XGETTEXT_OPTIONS\) *=.*/\1 = '"$XGETTEXT_OPTIONS_RUNTIME"'/
  ' <po/Makevars >runtime-po/Makevars

  # Copy identical files from po to runtime-po.
  (cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
fi

echo "$0: done.  Now you can run './configure'."
