#! /bin/sh # # Copyright (C) 2002 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # This file is meant for authors, maintainers, co-maintainers or installers # of packages which are internationalized with the help of GNU gettext. For # further information how to use it consult the GNU gettext manual. progname=$0 package=@PACKAGE@ version=@VERSION@ # func_usage # outputs to stdout the --help usage message. func_usage () { echo "\ Usage: autopoint [OPTION]... Copies standard gettext infrastructure files into a source package. Options: --help print this help and exit --version print version information and exit -f, --force force overwriting of files that already exist -n, --dry-run print modifications but don't perform them" # echo "\ # -V version copy the infrastructure of the specified gettext version # (dangerous)" echo " Report bugs to ." } # func_version # outputs to stdout the --version message. func_version () { echo "$progname (GNU $package) $version" echo "Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." echo "Written by" "Bruno Haible" } # func_fatal_error message # outputs to stderr a fatal error message, and terminates the program. func_fatal_error () { echo "autopoint: *** $1" 1>&2 echo "autopoint: *** Stop." 1>&2 exit 1 } # Command-line option processing. # Removes the OPTIONS from the arguments. Sets the variables: # - force yes if --force was given, empty otherwise # - ver gettext version if -V was given, empty otherwise # - doit false if --dry-run was given, : otherwise { force= ver= doit=: while test $# -gt 0; do case "$1" in -n | --dry-run | --dry-ru | --dry-r | --dry- | --dry | --dr | --d ) shift doit=false ;; -f | --force | --forc | --for | --fo | --f ) shift force=yes ;; --help | --hel | --he | --h ) func_usage; exit 0 ;; # -V ) # Some people put a space between -V and the version number. # shift # if test $# = 0; then # func_usage 1>&2 # exit 1 # fi # ver=$1; # shift ;; # -V*) # Some people omit the space between -V and the version number. # ver=`echo "X$1" | sed -e 's/^X-V//'` # shift ;; --version | --versio | --versi | --vers | --ver | --ve | --v ) func_version exit 0 ;; -- ) # Stop option prcessing shift; break ;; -* ) echo "autopoint: unknown option $1" 1>&2 echo "Try 'autopoint --help' for more information." 1>&2 exit 1 ;; * ) break ;; esac done } # Command-line argument processing. # Analyzes the remaining arguments. { if test $# -gt 0; then func_usage 1>&2 exit 1 fi } srcdir=`pwd` # The current directory is now $srcdir. # Check integrity of package: A configure.in/ac must be present. Sets variable # - configure_in name of configure.in/ac file. if test -f configure.in; then configure_in=configure.in else if test -f configure.ac; then configure_in=configure.ac else func_fatal_error "Missing configure.in or configure.ac, please cd to your package first." fi fi # Check whether the -V option and the version number in configure.in match. # At least one of the two must be given. If both are given, they must agree. xver=`cat "$configure_in" | grep '^AM_GNU_GETTEXT_VERSION(' | sed -e 's/^AM_GNU_GETTEXT_VERSION(\([^()]*\))/\1/p' | sed -e 's/^\[\(.*\)\]$/\1/' | sed -e 1q` if test -z "$xver" && test -f intl/VERSION; then xver=`cat intl/VERSION | sed -n -e 's/^.*gettext-\(-+_.0-9A-Za-z]*\).*$/\1/p'` fi if test -n "$xver"; then if test -n "$ver"; then if test "X$ver" != "X$xver"; then func_fatal_error "Version mismatch: specified -V $ver but the package uses gettext version $xver" fi else ver="$xver" fi else if test -z "$ver"; then func_fatal_error "Missing version: please specify in $configure_in through a line 'AM_GNU_GETTEXT_VERSION(x.yy.zz)' the gettext version the package is using" fi fi # We distribute the many different versions of the files in a CVS repository. # This guarantees a good compression rate: # # Including version size in KB of # "du autopoint-files/archive" # 0.10.35 240 # 0.10.36 428 # 0.10.37 436 # 0.10.38 488 # 0.10.39 500 # 0.10.40 528 # 0.11 720 # 0.11.1 740 # 0.11.2 748 # 0.11.3 804 # 0.11.4 864 # 0.11.5 880 # # The requirement that the user must have the CVS program available is not # a severe restrictions, because most of the people who use autopoint are # users of CVS. # # Check availability of the CVS program. (cvs -v) >/dev/null 2>/dev/null || func_fatal_error "cvs program not found" # Check in which directory config.rpath, mkinstalldirs etc. belong. auxdir=`cat "$configure_in" | grep '^AC_CONFIG_AUX_DIR' | sed -n -e 's/AC_CONFIG_AUX_DIR(\([^()]*\))/\1/p' | sed -e 's/^\[\(.*\)\]$/\1/' | sed -e 1q` if test -n "$auxdir"; then auxdir="$auxdir/" fi # Check in which directory the *.m4 macros belong. m4dir=m4 if test -f Makefile.am; then # A package using automake. # Extract the macro directory name from Makefile.am. aclocal_amflags=`grep '^ACLOCAL_AMFLAGS[ ]*=' Makefile.am | sed -e 's/^ACLOCAL_AMFLAGS[ ]*=\(.*\)$/\1/'` m4dir_is_next= for arg in $aclocal_amflags; do if test -n "$m4dir_is_next"; then m4dir="$arg" break else if test "X$arg" = "X-I"; then m4dir_is_next=yes else m4dir_is_next= fi fi done fi # Check whether to omit the intl/ directory. omitintl=`cat "$configure_in" | grep '^AM_GNU_GETTEXT' | sed -n -e 's/^AM_GNU_GETTEXT(\([^(),]*\).*$/\1/p' | sed -e 's/^\[\(.*\)\]$/\1/' | sed -e 1q` omitintl=`if test 'external' = "$omitintl"; then echo yes; fi` # Set variables # - gettext_dir directory where the sources are stored. prefix="@prefix@" gettext_dir="@datadir@/gettext" # Set up a temporary CVS repository and a temporary checkout directory. # We need the temporary CVS repository because any checkout needs write # access to the CVSROOT/history file, so it cannot be under $gettext_dir. # We need the temporary checkout directory because when --force was not # given, we need to compare the existing files with the checked out ones. # Set variables # - cvs_dir directory containing the temporary repository # - work_dir directory containing the temporary checkout cvs_dir=tmpcvs$$ work_dir=tmpwrk$$ mkdir "$cvs_dir" mkdir "$work_dir" CVSROOT="$srcdir/$cvs_dir" export CVSROOT unset CVS_CLIENT_LOG unset CVS_CLIENT_PORT unset CVS_IGNORE_REMOTE_ROOT unset CVS_PASSFILE unset CVS_PASSWORD unset CVS_RCMD_PORT unset CVS_RSH unset CVS_SERVER unset CVS_SERVER_SLEEP unset CVSIGNORE unset CVSREAD unset CVSUMASK unset CVSWRAPPERS # Need to pass -d "$CVSROOT", because there may be a CVS directory in the # current directory. cvs -d "$CVSROOT" init gzip -d -c < "$gettext_dir/archive.tar.gz" | (cd "$cvs_dir" && tar xf -) cd "$work_dir" cvsver=gettext-`echo "$ver" | sed -e 's/\./_/g'` (cvs checkout -r"$cvsver" archive > /dev/null) 2>&1 | grep -v '^cvs checkout: Updating' find archive -name CVS -type d -print | xargs rm -rf if test `find archive -type f -print | wc -l` = 0; then cd .. rm -rf "$cvs_dir" "$work_dir" func_fatal_error "infrastructure files for version $ver not found; this is autopoint from GNU $package $version" fi cd .. # func_destfile file # determines the destination file, relative to the package's top level # directory, for a given file name, relative to archive. # Sets variable # - destfile relative destination file name, or # empty if the file shall be omitted func_destfile () { # There are five categories of files: # ABOUT_NLS -> top level directory # config.rpath mkinstalldirs -> $auxdir # m4/* -> $m4dir/ # intl/* -> intl/ # po/* -> po/ case `echo "$1" | sed -e 's,[^/]*$,,'` in "" ) case "$1" in config.rpath | mkinstalldirs ) destfile="$auxdir$1" ;; * ) destfile="$1" ;; esac ;; m4/ ) destfile=`echo "$1" | sed -e "s,^m4/,$m4dir/,"` ;; intl/ ) if test -n "$omitintl"; then destfile=""; else destfile="$1"; fi ;; * ) destfile="$1" ;; esac } # If some files have been locally modified and we have not been requested # to overwrite them, then bail out. This is better than leaving a source # package around where half of the files are locally modified and half are # original - too great risk of version mismatch. if test -z "$force"; then mismatch= for file in `find "$work_dir/archive" -type f -print | sed -e "s,^$work_dir/archive/,," | LC_ALL=C sort`; do func_destfile "$file" if test -n "$destfile"; then if test -f "$destfile"; then if cmp -s "$work_dir/archive/$file" "$destfile"; then : else echo "autopoint: File $destfile has been locally modified." mismatch=yes fi fi fi done if test -n "$mismatch"; then rm -rf "$cvs_dir" "$work_dir" func_fatal_error "Some files have been locally modified. Not overwriting them because --force has not been specified." fi fi # func_mkdir_for to # ensures the directory that would the given file exists. # 'to' is a relative pathname, relative to the current directory. func_mkdir_for () { base=`echo "$1" | sed -e 's,/[^/]*$,,'` if test "X$base" != "X$1" && test -n "$base"; then func_mkdir_for "$base" # Recompute base. It was clobbered by the recursive call. base=`echo "$1" | sed -e 's,/[^/]*$,,'` test -d "$base" || { echo "Creating directory $base"; mkdir "$base"; } fi } # func_copy from to # copies a file. # 'from' is a relative pathname, relative to the current directory. # 'to' is a relative pathname, relative to the current directory. func_copy () { if $doit; then func_mkdir_for "$2" rm -f "$2" echo "Copying file $2" cp "$1" "$2" else echo "Copy file $2" fi } # func_backup to # makes a backup of a file that is about to be overwritten or replaced. # 'to' is a relative pathname, relative to the current directory. func_backup () { if $doit; then if test -f "$1"; then rm -f "$1~" cp -p "$1" "$1~" fi fi } # Now copy the files. for file in `find "$work_dir/archive" -type f -print | sed -e "s,^$work_dir/archive/,," | LC_ALL=C sort`; do func_destfile "$file" mustcopy= if test -n "$destfile"; then if test -f "$destfile"; then if cmp -s "$work_dir/archive/$file" "$destfile"; then : else # Overwrite locally modified file. mustcopy=yes fi else mustcopy=yes fi fi if test -n "$mustcopy"; then func_backup "$destfile" func_copy "$work_dir/archive/$file" "$destfile" fi done # That's it. rm -rf "$cvs_dir" "$work_dir" exit 0