#!/bin/sh
#
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
#
#
# Usage:
# ./po-update.sh pot
#   - to generate just the pot file
# ./po-update.sh
#   - to update all locales
# ./po-update.sh LL
#   - to update one the LL locale

set -e

XGETTEXT=${XGETTEXT:-xgettext}
MSGMERGE=${MSGMERGE:-msgmerge}

svn_base=
for i in . .. ../..; do
  if [ -d "$i/subversion/po" ]; then
    svn_base="$i"
    break
  fi
done
if [ -z "$svn_base" ]; then
  echo "E: You must run po-update.sh from within a Subversion source tree." >&2
  exit 1
fi

pot_done=

make_pot()
{
  if [ -z "$pot_done" ]; then
    echo "Building subversion.pot..."
    (cd $svn_base/subversion/po && \
    find .. \
    -name .svn -prune -or \
    -name tests -prune -or \
    -name bindings -prune -or \
    -name "*.c" -print -or \
    -name "svn_error_codes.h" -print -or \
    -name "svn_fs_util.h" -print | \
    $XGETTEXT --sort-by-file -k_ -kN_ -kQ_:1,2 -kSVN_ERRDEF:3 \
    --flag=_:1:pass-c-format \
    --flag=N_:1:pass-c-format \
    --flag=Q_:1:pass-c-format \
    --flag=Q_:2:pass-c-format \
    --flag=svn_cmdline_printf:2:c-format \
    --flag=svn_cmdline_fprintf:3:c-format \
    --flag=svn_error_createf:3:c-format \
    --flag=svn_error_wrap_apr:2:c-format \
    --flag=svn_stream_printf:3:c-format \
    --flag=svn_stream_printf_from_utf8:4:c-format \
    --flag=svn_string_createf:2:c-format \
    --flag=svn_string_createv:2:c-format \
    --flag=svn_stringbuf_createf:2:c-format \
    --flag=svn_stringbuf_createv:2:c-format \
    --flag=svn_fs_bdb__dberrf:3:c-format \
    --flag=file_printf_from_utf8:3:c-format \
    --flag=do_io_file_wrapper_cleanup:3:c-format \
    --flag=do_io_file_wrapper_cleanup:4:c-format \
    --msgid-bugs-address=dev@subversion.apache.org \
    --add-comments --files-from=- -o subversion.pot )
    pot_done=1
  fi
}

update_po()
{
  (cd $svn_base/subversion/po &&
  for i in $1.po; do
    echo "Updating $i..."
    # In a display of truly bizarre behaviour, msgmerge (at least, the
    # GNU gettext-tools 0.14.6 implementation) inverts the order of obsolete
    # messages every time it is run. Therefore, run it twice, to invert and
    # then re-invert, to minimize spurious diffs.
    $MSGMERGE --sort-by-file --no-wrap --update $i subversion.pot
    $MSGMERGE --sort-by-file --no-wrap --update $i subversion.pot
  done )
}

if [ $# -eq 0 ]; then
  make_pot
  update_po \*
else
  langs=
  while [ $# -ge 1 ]; do
    case $1 in
      pot) ;;
      *)
      if [ -e $svn_base/subversion/po/$1.po ]; then
        langs="$langs $1"
      else
        echo "E: No such .po file '$1.po'" >&2
        exit 1
      fi
    esac
    shift
  done
  make_pot
  for lang in $langs; do
    update_po $lang
  done
fi
