#!/bin/sh
#findlang - automagically generate list of language specific files
#for inclusion in an rpm spec file.
#This does assume that the *.mo files are under .../share/locale/...
#Run with no arguments gets a usage message.

#findlang is copyright (c) 1998 by W. L. Estes <wlestes@uncg.edu>

#Redistribution and use of this software are hereby permitted for any
#purpose as long as this notice and the above copyright notice remain
#in tact and are included with any redistribution of this file or any
#work based on this file.

#changes:
# $Id: rpm-find-lang,v 1.23 2007-09-25 06:07:06 glen Exp $
# 2006-08-28 Elan Ruusame <glen@pld-linux.org>
#   * fixed --all-name which got broken with last change.
# 2006-08-09 Elan Ruusame <glen@pld-linux.org>
#   * huge performance boost for packages calling %find_lang multiple times (kde*i18n)
# 2001-01-08 Micha Kochanowicz <mkochano@pld.org.pl>
#   * --all-name support for KDE.
# 2000-11-28 Rafa Cygnarowski <pascalek@pld.org.pl>
#   * next simple rule for KDE
# 2000-11-12 Rafa Cygnarowski <pascalek@pld.org.pl>
#   * simple rules for KDE help files
# 2000-06-05 Micha Kochanowicz <mkochano@pld.org.pl>
#   * exact, not substring matching $NAME, i.e. find-lang top_dir NAME will
#     no longer find /usr/share/locale/pl/LC_MESSAGES/<anything>NAME.mo.
# 2000-04-17 Arkadiusz Mikiewicz <misiek@pld.org.pl>
#   * exit 1 when no files found
# 1999-10-19 Artur Frysiak <wiget@pld.org.pl>
#   * added support for GNOME help files
#   * start support for KDE help files

PROG=${0##*/}

usage () {
cat <<EOF

Usage: $PROG TOP_DIR PACKAGE_NAME [prefix]

where TOP_DIR is
the top of the tree containing the files to be processed--should be
\$RPM_BUILD_ROOT usually. TOP_DIR gets sed'd out of the output list.
PACKAGE_NAME is the %{name} of the package. This should also be
the basename of the .mo files.  the output is written to
PACKAGE_NAME.lang unless \$3 is given in which case output is written
to \$3.
Additional options:
  --with-gnome		find GNOME help files
  --with-kde		find KDE help files
  --with-omf		find OMF files
  --all-name		match all package/domain names
  --without-mo		skip *.mo locale files
EOF
exit 1
}

if [ -z "$1" ]; then
	usage
elif [ $1 = / ]; then
	echo >&2 "$PROG: expects non-/ argument for '$1'"
	exit 1
elif [ ! -d $1 ]; then
	echo >&2 "$PROG: $1: No such directory"
	exit 1
else
	TOP_DIR="${1%/}"
fi
shift

if [ -z "$1" ]; then
   	usage
else
   	NAME=$1
fi
shift

GNOME='#'
KDE='#'
OMF='#'
MO=''
MO_NAME=$NAME.lang
ALL_NAME='#'
NO_ALL_NAME=''
while test $# -gt 0 ; do
    case "$1" in
	--with-gnome)
  		GNOME=''
		echo "$PROG: Enabling with GNOME"
		shift
		;;
	--with-kde)
		echo "$PROG: Enabling with KDE"
		KDE=''
		shift
		;;
	--with-omf)
		echo "$PROG: Enabling with OMF"
		OMF=''
		shift
		;;
	--without-mo)
		echo "$PROG: Disabling .mo files"
		MO='#'
		shift
		;;
	--all-name)
		echo "$PROG: Enabling with all names"
		ALL_NAME=''
		NO_ALL_NAME='#'
		shift
		;;
	* )
		MO_NAME=$1
		shift
		;;
    esac
done    

echo '%defattr(644,root,root,755)' > $MO_NAME

if [ ! -f __find.files ] || [ "$TOP_DIR" -nt __find.files ]; then
	find $TOP_DIR -type f -name '*.mo' | xargs -r file | egrep -v ', 1 messages$' | \
	sed -e '
		s/:.*//
		s:'"$TOP_DIR"'::' > __find.files
else
	echo "$PROG: Using cached __find.files"
fi

if [ ! -f __omf.files ] || [ "$TOP_DIR" -nt __omf.files ]; then
	find $TOP_DIR -type f -name '*.omf' | \
	sed -e '
		s:'"$TOP_DIR"'::' > __omf.files
else
	echo "$PROG: Using cached __omf.files"
fi

(
	if [ "$ALL_NAME" ]; then
		fgrep $NAME __find.files
	else
		cat __find.files
	fi
) | sed '
'"$ALL_NAME$MO"'s:\(.*/share/locale/\)\([^/_]\+\)\(.*\.mo$\):%lang(\2) \1\2\3:
'"$NO_ALL_NAME$MO"'s:\(.*/share/locale/\)\([^/]\+\)\(.*/'"$NAME"'\.mo$\):%lang(\2) \1\2\3:
s:^\([^%].*\)::
s:%lang(C) ::
s:^\$::' | egrep -v '^$' >> $MO_NAME

(
	if [ "$ALL_NAME" ]; then
		fgrep $NAME __omf.files
	else
		cat __omf.files
	fi
) | sed '
'"$ALL_NAME$OMF"'s:\(.*/omf/[a-zA-Z0-9.\_\-]\+\)\(.*\-\)\(.*\)\(.*\.omf\):%lang(\3) \1\2\3\4:
'"$NO_ALL_NAME$OMF"'s:\(.*/omf/'"$NAME"'\)\(.*\-\)\(.*\)\(.*\.omf\):%lang(\3) \1\2\3\4:
s:^\([^%].*\)::
s:%lang(C) ::
s:^\$::' | egrep -v '^$' >> $MO_NAME

if [ ! -f __find.dirs ] || [ "$TOP_DIR" -nt __find.dirs ]; then
	find $TOP_DIR -type d | sed 's:'"$TOP_DIR"'::' > __find.dirs
else
	echo "$PROG: Using cached __find.dirs"
fi

(
	if [ "$ALL_NAME" ]; then
		fgrep $NAME __find.dirs
	else
		cat __find.dirs
	fi
) | sed '
'"$NO_ALL_NAME$GNOME"'s:\(.*/gnome/help/'"$NAME"'$\):%dir \1:
'"$NO_ALL_NAME$GNOME"'s:\(.*/gnome/help/'"$NAME"'/[a-zA-Z0-9.\_\-]/.\+\)::
'"$NO_ALL_NAME$GNOME"'s:\(.*/gnome/help/'"$NAME"'\/\)\([^/]\+\):%lang(\2) \1\2:
'"$ALL_NAME$GNOME"'s:\(.*/gnome/help/[a-zA-Z0-9.\_\-]\+$\):%dir \1:
'"$ALL_NAME$GNOME"'s:\(.*/gnome/help/[a-zA-Z0-9.\_\-]\+/[a-zA-Z0-9.\_\-]/.\+\)::
'"$ALL_NAME$GNOME"'s:\(.*/gnome/help/[a-zA-Z0-9.\_\-]\+\/\)\([^/]\+\):%lang(\2) \1\2:
s:%lang(.*) .*/gnome/help/[a-zA-Z0-9.\_\-]\+/[a-zA-Z0-9.\_\-]\+/.*::
s:^\([^%].*\)::
s:%lang(C) ::' | egrep -v '^$' >> $MO_NAME

(
	if [ "$ALL_NAME" ]; then
		fgrep $NAME __find.dirs
	else
		cat __find.dirs
	fi
) | sed '
'"$NO_ALL_NAME$KDE"'s:\(.*/doc/kde/HTML/\)\([^/_]\+\)\(.*/'"$NAME"'/\)::
'"$NO_ALL_NAME$KDE"'s:\(.*/doc/kde/HTML/\)\([^/_]\+\)\(.*/'"$NAME"'\)$:%lang(\2) \1\2\3:
'"$ALL_NAME$KDE"'s:\(.*/doc/kde/HTML/\)\([^/_]\+\)\(.*/[a-zA-Z0-9.\_\-]\+/\)::
'"$ALL_NAME$KDE"'s:\(.*/doc/kde/HTML/\)\([^/_]\+\)\(.*/[a-zA-Z0-9.\_\-]\+$\):%lang(\2) \1\2\3:
s:^\([^%].*\)::
s:%lang(C) ::' | egrep -v '^$' >> $MO_NAME

(
	if [ "$ALL_NAME" ]; then
		fgrep $NAME __find.dirs
	else
		cat __find.dirs
	fi
) | sed '
'"$NO_ALL_NAME$OMF"'s:\(.*/omf/'"$NAME"'$\):%dir \1:
'"$ALL_NAME$OMF"'s:\(.*/omf/[a-zA-Z0-9.\_\-]\+$\):%dir \1:
s:^\([^%].*\)::
s:%lang(C) ::' | egrep -v '^$' >> $MO_NAME

if [ "$(egrep -v '(^%defattr|^$)' $MO_NAME | wc -l)" -le 0 ]; then
	echo >&2 "Error: international files not found for $NAME!"
	exit 1
fi
