From: Bruno Haible Date: Thu, 2 May 2002 13:33:46 +0000 (+0000) Subject: A tool for people using CVS. X-Git-Tag: v0.11.3~78 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=126ee51e3966e4eb567a05291b3fb78caf48c57e;p=thirdparty%2Fgettext.git A tool for people using CVS. --- diff --git a/misc/autopoint.in b/misc/autopoint.in new file mode 100644 index 000000000..cede398cd --- /dev/null +++ b/misc/autopoint.in @@ -0,0 +1,350 @@ +#! /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 '^GETTEXT_VERSION=' | sed -e 's/^GETTEXT_VERSION=\([-+_.0-9A-Za-z]*\).*/\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 '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 +# +# 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 + +cvs 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" + 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_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 + 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