Sync usage with man page.
[netbsd-mini2440.git] / gnu / dist / gettext / gettext-tools / misc / autopoint.in
blob48f39cc4f833bd5718589441e891469bc9ba4ce6
1 #! /bin/sh
3 # Copyright (C) 2002-2005 Free Software Foundation, Inc.
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2, or (at your option)
8 # any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 # This file is meant for authors, maintainers, co-maintainers or installers
21 # of packages which are internationalized with the help of GNU gettext. For
22 # further information how to use it consult the GNU gettext manual.
24 progname=$0
25 package=@PACKAGE@
26 version=@VERSION@
28 # Set variables
29 # - gettext_dir directory where the sources are stored.
30 prefix="@prefix@"
31 gettext_dir="@datadir@/gettext"
33 # func_tmpdir
34 # creates a temporary directory.
35 # Sets variable
36 # - tmp pathname of freshly created temporary directory
37 func_tmpdir ()
39 # Use the environment variable TMPDIR, falling back to /tmp. This allows
40 # users to specify a different temporary directory, for example, if their
41 # /tmp is filled up or too small.
42 : ${TMPDIR=/tmp}
44 # Use the mktemp program if available. If not available, hide the error
45 # message.
46 tmp=`(umask 077 && mktemp -d -q "$TMPDIR/gtXXXXXX") 2>/dev/null` &&
47 test -n "$tmp" && test -d "$tmp"
48 } ||
50 # Use a simple mkdir command. It is guaranteed to fail if the directory
51 # already exists. $RANDOM is bash specific and expands to empty in shells
52 # other than bash, ksh and zsh. Its use does not increase security;
53 # rather, it minimizes the probability of failure in a very cluttered /tmp
54 # directory.
55 tmp=$TMPDIR/gt$$-$RANDOM
56 (umask 077 && mkdir "$tmp")
57 } ||
59 echo "$0: cannot create a temporary directory in $TMPDIR" >&2
60 { (exit 1); exit 1; }
64 # Support for relocatability.
65 func_find_curr_installdir ()
67 # Determine curr_installdir, even taking into account symlinks.
68 curr_executable="$0"
69 case "$curr_executable" in
70 */* | *\\*) ;;
71 *) # Need to look in the PATH.
72 if test "${PATH_SEPARATOR+set}" != set; then
73 func_tmpdir
74 { echo "#! /bin/sh"; echo "exit 0"; } > "$tmp"/conf.sh
75 chmod +x "$tmp"/conf.sh
76 if (PATH="/nonexistent;$tmp"; conf.sh) >/dev/null 2>&1; then
77 PATH_SEPARATOR=';'
78 else
79 PATH_SEPARATOR=:
81 rm -f "$tmp"
83 save_IFS="$IFS"; IFS="$PATH_SEPARATOR"
84 for dir in $PATH; do
85 IFS="$save_IFS"
86 test -z "$dir" && dir=.
87 for exec_ext in ''; do
88 if test -f "$dir/$curr_executable$exec_ext"; then
89 curr_executable="$dir/$curr_executable$exec_ext"
90 break 2
92 done
93 done
94 IFS="$save_IFS"
96 esac
97 # Make absolute.
98 case "$curr_executable" in
99 /* | ?:/* | ?:\\*) ;;
100 *) curr_executable=`pwd`/"$curr_executable" ;;
101 esac
102 # Resolve symlinks.
103 while : ; do
104 lsline=`LC_ALL=C ls -l "$curr_executable"`
105 case "$lsline" in
106 *" -> "*)
107 curr_executable=`echo "$curr_executable" | sed -e 's,/[^/]*$,,'`/`echo "$lsline" | sed -n -e 's,^.* -> \(.*\),\1,p'` ;;
108 *) break ;;
109 esac
110 done
111 curr_installdir=`echo "$curr_executable" | sed -e 's,/[^/]*$,,'`
112 # Canonicalize.
113 curr_installdir=`cd "$curr_installdir" && pwd`
115 func_find_prefixes ()
117 # Compute the original/current installation prefixes by stripping the
118 # trailing directories off the original/current installation directories.
119 orig_installprefix="$orig_installdir"
120 curr_installprefix="$curr_installdir"
121 while true; do
122 orig_last=`echo "$orig_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
123 curr_last=`echo "$curr_installprefix" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
124 if test -z "$orig_last" || test -z "$curr_last"; then
125 break
127 if test "$orig_last" != "$curr_last"; then
128 break
130 orig_installprefix=`echo "$orig_installprefix" | sed -e 's,/[^/]*$,,'`
131 curr_installprefix=`echo "$curr_installprefix" | sed -e 's,/[^/]*$,,'`
132 done
134 if test "@RELOCATABLE@" = yes; then
135 exec_prefix="@exec_prefix@"
136 bindir="@bindir@"
137 orig_installdir="$bindir" # see Makefile.am's *_SCRIPTS variables
138 func_find_curr_installdir # determine curr_installdir
139 func_find_prefixes
140 # Relocate the directory variables that we use.
141 gettext_dir=`echo "$gettext_dir/" | sed -e "s%^${orig_installprefix}/%${curr_installprefix}/%" | sed -e 's,/$,,'`
144 # func_usage
145 # outputs to stdout the --help usage message.
146 func_usage ()
148 echo "\
149 Usage: autopoint [OPTION]...
151 Copies standard gettext infrastructure files into a source package.
153 Options:
154 --help print this help and exit
155 --version print version information and exit
156 -f, --force force overwriting of files that already exist
157 -n, --dry-run print modifications but don't perform them"
158 # echo "\
159 # -V version copy the infrastructure of the specified gettext version
160 # (dangerous)"
161 echo "
162 Report bugs to <bug-gnu-gettext@gnu.org>."
165 # func_version
166 # outputs to stdout the --version message.
167 func_version ()
169 echo "$progname (GNU $package) $version"
170 echo "Copyright (C) 2002-2005 Free Software Foundation, Inc.
171 This is free software; see the source for copying conditions. There is NO
172 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
173 echo "Written by" "Bruno Haible"
176 # func_fatal_error message
177 # outputs to stderr a fatal error message, and terminates the program.
178 func_fatal_error ()
180 echo "autopoint: *** $1" 1>&2
181 echo "autopoint: *** Stop." 1>&2
182 exit 1
185 # Command-line option processing.
186 # Removes the OPTIONS from the arguments. Sets the variables:
187 # - force yes if --force was given, empty otherwise
188 # - ver gettext version if -V was given, empty otherwise
189 # - doit false if --dry-run was given, : otherwise
191 force=
192 ver=
193 doit=:
195 while test $# -gt 0; do
196 case "$1" in
197 -n | --dry-run | --dry-ru | --dry-r | --dry- | --dry | --dr | --d )
198 shift
199 doit=false ;;
200 -f | --force | --forc | --for | --fo | --f )
201 shift
202 force=yes ;;
203 --help | --hel | --he | --h )
204 func_usage; exit 0 ;;
205 # -V ) # Some people put a space between -V and the version number.
206 # shift
207 # if test $# = 0; then
208 # func_usage 1>&2
209 # exit 1
210 # fi
211 # ver=$1;
212 # shift ;;
213 # -V*) # Some people omit the space between -V and the version number.
214 # ver=`echo "X$1" | sed -e 's/^X-V//'`
215 # shift ;;
216 --version | --versio | --versi | --vers | --ver | --ve | --v )
217 func_version
218 exit 0 ;;
219 -- ) # Stop option prcessing
220 shift; break ;;
221 -* )
222 echo "autopoint: unknown option $1" 1>&2
223 echo "Try 'autopoint --help' for more information." 1>&2
224 exit 1 ;;
226 break ;;
227 esac
228 done
231 # Command-line argument processing.
232 # Analyzes the remaining arguments.
234 if test $# -gt 0; then
235 func_usage 1>&2
236 exit 1
240 srcdir=`pwd`
241 # The current directory is now $srcdir.
243 # Check integrity of package: A configure.in/ac must be present. Sets variable
244 # - configure_in name of configure.in/ac file.
245 if test -f configure.in; then
246 configure_in=configure.in
247 else
248 if test -f configure.ac; then
249 configure_in=configure.ac
250 else
251 # KDE specific convention: configure.in.in
252 if test -f configure.in.in; then
253 configure_in=configure.in.in
254 else
255 func_fatal_error "Missing configure.in or configure.ac, please cd to your package first."
260 # Check whether the -V option and the version number in configure.in match.
261 # At least one of the two must be given. If both are given, they must agree.
262 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`
263 if test -z "$xver" && test -f intl/VERSION; then
264 xver=`cat intl/VERSION | LC_ALL=C sed -n -e 's/^.*gettext-\([-+_.0-9A-Za-z]*\).*$/\1/p'`
266 if test -n "$xver"; then
267 if test -n "$ver"; then
268 if test "X$ver" != "X$xver"; then
269 func_fatal_error "Version mismatch: specified -V $ver but the package uses gettext version $xver"
271 else
272 ver="$xver"
274 else
275 if test -z "$ver"; then
276 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"
280 # Check whether the version number is supported.
281 case "$ver" in
282 0.10.35 | 0.10.36 | 0.10.37 | 0.10.38 | 0.10.39 | 0.10.40 | \
283 0.11 | 0.11.1 | 0.11.2 | 0.11.3 | 0.11.4 | 0.11.5 | \
284 0.12 | 0.12.1 | \
285 0.13 | 0.13.1 | \
286 0.14 | 0.14.1 | 0.14.2 | 0.14.3 | 0.14.4 )
289 func_fatal_error "The AM_GNU_GETTEXT_VERSION declaration in your $configure_in\
290 file requires the infrastructure from gettext-$ver but this version\
291 is older. Please upgrade to gettext-$ver or newer."
293 esac
295 # We distribute the many different versions of the files in a CVS repository.
296 # This guarantees a good compression rate:
298 # Including version size in KB of
299 # "du autopoint-files/archive"
300 # 0.10.35 240
301 # 0.10.36 428
302 # 0.10.37 436
303 # 0.10.38 488
304 # 0.10.39 500
305 # 0.10.40 528
306 # 0.11 720
307 # 0.11.1 740
308 # 0.11.2 748
309 # 0.11.3 804
310 # 0.11.4 864
311 # 0.11.5 880
312 # 0.12 1032
313 # 0.12.1 1032
314 # 0.13 1220
315 # 0.13.1 1236
316 # 0.14 1296
317 # 0.14.1 1300
318 # 0.14.2 1420
319 # 0.14.3 1428
320 # 0.14.4 1464
322 # The requirement that the user must have the CVS program available is not
323 # a severe restrictions, because most of the people who use autopoint are
324 # users of CVS.
326 # Check availability of the CVS program.
327 (cvs -v) >/dev/null 2>/dev/null || func_fatal_error "cvs program not found"
329 # Check in which directory config.rpath, mkinstalldirs etc. belong.
330 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`
331 if test -n "$auxdir"; then
332 auxdir="$auxdir/"
335 # Check in which directory the *.m4 macros belong.
336 m4dir=m4
337 if test -f Makefile.am; then
338 # A package using automake.
339 # Extract the macro directory name from Makefile.am.
340 aclocal_amflags=`grep '^ACLOCAL_AMFLAGS[ ]*=' Makefile.am | sed -e 's/^ACLOCAL_AMFLAGS[ ]*=\(.*\)$/\1/'`
341 m4dir_is_next=
342 for arg in $aclocal_amflags; do
343 if test -n "$m4dir_is_next"; then
344 m4dir="$arg"
345 break
346 else
347 if test "X$arg" = "X-I"; then
348 m4dir_is_next=yes
349 else
350 m4dir_is_next=
353 done
356 # Check whether to omit the intl/ directory.
357 omitintl=`cat "$configure_in" | grep '^AM_GNU_GETTEXT' | sed -n -e 's/^AM_GNU_GETTEXT(\([^(),]*\).*$/\1/p' | sed -e 's/^\[\(.*\)\]$/\1/' | sed -e 1q`
358 omitintl=`if test 'external' = "$omitintl"; then echo yes; fi`
360 # Set up a temporary CVS repository and a temporary checkout directory.
361 # We need the temporary CVS repository because any checkout needs write
362 # access to the CVSROOT/history file, so it cannot be under $gettext_dir.
363 # We need the temporary checkout directory because when --force was not
364 # given, we need to compare the existing files with the checked out ones.
365 # Set variables
366 # - cvs_dir directory containing the temporary repository
367 # - work_dir directory containing the temporary checkout
368 cvs_dir=tmpcvs$$
369 work_dir=tmpwrk$$
370 # Use an umask of 077, to avoid attacks that work by overwriting files in the
371 # "$CVSROOT"/CVSROOT directory.
372 (umask 077 && mkdir "$cvs_dir") || {
373 if test -d "$cvs_dir"; then
374 func_fatal_error "directory $cvs_dir already exists"
375 else
376 func_fatal_error "cannot create directory $cvs_dir"
379 mkdir "$work_dir" || {
380 if test -d "$work_dir"; then
381 func_fatal_error "directory $work_dir already exists"
382 else
383 func_fatal_error "cannot create directory $work_dir"
386 CVSROOT="$srcdir/$cvs_dir"
387 export CVSROOT
388 unset CVS_CLIENT_LOG
389 unset CVS_CLIENT_PORT
390 unset CVS_IGNORE_REMOTE_ROOT
391 unset CVS_PASSFILE
392 unset CVS_PASSWORD
393 unset CVS_RCMD_PORT
394 unset CVS_RSH
395 unset CVS_SERVER
396 unset CVS_SERVER_SLEEP
397 unset CVSIGNORE
398 unset CVSREAD
399 unset CVSUMASK
400 unset CVSWRAPPERS
402 # Need to pass -d "$CVSROOT", because there may be a CVS directory in the
403 # current directory.
404 cvs -d "$CVSROOT" init
405 gzip -d -c < "$gettext_dir/archive.tar.gz" | (cd "$cvs_dir" && tar xf -)
407 cd "$work_dir"
408 cvsver=gettext-`echo "$ver" | sed -e 's/\./_/g'`
409 (cvs checkout -r"$cvsver" archive > /dev/null) 2>&1 | grep -v '^cvs checkout: Updating'
410 find archive -name CVS -type d -print | xargs rm -rf
411 if test `find archive -type f -print | wc -l` = 0; then
412 cd ..
413 rm -rf "$cvs_dir" "$work_dir"
414 func_fatal_error "infrastructure files for version $ver not found; this is autopoint from GNU $package $version"
416 cd ..
418 # func_destfile file
419 # determines the destination file, relative to the package's top level
420 # directory, for a given file name, relative to archive.
421 # Sets variables
422 # - destfile relative destination file name, or
423 # empty if the file shall be omitted
424 # - sharedowner yes if the file is not only owned by GNU gettext but may
425 # be installed by automake or other tools, otherwise empty
426 func_destfile ()
428 # There are five categories of files:
429 # ABOUT_NLS -> top level directory
430 # config.rpath mkinstalldirs -> $auxdir
431 # m4/* -> $m4dir/
432 # intl/* -> intl/
433 # po/* -> po/
434 sharedowner=
435 case `echo "$1" | sed -e 's,[^/]*$,,'` in
436 "" )
437 case "$1" in
438 config.rpath ) destfile="$auxdir$1" ;;
439 mkinstalldirs ) destfile="$auxdir$1" sharedowner=yes ;;
440 * ) destfile="$1" ;;
441 esac
443 m4/ ) destfile=`echo "$1" | sed -e "s,^m4/,$m4dir/,"` ;;
444 intl/ ) if test -n "$omitintl"; then destfile=""; else destfile="$1"; fi ;;
445 * ) destfile="$1" ;;
446 esac
449 # If some files have been locally modified and we have not been requested
450 # to overwrite them, then bail out. This is better than leaving a source
451 # package around where half of the files are locally modified and half are
452 # original - too great risk of version mismatch.
453 if test -z "$force"; then
454 mismatch=
455 func_tmpdir
456 mismatchfile="$tmp"/autopoint.diff
457 for file in `find "$work_dir/archive" -type f -print | sed -e "s,^$work_dir/archive/,," | LC_ALL=C sort`; do
458 func_destfile "$file"
459 if test -n "$destfile"; then
460 if test -f "$destfile"; then
461 if cmp -s "$work_dir/archive/$file" "$destfile"; then
463 else
464 if test -n "$sharedowner"; then
465 echo "autopoint: warning: File $destfile has been locally modified." 1>&2
466 else
467 echo "autopoint: File $destfile has been locally modified." 1>&2
468 mismatch=yes
469 diff -c "$work_dir/archive/$file" "$destfile" | sed -e "1s,$work_dir/archive/,," >> "$mismatchfile"
474 done
475 if test -n "$mismatch"; then
476 rm -rf "$cvs_dir" "$work_dir"
477 func_fatal_error "Some files have been locally modified. Not overwriting them because --force has not been specified. For your convenience, you find the local modifications in the file '$mismatchfile'."
479 rm -rf "$tmp"
482 # func_mkdir_for to
483 # ensures the directory that would the given file exists.
484 # 'to' is a relative pathname, relative to the current directory.
485 func_mkdir_for ()
487 base=`echo "$1" | sed -e 's,/[^/]*$,,'`
488 if test "X$base" != "X$1" && test -n "$base"; then
489 func_mkdir_for "$base"
490 # Recompute base. It was clobbered by the recursive call.
491 base=`echo "$1" | sed -e 's,/[^/]*$,,'`
492 test -d "$base" || { echo "Creating directory $base"; mkdir "$base"; }
496 # func_copy from to
497 # copies a file.
498 # 'from' is a relative pathname, relative to the current directory.
499 # 'to' is a relative pathname, relative to the current directory.
500 func_copy ()
502 if $doit; then
503 func_mkdir_for "$2"
504 rm -f "$2"
505 echo "Copying file $2"
506 cp "$1" "$2"
507 else
508 echo "Copy file $2"
512 # func_backup to
513 # makes a backup of a file that is about to be overwritten or replaced.
514 # 'to' is a relative pathname, relative to the current directory.
515 func_backup ()
517 if $doit; then
518 if test -f "$1"; then
519 rm -f "$1~"
520 cp -p "$1" "$1~"
525 # Now copy the files.
526 for file in `find "$work_dir/archive" -type f -print | sed -e "s,^$work_dir/archive/,," | LC_ALL=C sort`; do
527 func_destfile "$file"
528 mustcopy=
529 if test -n "$destfile"; then
530 if test -f "$destfile"; then
531 if cmp -s "$work_dir/archive/$file" "$destfile"; then
533 else
534 if test -n "$force"; then
535 # Overwrite locally modified file.
536 mustcopy=yes
538 # If --force is not specified, don't overwrite locally modified files
539 # for which GNU gettext is a shared owner.
541 else
542 mustcopy=yes
545 if test -n "$mustcopy"; then
546 func_backup "$destfile"
547 func_copy "$work_dir/archive/$file" "$destfile"
549 done
551 # That's it.
552 rm -rf "$cvs_dir" "$work_dir"
553 exit 0