Index: ossp-pkg/shiela/.configure RCS File: /v/ossp/cvs/ossp-pkg/shiela/Attic/.configure,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/shiela/Attic/.configure,v' | diff -u /dev/null - -L'ossp-pkg/shiela/.configure' 2>/dev/null --- ossp-pkg/shiela/.configure +++ - 2024-05-15 08:56:47.186776680 +0200 @@ -0,0 +1,4 @@ +: +./configure \ +--prefix=/sw/pkg/shiela \ +"$@" Index: ossp-pkg/shiela/Makefile.in RCS File: /v/ossp/cvs/ossp-pkg/shiela/Makefile.in,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/shiela/Makefile.in,v' | diff -u /dev/null - -L'ossp-pkg/shiela/Makefile.in' 2>/dev/null --- ossp-pkg/shiela/Makefile.in +++ - 2024-05-15 08:56:47.189431429 +0200 @@ -0,0 +1,91 @@ +## +## Makefile for Shiela +## + +@SET_MAKE@ + +SHELL = /bin/sh +SHTOOL = ./shtool +RM = rm -f +SED = sed +PERL = @PATH_PERL@ +CVS = @PATH_CVS@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ +includedir = @includedir@ +mandir = @mandir@ + +all: shiela shiela.1 shiela-install shiela-install.1 + +shiela: shiela.pl + @$(SHTOOL) echo -e "%Bgenerating shiela%b" + $(SED) -e "s;#!\@PERL\@;#!$(PERL);" \ + shiela && \ + chmod a+x shiela + +shiela-install: shiela-install.sh + @$(SHTOOL) echo -e "%Bgenerating shiela-install%b" + $(SED) -e "s;#!\@SH\@;#!$(SHELL);" \ + -e "s;\@prefix\@;$(prefix);" \ + -e "s;\@bindir\@;$(bindir);" \ + -e "s;\@libdir\@;$(libdir);" \ + shiela-install && \ + chmod a+x shiela-install + +shiela.1: shiela.pod + @$(SHTOOL) echo -e "%Bgenerating shiela.1%b" + V=`$(SHTOOL) version -l txt -d short VERSION`; \ + D=`$(SHTOOL) version -l txt -d long VERSION | $(SED) -e 's;.*(;;' -e 's;).*;;'`; \ + pod2man --section=1 --center="CVS ACL and Logging Facility" \ + --release="$$D" --date="OSSP Shiela $$V" shiela.pod >shiela.1 + +shiela-install.1: shiela-install.pod + @$(SHTOOL) echo -e "%Bgenerating shiela-install.1%b" + V=`$(SHTOOL) version -l txt -d short VERSION`; \ + D=`$(SHTOOL) version -l txt -d long VERSION | $(SED) -e 's;.*(;;' -e 's;).*;;'`; \ + pod2man --section=1 --center="CVS ACL and Logging Facility" \ + --release="$$D" --date="OSSP Shiela $$V" shiela-install.pod >shiela-install.1 + +install: all + $(SHTOOL) mkdir -f -p -m 755 $(bindir) + $(SHTOOL) mkdir -f -p -m 755 $(libdir) + $(SHTOOL) mkdir -f -p -m 755 $(mandir)/man1 + $(SHTOOL) install -c -m 755 shiela $(bindir)/shiela + $(SHTOOL) install -c -m 644 shiela.1 $(mandir)/man1/shiela.1 + $(SHTOOL) install -c -m 755 shiela-install $(bindir)/shiela-install + $(SHTOOL) install -c -m 644 shiela-install.1 $(mandir)/man1/shiela-install.1 + +clean: + $(RM) shiela shiela.1 + $(RM) shiela-install shiela-install.1 + +distclean: clean + $(RM) config.cache config.status config.log + $(RM) Makefile + +dist: distclean + @echo "Fixing source tree permissions"; \ + $(SHTOOL) fixperm * + @V=`$(SHTOOL) version -l txt -d short VERSION`; \ + echo "Rolling tarball shiela-$${V}.tar.gz:"; \ + $(SHTOOL) tarball -o shiela-$${V}.tar.gz \ + -e 'CVS,\.cvsignore,^\.' -c 'gzip -9' -u ossp -g shiela .; \ + ls -l shiela-$${V}.tar.gz + +update-tools: + shtoolize -q -o shtool echo mkdir install tarball fixperm version path + $(RM) configure + autoconf + +update-version: + V=`./shtool version -l txt -d short VERSION`; \ + $(SED) -e "s/version = '.*'/version = '$$V'/" shiela.pl.n && mv shiela.pl.n shiela.pl; \ + $(SED) -e "s/version=\".*\"/version=\"$$V\"/" shiela-install.sh.n && mv shiela-install.sh.n shiela-install.sh; \ + V=`./shtool version -l txt -d long VERSION`; \ + $(SED) -e "s/Version .*(.*)/Version $$V/g" README.n && mv README.n README; \ + $(SED) -e "s/B .*/B $$V/" shiela.pod.n && mv shiela.pod.n shiela.pod; \ + $(SED) -e "s/B .*/B $$V/" shiela-install.pod.n && mv shiela-install.pod.n shiela-install.pod + Index: ossp-pkg/shiela/TODO RCS File: /v/ossp/cvs/ossp-pkg/shiela/TODO,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/shiela/TODO,v' | diff -u /dev/null - -L'ossp-pkg/shiela/TODO' 2>/dev/null --- ossp-pkg/shiela/TODO +++ - 2024-05-15 08:56:47.192161859 +0200 @@ -0,0 +1,60 @@ + ____ _ _ _ + / ___|| |__ (_) ___| | __ _ + \___ \| '_ \| |/ _ \ |/ _` | + ___) | | | | | __/ | (_| | + |____/|_| |_|_|\___|_|\__,_| + + Shiela - Access Control and Logging Facility for CVS + ____________________________________________________________________ + + TODO + + For version 1.0: + ---------------- + + o Subject can be compressed by reducing common prefix and + just repeating the subdirs together with the files: + << [CVS] OSSP: ossp-pkg/ossp-cvs README.OSSP ossp-pkg/ossp-cvs/src cvsrc.c + >> [CVS] OSSP: ossp-pkg/ossp-cvs README.OSSP src/cvsrc.c + Eventuell sogar auf module reduzieren: + >> [CVS] OSSP ossp-cvs: README.OSSP src/cvsrc.c + + o Branches should be listed in Subject lines + + o Modules should be allowed to be arbitrary paths and not + just top-level directories. This should be easy to add for + version 1.1 by adjusting the access control routine. + + o Shiela perhaps should read in shiela.msg in order to know + what to kick out when compressing the message. + + For version 1.1: + ---------------- + + o Under MIME mails, the details could include complete files + really as is without the need to uuencode them first. + + o Perhaps replace do_file() mit an IO::File based class? + But keep always in mind \n characters when coming in and going out. + + o Support for code freeze time (ranges) and automatic pre-time + messages and MOTDs for reminder under cvs commit, cvs admin and cvs + import actions. + Idea: Req "Approved by:" *:core; + + o Support for "Review-Than-Commit" style development. + Idea: Req "Reviewed by:" *:devel; + + o Be more relaxed and support case insensitive config file + parsing to be less restrictive to the user when it comes + to keywords. + + o Support per-directory .shielarc[,v] files in the + repository which act similar to the CVS watch facility and can forward + the logging messages to particular people in addition to the standard + logging as configured by shiela.cfg. So a .shielarc file with "Log + mod_foo.c mail:rse@engelschall.com" would send an extra email to + rse@engelschall when mod_foo.c was modified. So, actually a "Log" + command in .shielarc should act identically to a "Log" command in + shiela.cfg. + Index: ossp-pkg/shiela/VERSION RCS File: /v/ossp/cvs/ossp-pkg/shiela/VERSION,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/shiela/VERSION,v' | diff -u /dev/null - -L'ossp-pkg/shiela/VERSION' 2>/dev/null --- ossp-pkg/shiela/VERSION +++ - 2024-05-15 08:56:47.194769007 +0200 @@ -0,0 +1,3 @@ + + This is OSSP Shiela, Version 0.9.0 (18-Jun-2000) + Index: ossp-pkg/shiela/configure.in RCS File: /v/ossp/cvs/ossp-pkg/shiela/Attic/configure.in,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/shiela/Attic/configure.in,v' | diff -u /dev/null - -L'ossp-pkg/shiela/configure.in' 2>/dev/null --- ossp-pkg/shiela/configure.in +++ - 2024-05-15 08:56:47.197301301 +0200 @@ -0,0 +1,24 @@ + +AC_INIT(README) + +AC_DIVERT_PUSH(AC_DIVERSION_NOTICE) +V=`./shtool version -ltxt -dlong VERSION` +./shtool echo -e "Configuring %BOSSP Shiela%b, Version %B${V}%b" +echo "Copyright (c) 2000 Ralf S. Engelschall " +echo "" +AC_DIVERT_POP() + +AC_MSG_CHECKING(for Perl program) +PATH_PERL=`./shtool path -m perl5 perl` +AC_SUBST(PATH_PERL) +AC_MSG_RESULT($PATH_PERL) + +AC_MSG_CHECKING(for CVS program) +PATH_CVS=`./shtool path cvs` +AC_SUBST(PATH_CVS) +AC_MSG_RESULT($PATH_CVS) + +AC_SET_MAKE + +AC_OUTPUT(Makefile) + Index: ossp-pkg/shiela/shiela-install.pod RCS File: /v/ossp/cvs/ossp-pkg/shiela/shiela-install.pod,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/shiela/shiela-install.pod,v' | diff -u /dev/null - -L'ossp-pkg/shiela/shiela-install.pod' 2>/dev/null --- ossp-pkg/shiela/shiela-install.pod +++ - 2024-05-15 08:56:47.199836645 +0200 @@ -0,0 +1,151 @@ +## +## Shiela - CVS Access Control and Logging Facility +## Copyright (c) 2000 Ralf S. Engelschall +## +## This file is part of Shiela, an access control and logging +## facility for Concurrent Versions System (CVS) repositories +## which can be found at http://www.ossp.org/pkg/shiela/. +## +## 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.0 of the License, 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 file; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +## USA, or contact Ralf S. Engelschall . +## +## shiela-install.pod: Shiela install manual page (syntax: POD) +## + +=pod + +=head1 NAME + +B - Shiela installation utility + +=head1 VERSION + +B 0.9.0 (18-Jun-2000) + +=head1 DESCRIPTION + +B is an access control and logging facility for use with +the I (CVS). Read shiela(1) for more +details about B itself. This B program is a +small utility intended to help in adding B to an existing CVS +repository for testing or production purposes. + +=head1 INSTALLATION: MANUALLY + +B can be installed and activated in a CVS repository either +manually or via the B program. The manual steps would +be: + +=over 4 + +=item B<1.> + +checkout a working copy of the C module from your repository. + +=item B<2.> + +create the files C<$CVSROOT/CVSROOT/shiela>, +C<$CVSROOT/CVSROOT/shiela.cfg> and C<$CVSROOT/CVSROOT/shiela.msg> +in this directory and list these three files in +C<$CVSROOT/CVSROOT/checkoutlist> (so CVS automatically checks them +out). + +=item B<3.> + +add to C<$CVSROOT/CVSROOT/rcsinfo> (the hook for providing log +messages): ``C''. + +=item B<4.> + +add to C<$CVSROOT/CVSROOT/taginfo> (the hook for checking tag +operations): ``C''. + +=item B<5.> + +add to C<$CVSROOT/CVSROOT/importinfo> (the hook for checking import +operations): ``C''. This +assumes that you are using the OSSP CVS version. If you use a stock CVS +version, you have to skip this step and live with the fact that `C' commands cannot be access controlled by B (because then +this hook does not exists at all). + +=item B<6.> + +add to C<$CVSROOT/CVSROOT/admininfo> (the hook for checking admin +operations): ``C''. This +requires that you are using the OSSP CVS version. If you use a stock CVS +version, you have to skip this step and life with the fact that `C' commands cannot be access controlled by B (because then +this hook does not exists at all). + +=item B<7.> + +add to C<$CVSROOT/CVSROOT/commitinfo> (the hool for checking commit +operations): ``C''. + +=item B<8.> + +add to C<$CVSROOT/CVSROOT/verifymsg> (the hook for post-processing log +messages): ``C''. + +=item B<9.> + +add to C<$CVSROOT/CVSROOT/loginfo> (the hook for performing logging): +``C''. This +requires that you use the OSSP CVS version. If you use a stock CVS +version, use ``C'' +instead and live with the fact that B's run-time efficiency is +slightly decreased and branch recognition might be less correct (because +B has to determine details the hard way which CVS already would +know easily). + +=item B<10.> + +edit C<$CVSROOT/CVSROOT/shiela.cfg> to fit your repository and +project situation. For details, see the description below under +B. + +=item B<11.> + +finally commit all modifications at once. + +=back + +=head1 INSTALLATION: AUTOMATICALLY + +For convinience reasons one can alternatively use the interactive +B utility, which perform the above steps automatically +and especially creates initial C and C files. +Just run C and answer the questions. + +For convinience reasons (while testing) one can also override the +default value of a question by using C on the +B command line. For instance, ``C'' sets the default path for the question about the +CVS repository to C. Additionally one can specify C +which runs B non-interactively. + +=head1 SEE ALSO + +shiela(1). + +=head1 AUTHOR + + Ralf S. Engelschall + rse@engelschall.com + www.engelschall.com + +=cut + Index: ossp-pkg/shiela/shtool RCS File: /v/ossp/cvs/ossp-pkg/shiela/Attic/shtool,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/shiela/Attic/shtool,v' | diff -u /dev/null - -L'ossp-pkg/shiela/shtool' 2>/dev/null --- ossp-pkg/shiela/shtool +++ - 2024-05-15 08:56:47.202612806 +0200 @@ -0,0 +1,1442 @@ +#!/bin/sh +## +## GNU shtool -- The GNU Portable Shell Tool +## Copyright (c) 1994-2000 Ralf S. Engelschall +## +## See http://www.gnu.org/software/shtool/ for more information. +## See ftp://ftp.gnu.org/gnu/shtool/ for latest version. +## +## Version: 1.4.10 (18-Jun-2000) +## Contents: 7/17 available modules +## + +## +## 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 of the License, 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, or contact Ralf S. Engelschall . +## +## Notice: Given that you include this file verbatim into your own +## source tree, you are justified in saying that it remains separate +## from your package, and that this way you are simply just using GNU +## shtool. So, in this situation, there is no requirement that your +## package itself is licensed under the GNU General Public License in +## order to take advantage of GNU shtool. +## + +## +## Usage: shtool [] [ [] []] +## +## Available commands: +## echo Print string with optional construct expansion +## install Install a program, script or datafile +## mkdir Make one or more directories +## fixperm Fix file permissions inside a source tree +## tarball Roll distribution tarballs +## version Generate and maintain a version information file +## path Deal with program paths +## +## Not available commands (because module was not built-in): +## mdate Pretty-print modification time of a file or dir +## table Pretty-print a field-separated list as a table +## prop Display progress with a running propeller +## move Move files with simultaneous substitution +## mkln Make link with calculation of relative paths +## mkshadow Make a shadow tree through symbolic links +## guessos Simple operating system guesser +## arx Extended archive command +## slo Separate linker options by library class +## scpp Sharing C Pre-Processor +## + +if [ $# -eq 0 ]; then + echo "$0:Error: invalid command line" 1>&2 + echo "$0:Hint: run \`$0 -h' for usage" 1>&2 + exit 1 +fi +if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then + echo "This is GNU shtool, version 1.4.10 (18-Jun-2000)" + echo "Copyright (c) 1994-2000 Ralf S. Engelschall " + echo "Report bugs to " + echo '' + echo "Usage: shtool [] [ [] []]" + echo '' + echo 'Available global :' + echo ' -v, --version display shtool version information' + echo ' -h, --help display shtool usage help page (this one)' + echo ' -d, --debug display shell trace information' + echo '' + echo 'Available [] []:' + echo ' echo [-n] [-e] [ ...]' + echo ' install [-v] [-t] [-c] [-C] [-s] [-m] [-o] [-g]' + echo ' [-e] [ ...] ' + echo ' mkdir [-t] [-f] [-p] [-m] [ ...]' + echo ' fixperm [-v] [-t] [ ...]' + echo ' tarball [-t] [-v] [-o ] [-c ] [-d ] [-u' + echo ' ] [-g ] [-e ] [ ...]' + echo ' version [-l] [-n] [-p] [-s] [-i]' + echo ' [-d] ' + echo ' path [-s] [-r] [-d] [-b] [-m] [-p] [ ...]' + echo '' + echo 'Not available (because module was not built-in):' + echo ' mdate [-n] [-z] [-s] [-d] [-f] [-o] ' + echo ' table [-F] [-w] [-c] [-s] ...' + echo ' prop [-p]' + echo ' move [-v] [-t] [-e] [-p] ' + echo ' mkln [-t] [-f] [-s] [ ...] ' + echo ' mkshadow [-v] [-t] [-a] ' + echo ' guessos ' + echo ' arx [-t] [-C] [ ...]' + echo ' slo [-p] -- -L -l [-L -l ...]' + echo ' scpp [-v] [-p] [-f] [-o] [-t] [-M]' + echo ' [-D] [-C] [ ...]' + echo '' + exit 0 +fi +if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then + echo "GNU shtool 1.4.10 (18-Jun-2000)" + exit 0 +fi +if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then + shift + set -x +fi +name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'` +case "$name" in + echo|install|mkdir|fixperm|tarball|version|path ) + # implicit tool command selection + tool="$name" + ;; + * ) + # explicit tool command selection + tool="$1" + shift + ;; +esac +arg_spec="" +opt_spec="" +gen_tmpfile=no + +## +## DISPATCH INTO SCRIPT PROLOG +## + +case $tool in + echo ) + str_tool="echo" + str_usage="[-n] [-e] [ ...]" + arg_spec="0+" + opt_spec="n.e." + opt_n=no + opt_e=no + ;; + install ) + str_tool="install" + str_usage="[-v] [-t] [-c] [-C] [-s] [-m] [-o] [-g] [-e] [ ...] " + arg_spec="2+" + opt_spec="v.t.c.C.s.m:o:g:e:" + opt_v=no + opt_t=no + opt_c=no + opt_C=no + opt_s=no + opt_m="" + opt_o="" + opt_g="" + opt_e="" + ;; + mkdir ) + str_tool="mkdir" + str_usage="[-t] [-f] [-p] [-m] [ ...]" + arg_spec="1+" + opt_spec="t.f.p.m:" + opt_t=no + opt_f=no + opt_p=no + opt_m="" + ;; + fixperm ) + str_tool="fixperm" + str_usage="[-v] [-t] [ ...]" + arg_spec="1+" + opt_spec="v.t." + opt_v=no + opt_t=no + ;; + tarball ) + str_tool="tarball" + str_usage="[-t] [-v] [-o ] [-c ] [-d ] [-u ] [-g ] [-e ] [ ...]" + gen_tmpfile=yes + arg_spec="1+" + opt_spec="t.v.o:c:d:u:g:e:" + opt_t=no + opt_v=no + opt_o="" + opt_c="" + opt_d="" + opt_u="" + opt_g="" + opt_e="CVS,\\.cvsignore,\\.[oa]\$" + ;; + version ) + str_tool="version" + str_usage="[-l] [-n] [-p] [-s] [-i] [-d] " + arg_spec="1+" + opt_spec="l:n:p:s:i:d:" + opt_l="txt" + opt_n="unknown" + opt_p="unknown" + opt_s="unknown" + opt_i="P" + opt_d="NO" + gen_tmpfile=yes + ;; + path ) + str_tool="path" + str_usage="[-s] [-r] [-d] [-b] [-m] [-p] [ ...]" + gen_tmpfile=yes + arg_spec="1+" + opt_spec="s.r.d.b.m.p:" + opt_s=no + opt_r=no + opt_d=no + opt_b=no + opt_m=no + opt_p="$PATH" + ;; + -* ) + echo "$0:Error: unknown option \`$tool'" 2>&1 + echo "$0:Hint: run \`$0 -h' for usage" 2>&1 + exit 1 + ;; + * ) + echo "$0:Error: unknown command \`$tool'" 2>&1 + echo "$0:Hint: run \`$0 -h' for usage" 2>&1 + exit 1 + ;; +esac + +## +## COMMON UTILITY CODE +## + +# determine name of tool +if [ ".$tool" != . ]; then + # used inside shtool script + toolcmd="$0 $tool" + toolcmdhelp="shtool $tool" + msgprefix="shtool:$tool" +else + # used as standalone script + toolcmd="$0" + toolcmdhelp="sh $0" + msgprefix="$str_tool" +fi + +# parse argument specification string +eval `echo $arg_spec |\ + sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'` + +# parse option specification string +eval `echo h.$opt_spec |\ + sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'` + +# interate over argument line +opt_PREV='' +while [ $# -gt 0 ]; do + # special option stops processing + if [ ".$1" = ".--" ]; then + shift + break + fi + + # determine option and argument + opt_ARG_OK=no + if [ ".$opt_PREV" != . ]; then + # merge previous seen option with argument + opt_OPT="$opt_PREV" + opt_ARG="$1" + opt_ARG_OK=yes + opt_PREV='' + else + # split argument into option and argument + case "$1" in + -[a-zA-Z0-9]*) + eval `echo "x$1" |\ + sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ + -e 's/";\(.*\)$/"; opt_ARG="\1"/'` + ;; + -[a-zA-Z0-9]) + opt_OPT=`echo "x$1" | cut -c3-` + opt_ARG='' + ;; + *) + break + ;; + esac + fi + + # eat up option + shift + + # determine whether option needs an argument + eval "opt_MODE=\$opt_MODE_${opt_OPT}" + if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then + if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then + opt_PREV="$opt_OPT" + continue + fi + fi + + # process option + case $opt_MODE in + '.' ) + # boolean option + eval "opt_${opt_OPT}=yes" + ;; + ':' ) + # option with argument (multiple occurances override) + eval "opt_${opt_OPT}=\"\$opt_ARG\"" + ;; + '+' ) + # option with argument (multiple occurances append) + eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" + ;; + * ) + echo "$msgprefix:Error: unknown option: \`-$opt_OPT'" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 + exit 1 + ;; + esac +done +if [ ".$opt_PREV" != . ]; then + echo "$msgprefix:Error: missing argument to option \`-$opt_PREV'" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 + exit 1 +fi + +# process help option +if [ ".$opt_h" = .yes ]; then + echo "Usage: $toolcmdhelp $str_usage" + exit 0 +fi + +# complain about incorrect number of arguments +case $arg_MODE in + '=' ) + if [ $# -ne $arg_NUMS ]; then + echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 + exit 1 + fi + ;; + '+' ) + if [ $# -lt $arg_NUMS ]; then + echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 + echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 + exit 1 + fi + ;; +esac + +# establish a temporary file on request +if [ ".$gen_tmpfile" = .yes ]; then + if [ ".$TMPDIR" != . ]; then + tmpdir="$TMPDIR" + elif [ ".$TEMPDIR" != . ]; then + tmpdir="$TEMPDIR" + else + tmpdir="/tmp" + fi + tmpfile="$tmpdir/.shtool.$$" + rm -f $tmpfile >/dev/null 2>&1 + touch $tmpfile +fi + +## +## DISPATCH INTO SCRIPT BODY +## + +case $tool in + +echo ) + ## + ## echo -- Print string with optional construct expansion + ## Copyright (c) 1998-2000 Ralf S. Engelschall + ## Originally written for WML as buildinfo + ## + + text="$*" + + # check for broken escape sequence expansion + seo='' + bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" != .3 ]; then + bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" = .3 ]; then + seo='-E' + fi + fi + + # check for existing -n option (to suppress newline) + minusn='' + bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'` + if [ ".$bytes" = .3 ]; then + minusn='-n' + fi + + # determine terminal bold sequence + term_bold='' + term_norm='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then + case $TERM in + # for the most important terminal types we directly know the sequences + xterm|xterm*|vt220|vt220*) + term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` + term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` + ;; + vt100|vt100*) + term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` + term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` + ;; + # for all others, we try to use a possibly existing `tput' or `tcout' utility + * ) + paths=`echo $PATH | sed -e 's/:/ /g'` + for tool in tput tcout; do + for dir in $paths; do + if [ -r "$dir/$tool" ]; then + for seq in bold md smso; do # 'smso' is last + bold="`$dir/$tool $seq 2>/dev/null`" + if [ ".$bold" != . ]; then + term_bold="$bold" + break + fi + done + if [ ".$term_bold" != . ]; then + for seq in sgr0 me rmso reset; do # 'reset' is last + norm="`$dir/$tool $seq 2>/dev/null`" + if [ ".$norm" != . ]; then + term_norm="$norm" + break + fi + done + fi + break + fi + done + if [ ".$term_bold" != . -a ".$term_norm" != . ]; then + break; + fi + done + ;; + esac + if [ ".$term_bold" = . -o ".$term_norm" = . ]; then + echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2 + fi + fi + + # determine user name + username='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uU]'`" != . ]; then + username="$LOGNAME" + if [ ".$username" = . ]; then + username="$USER" + if [ ".$username" = . ]; then + username="`(whoami) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$username" = . ]; then + username="`(who am i) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$username" = . ]; then + username='unknown' + fi + fi + fi + fi + fi + + # determine user id + userid='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%U'`" != . ]; then + userid="`(id -u) 2>/dev/null`" + if [ ".$userid" = . ]; then + str="`(id) 2>/dev/null`" + if [ ".`echo $str | grep '^uid[ ]*=[ ]*[0-9]*('`" != . ]; then + userid=`echo $str | sed -e 's/^uid[ ]*=[ ]*//' -e 's/(.*//'` + fi + if [ ".$userid" = . ]; then + userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \ + sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$userid" = . ]; then + userid=`(ypcat passwd) 2>/dev/null | + egrep "^${username}:" | \ + sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'` + if [ ".$userid" = . ]; then + userid='?' + fi + fi + fi + fi + fi + + # determine host name + hostname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then + hostname="`(uname -n) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$hostname" = . ]; then + hostname="`(hostname) 2>/dev/null |\ + awk '{ printf("%s", $1); }'`" + if [ ".$hostname" = . ]; then + hostname='unknown' + fi + fi + case $hostname in + *.* ) + domainname=".`echo $hostname | cut -d. -f2-`" + hostname="`echo $hostname | cut -d. -f1`" + ;; + esac + fi + + # determine domain name + domainname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then + if [ ".$domainname" = . ]; then + if [ -f /etc/resolv.conf ]; then + domainname="`egrep '^[ ]*domain' /etc/resolv.conf | head -1 |\ + sed -e 's/.*domain//' \ + -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ + -e 's/^\.//' -e 's/^/./' |\ + awk '{ printf("%s", $1); }'`" + if [ ".$domainname" = . ]; then + domainname="`egrep '^[ ]*search' /etc/resolv.conf | head -1 |\ + sed -e 's/.*search//' \ + -e 's/^[ ]*//' -e 's/^ *//' -e 's/^ *//' \ + -e 's/ .*//' -e 's/ .*//' \ + -e 's/^\.//' -e 's/^/./' |\ + awk '{ printf("%s", $1); }'`" + fi + fi + fi + fi + + # determine current time + time_day='' + time_month='' + time_year='' + time_monthname='' + if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then + time_day=`date '+%d'` + time_month=`date '+%m'` + time_year=`date '+%Y' 2>/dev/null` + if [ ".$time_year" = . ]; then + time_year=`date '+%y'` + case $time_year in + [5-9][0-9]) time_year="19$time_year" ;; + [0-4][0-9]) time_year="20$time_year" ;; + esac + fi + case $time_month in + 1|01) time_monthname='Jan' ;; + 2|02) time_monthname='Feb' ;; + 3|03) time_monthname='Mar' ;; + 4|04) time_monthname='Apr' ;; + 5|05) time_monthname='May' ;; + 6|06) time_monthname='Jun' ;; + 7|07) time_monthname='Jul' ;; + 8|08) time_monthname='Aug' ;; + 9|09) time_monthname='Sep' ;; + 10) time_monthname='Oct' ;; + 11) time_monthname='Nov' ;; + 12) time_monthname='Dec' ;; + esac + fi + + # expand special ``%x'' constructs + if [ ".$opt_e" = .yes ]; then + text=`echo $seo "$text" |\ + sed -e "s/%B/${term_bold}/g" \ + -e "s/%b/${term_norm}/g" \ + -e "s/%u/${username}/g" \ + -e "s/%U/${userid}/g" \ + -e "s/%h/${hostname}/g" \ + -e "s/%d/${domainname}/g" \ + -e "s/%D/${time_day}/g" \ + -e "s/%M/${time_month}/g" \ + -e "s/%Y/${time_year}/g" \ + -e "s/%m/${time_monthname}/g" 2>/dev/null` + fi + + # create output + if [ .$opt_n = .no ]; then + echo $seo "$text" + else + # the harder part: echo -n is best, because + # awk may complain about some \xx sequences. + if [ ".$minusn" != . ]; then + echo $seo $minusn "$text" + else + echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text" + fi + fi + ;; + +install ) + ## + ## install -- Install a program, script or datafile + ## Copyright (c) 1997-2000 Ralf S. Engelschall + ## Originally written for shtool + ## + + # determine source(s) and destination + argc=$# + srcs="" + while [ $# -gt 1 ]; do + srcs="$srcs $1" + shift + done + dstpath="$1" + + # type check for destination + dstisdir=0 + if [ -d $dstpath ]; then + dstpath=`echo "$dstpath" | sed -e 's:/$::'` + dstisdir=1 + fi + + # consistency check for destination + if [ $argc -gt 2 -a $dstisdir = 0 ]; then + echo "$msgprefix:Error: multiple sources require destination to be directory" 1>&2 + exit 1 + fi + + # iterate over all source(s) + for src in $srcs; do + dst=$dstpath + + # If destination is a directory, append the input filename + if [ $dstisdir = 1 ]; then + dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'` + dst="$dst/$dstfile" + fi + + # Add a possible extension to src and dst + if [ ".$opt_e" != . ]; then + src="$src$opt_e" + dst="$dst$opt_e" + fi + + # Check for correct arguments + if [ ".$src" = ".$dst" ]; then + echo "$msgprefix:Warning: source and destination are the same - skipped" 1>&2 + continue + fi + if [ -d "$src" ]; then + echo "$msgprefix:Warning: source \`$src' is a directory - skipped" 1>&2 + continue + fi + + # Make a temp file name in the destination directory + dsttmp=`echo $dst |\ + sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;' \ + -e "s;\$;/#INST@$$#;"` + + # Verbosity + if [ ".$opt_v" = .yes ]; then + echo "$src -> $dst" 1>&2 + fi + + # Copy or move the file name to the temp name + # (because we might be not allowed to change the source) + if [ ".$opt_C" = .yes ]; then + opt_c=yes + fi + if [ ".$opt_c" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "cp $src $dsttmp" 1>&2 + fi + cp $src $dsttmp || exit $? + else + if [ ".$opt_t" = .yes ]; then + echo "mv $src $dsttmp" 1>&2 + fi + mv $src $dsttmp || exit $? + fi + + # Adjust the target file + # (we do chmod last to preserve setuid bits) + if [ ".$opt_s" = .yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "strip $dsttmp" 1>&2 + fi + strip $dsttmp || exit $? + fi + if [ ".$opt_o" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown $opt_o $dsttmp" 1>&2 + fi + chown $opt_o $dsttmp || exit $? + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp $opt_g $dsttmp" 1>&2 + fi + chgrp $opt_g $dsttmp || exit $? + fi + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m $dsttmp" 1>&2 + fi + chmod $opt_m $dsttmp || exit $? + fi + + # Determine whether to do a quick install + # (has to be done _after_ the strip was already done) + quick=no + if [ ".$opt_C" = .yes ]; then + if [ -r $dst ]; then + if cmp -s $src $dst; then + quick=yes + fi + fi + fi + + # Finally install the file to the real destination + if [ $quick = yes ]; then + if [ ".$opt_t" = .yes ]; then + echo "rm -f $dsttmp" 1>&2 + fi + rm -f $dsttmp + else + if [ ".$opt_t" = .yes ]; then + echo "rm -f $dst && mv $dsttmp $dst" 1>&2 + fi + rm -f $dst && mv $dsttmp $dst + fi + done + ;; + +mkdir ) + ## + ## mkdir -- Make one or more directories + ## Copyright (c) 1996-2000 Ralf S. Engelschall + ## Originally written for public domain by Noah Friedman + ## Cleaned up and enhanced for shtool + ## + + errstatus=0 + for p in ${1+"$@"}; do + # if the directory already exists... + if [ -d "$p" ]; then + if [ ".$opt_f" = .no ] && [ ".$opt_p" = .no ]; then + echo "$msgprefix:Error: directory already exists: $p" 1>&2 + errstatus=1 + break + else + continue + fi + fi + # if the directory has to be created... + if [ ".$opt_p" = .no ]; then + if [ ".$opt_t" = .yes ]; then + echo "mkdir $p" 1>&2 + fi + mkdir $p || errstatus=$? + else + # the smart situation + set fnord `echo ":$p" |\ + sed -e 's/^:\//%/' \ + -e 's/^://' \ + -e 's/\// /g' \ + -e 's/^%/\//'` + shift + pathcomp='' + for d in ${1+"$@"}; do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp="./$pathcomp" ;; + esac + if [ ! -d "$pathcomp" ]; then + if [ ".$opt_t" = .yes ]; then + echo "mkdir $pathcomp" 1>&2 + fi + mkdir $pathcomp || errstatus=$? + if [ ".$opt_m" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chmod $opt_m $pathcomp" 1>&2 + fi + chmod $opt_m $pathcomp || errstatus=$? + fi + fi + pathcomp="$pathcomp/" + done + fi + done + exit $errstatus + ;; + +fixperm ) + ## + ## fixperm -- Fix file permissions inside a source tree + ## Copyright (c) 1996-2000 Ralf S. Engelschall + ## Originally written for ePerl + ## + + paths="$*" + + # check whether the test command supports the -x option + if [ -x /bin/sh ] 2>/dev/null; then + minusx="-x" + else + minusx="-r" + fi + + # iterate over paths + for p in $paths; do + for file in `find $p -depth -print`; do + if [ -f $file ]; then + if [ $minusx $file ]; then + if [ ".$opt_v" = .yes ]; then + echo "-rwxrwxr-x $file" 2>&1 + fi + if [ ".$opt_t" = .yes ]; then + echo "chmod 775 $file" 2>&1 + fi + chmod 775 $file + else + if [ ".$opt_v" = .yes ]; then + echo "-rw-rw-r-- $file" 2>&1 + fi + if [ ".$opt_t" = .yes ]; then + echo "chmod 664 $file" 2>&1 + fi + chmod 664 $file + fi + continue + fi + if [ -d $file ]; then + if [ ".$opt_v" = .yes ]; then + echo "drwxrwxr-x $file" 2>&1 + fi + if [ ".$opt_t" = .yes ]; then + echo "chmod 775 $file" 2>&1 + fi + chmod 775 $file + continue + fi + if [ ".$opt_v" = .yes ]; then + echo "?????????? $file" 2>&1 + fi + done + done + ;; + +tarball ) + ## + ## tarball -- Roll distribution tarballs + ## Copyright (c) 1999-2000 Ralf S. Engelschall + ## Originally written for shtool + ## + + srcs="$*" + + # check whether the test command supports the -x option + if [ -x /bin/sh ] 2>/dev/null; then + minusx="-x" + else + minusx="-r" + fi + + # find the tools + paths="`echo $PATH |\ + sed -e 's%/*:%:%g' -e 's%/*$%%' \ + -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \ + -e 's/:/ /g'`" + for spec in find:gfind,find tar:gtar,tar tardy:tardy,tarcust; do + prg=`echo $spec | sed -e 's/:.*$//'` + tools=`echo $spec | sed -e 's/^.*://'` + eval "prg_${prg}=''" + # iterate over tools + for tool in `echo $tools | sed -e 's/,/ /g'`; do + # iterate over paths + for path in $paths; do + if [ $minusx "$path/$tool" ] && [ ! -d "$path/$tool" ]; then + eval "prg_${prg}=\"$path/$tool\"" + break + fi + done + eval "val=\$prg_${prg}" + if [ ".$val" != . ]; then + break + fi + done + done + + # expand source paths + exclude='' + for pat in `echo $opt_e | sed 's/,/ /g'`; do + exclude="$exclude | grep -v '$pat'" + done + if [ ".$opt_t" = .yes ]; then + echo "cp /dev/null $tmpfile.lst" 1>&2 + fi + cp /dev/null $tmpfile.lst + for src in $srcs; do + if [ -d $src ]; then + if [ ".$opt_t" = .yes ]; then + echo "(cd $src && $prg_find . -type f -depth -print) | sed -e 's:^\\.\$::' -e 's:^\\./::' | cat $exclude >>$tmpfile.lst" 1>&2 + fi + (cd $src && find . -type f -depth -print) |\ + sed -e 's:^\.$::' -e 's:^\./::' | eval cat $exclude >>$tmpfile.lst + else + if [ ".$opt_t" = .yes ]; then + echo "echo $src >>$tmpfile.lst" 1>&2 + fi + echo $src >>$tmpfile.lst + fi + done + sort <$tmpfile.lst >$tmpfile.lst.n + mv $tmpfile.lst.n $tmpfile.lst + if [ ".$opt_v" = .yes ]; then + cat $tmpfile.lst | sed -e 's/^/ /' 1>&2 + fi + + # determine tarball file and directory name + if [ ".$opt_o" != . ]; then + tarfile="$opt_o" + if [ ".$opt_d" != . ]; then + tarname="$opt_d" + else + tarname=`echo $tarfile | sed -e 's/\.tar.*$//' -e 's;.*/\([^/]*\)$;\1;'` + fi + else + if [ ".$opt_d" != . ]; then + tarname="$opt_d" + elif [ -d "$from" ]; then + tarname=`echo $from | sed -e 's;.*/\([^/]*\)$;\1;'` + else + tarname="out" + fi + tarfile="$tarname.tar" + fi + + # roll the tarball + compress='' + if [ ".$opt_c" != . ]; then + compress="| $opt_c" + fi + if [ ".$prg_tardy" != . ]; then + # the elegant hackers way + tardy_opt="--prefix=$tarname" + tardy_opt="$tardy_opt --user_number=0 --group_number=0" # security! + if [ ".$opt_u" != . ]; then + tardy_opt="$tardy_opt --user_name=$opt_u" + fi + if [ ".$opt_g" != . ]; then + tardy_opt="$tardy_opt --group_name=$opt_g" + fi + if [ ".$opt_t" = .yes ]; then + echo "cat $tmpfile.lst | xargs $prg_tar cf - | $prg_tardy $tardy_opt | cat $compress >$tmpfile.out" 1>&2 + fi + cat $tmpfile.lst |\ + xargs $prg_tar cf - |\ + $prg_tardy $tardy_opt |\ + eval cat $compress >$tmpfile.out + if [ ".$opt_t" = .yes ]; then + echo "cp $tmpfile.out $tarfile" 1>&2 + fi + cp $tmpfile.out $tarfile + else + # the portable standard way + if [ ".$opt_t" = .yes ]; then + echo "mkdir $tmpdir/$tarname" 1>&2 + fi + mkdir $tmpdir/$tarname || exit 1 + if [ ".$opt_t" = .yes ]; then + echo "cat $tmpfile.lst | xargs $prg_tar cf - | (cd $tmpdir/$tarname && $prg_tar xf -)" 1>&2 + fi + cat $tmpfile.lst |\ + xargs $prg_tar cf - |\ + (cd $tmpdir/$tarname && $prg_tar xf -) + if [ ".$opt_u" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1" 2>&1 + fi + chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1 ||\ + echo "$msgprefix:Warning: cannot set user name \`$opt_u' (would require root priviledges)" + fi + if [ ".$opt_g" != . ]; then + if [ ".$opt_t" = .yes ]; then + echo "chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1" 2>&1 + fi + chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1 ||\ + echo "$msgprefix:Warning: cannot set group name \`$opt_g' (would require root priviledges)" + fi + if [ ".$opt_t" = .yes ]; then + echo "(cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) | cat $compress >$tmpfile.out" 1>&2 + fi + (cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) |\ + eval cat $compress >$tmpfile.out + if [ ".$opt_t" = .yes ]; then + echo "cp $tmpfile.out $tarfile" 1>&2 + fi + cp $tmpfile.out $tarfile + if [ ".$opt_t" = .yes ]; then + echo "rm -rf $tmpdir/$tarname" 1>&2 + fi + rm -rf $tmpdir/$tarname + fi + + # cleanup + if [ ".$opt_t" = .yes ]; then + echo "rm -f $tmpfile.lst $tmpfile.out" 1>&2 + fi + rm -f $tmpfile.lst $tmpfile.out + ;; + +version ) + ## + ## version -- Generate and maintain a version information file + ## Copyright (c) 1994-2000 Ralf S. Engelschall + ## Originally written for ePerl + ## + + LANGUAGE="$opt_l" + NAME="$opt_n" + PREFIX="$opt_p" + FULLVERSION="$opt_s" + INCREASE="$opt_i" + REPORT="$opt_d" + FILE="$1" + + # determine language + if [ ".$LANGUAGE" = .unknown ]; then + case $FILE in + *.txt ) LANGUAGE=txt ;; + *.c ) LANGUAGE=c ;; + *.pl | *.pm ) LANGUAGE=perl ;; + *.py) LANGUAGE=python ;; + * ) echo "$tool:Error: unknown language type" 1>&2; exit 1 ;; + esac + fi + + # determine prefix from name and vice versa + if [ ".$PREFIX" = . -o ".$PREFIX" = .unknown ]; then + if [ ".$NAME" != . -a ".$NAME" != .unknown ]; then + PREFIX="$NAME" + fi + fi + if [ ".$NAME" = . -o ".$NAME" = .unknown ]; then + if [ ".$PREFIX" != . -a ".$PREFIX" != .unknown ]; then + NAME="$PREFIX" + fi + fi + + # determine version + date=unknown + version=0 + revision=0 + bplevel=0 + if [ ".$FULLVERSION" = .unknown ]; then + if [ -r "$FILE" ]; then + # grep out current information + id=`grep 'Version [0-9]*.[0-9]*[.abps][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $FILE | \ + head -1 | \ + sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([.abps]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\1:\2:\3:\4:\5%'` + version=`echo $id | awk -F: '{ print $1 }'` + revision=`echo $id | awk -F: '{ print $2 }'` + bptype=`echo $id | awk -F: '{ print $3 }'` + bplevel=`echo $id | awk -F: '{ print $4 }'` + date=`echo $id | awk -F: '{ print $5 }'` + if [ .$REPORT = .NO ]; then + case $INCREASE in + b ) bplevel=`expr $bplevel + 1` + bptype=b + ;; + a ) bplevel=`expr $bplevel + 1` + bptype=a + ;; + s ) bplevel=`expr $bplevel + 1` + bptype=s + ;; + P ) bplevel=`expr $bplevel + 1` + bptype=. + ;; + p ) bplevel=`expr $bplevel + 1` + bptype=p + ;; + r ) revision=`expr $revision + 1` + bptype=. + bplevel=0 + ;; + v ) version=`expr $version + 1` + revision=0 + bptype=. + bplevel=0 + ;; + esac + date=calc + fi + FULLVERSION="$version.$revision$bptype$bplevel" + else + # intialise to first version + version=0 + revision=5 + bptype=b + bplevel=0 + date=calc + fi + else + # take given version + V=`echo $FULLVERSION | sed -e 's%\([0-9]*\)\.\([0-9]*\)\([.abps]\)\([0-9]*\).*%\1:\2:\3:\4%'` + version=`echo $V | awk -F: '{ print $1 }'` + revision=`echo $V | awk -F: '{ print $2 }'` + bptype=`echo $V | awk -F: '{ print $3 }'` + bplevel=`echo $V | awk -F: '{ print $4 }'` + date=calc + fi + + # determine hex value of version + case $FULLVERSION in + *.*a* ) + HEX=`echo "$FULLVERSION" | sed -e 's/a.*//' | awk -F. '{ printf("%d%02d", $1, $2); }' && + echo "$FULLVERSION" | sed -e 's/.*a//' | awk '{ printf("0%02d", $1); }'` + ;; + *.*b* ) + HEX=`echo "$FULLVERSION" | sed -e 's/b.*//' | awk -F. '{ printf("%d%02d", $1, $2); }' && + echo "$FULLVERSION" | sed -e 's/.*b//' | awk '{ printf("1%02d", $1); }'` + ;; + *.*.* ) + HEX=`echo "$FULLVERSION" | awk -F. '{ printf("%d%02d2%02d", $1, $2, $3); }'` + ;; + esac + + # determine libtool version + case $FULLVERSION in + *.*a* ) + LTV=`echo "$FULLVERSION" | sed -e 's/a.*//' | awk -F. '{ printf("%d:0", $1*10+$2); }'` + ;; + *.*b* ) + LTV=`echo "$FULLVERSION" | sed -e 's/b.*//' | awk -F. '{ printf("%d:0", $1*10+$2); }'` + ;; + *.*.* ) + LTV=`echo "$FULLVERSION" | awk -F. '{ printf("%d:%d", $1*10+$2, $3); }'` + ;; + esac + + # determine string out of filename + # (don't try to optimize this in any way - portability!) + FILESTR=`echo "$FILE" |\ + tr 'abcdefghijklmnopqrstuvwxyz./%+' \ + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ____' | sed -e 's/-/_/g'` + + # determine date + if [ ".$date" = .calc ]; then + day=`date '+%d'` + month=`date '+%m'` + year=`date '+%Y' 2>/dev/null` + if [ ".$time_year" = . ]; then + year=`date '+%y'` + case $year in + [5-9][0-9]) year="19$year" ;; + [0-4][0-9]) year="20$year" ;; + esac + fi + case $month in + 1|01) month='Jan' ;; + 2|02) month='Feb' ;; + 3|03) month='Mar' ;; + 4|04) month='Apr' ;; + 5|05) month='May' ;; + 6|06) month='Jun' ;; + 7|07) month='Jul' ;; + 8|08) month='Aug' ;; + 9|09) month='Sep' ;; + 10) month='Oct' ;; + 11) month='Nov' ;; + 12) month='Dec' ;; + esac + date="${day}-${month}-${year}" + fi + + if [ .$REPORT != .NO ]; then + case $REPORT in + long ) + echo "$version.$revision$bptype$bplevel ($date)" + ;; + short ) + echo "$version.$revision$bptype$bplevel" + ;; + libtool ) + echo "$LTV" + ;; + hex ) + echo "0x$HEX" + ;; + esac + rm -f $tmpfile >/dev/null 2>&1 + exit 0 + fi + + # create the version file according the the selected language + echo "new version: $version.$revision$bptype$bplevel ($date)" + case $LANGUAGE in + txt ) + cat >$tmpfile <<'EOT' + + This is @NAME@, Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@) + +EOT + ;; + c ) + cat >$tmpfile <<'EOT' +/* +** @FILE@ -- Version Information +** [automatically generated and maintained by GNU shtool] +*/ + +#ifdef _AS_HEADER + +#ifndef _@FILESTR@ +#define _@FILESTR@ +#define @PREFIX@_VERSION 0x@HEX@ +extern const int @PREFIX@_Version; +extern const char @PREFIX@_VersionStr[]; +extern const char @PREFIX@_Hello[]; +extern const char @PREFIX@_GNUVersion[]; +extern const char @PREFIX@_WhatID[]; +extern const char @PREFIX@_RCSIdentID[]; +extern const char @PREFIX@_WebID[]; +extern const char @PREFIX@_PlainID[]; +#endif /* _@FILESTR@ */ + +#else + +const int @PREFIX@_Version = 0x@HEX@; +const char @PREFIX@_VersionStr[] = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)"; +const char @PREFIX@_Hello[] = "This is @NAME@, Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)"; +const char @PREFIX@_GNUVersion[] = "@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@"; +const char @PREFIX@_WhatID[] = "@(#)@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)"; +const char @PREFIX@_RCSIdentID[] = "$Id$"; +const char @PREFIX@_WebID[] = "@NAME@/@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@"; +const char @PREFIX@_PlainID[] = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@"; + +#endif + +EOT + ;; + perl ) + cat >$tmpfile <<'EOT' +## +## @FILE@ -- Version Information +## [automatically generated and maintained by GNU shtool] +## + +$@PREFIX@_Version = 0x@HEX@; +$@PREFIX@_VersionStr = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)"; +$@PREFIX@_Hello = "This is @NAME@, Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)"; +$@PREFIX@_GNUVersion = "@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@"; +$@PREFIX@_WhatID = "@(#)@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)"; +$@PREFIX@_RCSIdentID = "\$Id$/"; +$@PREFIX@_WebID = "@NAME@/@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@"; +$@PREFIX@_PlainID = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@"; + +1; +EOT + ;; + python ) + cat >$tmpfile <<'EOT' +## +## @FILE@ -- Version Information +## [automatically generated and maintained by GNU shtool] +## + +@PREFIX@_Version = 0x@HEX@ +@PREFIX@_VersionStr = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)" +@PREFIX@_Hello = "This is @NAME@, Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)" +@PREFIX@_GNUVersion = "@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@" +@PREFIX@_WhatID = "@(#)@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)" +@PREFIX@_RCSIdentID = "$Id$" +@PREFIX@_WebID = "@NAME@/@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@" +@PREFIX@_PlainID = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@" + +EOT + ;; + esac + + # now create the version file + rm -f $FILE >/dev/null 2>&1 + sed \ + -e "s|@FILE@|$FILE|g" \ + -e "s|@FILESTR@|$FILESTR|g" \ + -e "s|@PREFIX@|$PREFIX|g" \ + -e "s|@NAME@|$NAME|g" \ + -e "s|@HEX@|$HEX|g" \ + -e "s|@VERSION@|$version|g" \ + -e "s|@REVISION@|$revision|g" \ + -e "s|@BPTYPE@|$bptype|g" \ + -e "s|@BPLEVEL@|$bplevel|g" \ + -e "s|@YEAR@|$year|g" \ + -e "s|@MONTH@|$month|g" \ + -e "s|@DAY@|$day|g" <$tmpfile >$FILE + rm -f $tmpfile >/dev/null 2>&1 + exit 0 + ;; + +path ) + ## + ## path -- Deal with program paths + ## Copyright (c) 1998-2000 Ralf S. Engelschall + ## Originally written for Apache + ## + + namelist="$*" + + # check whether the test command supports the -x option + if [ -x /bin/sh ] 2>/dev/null; then + minusx="-x" + else + minusx="-r" + fi + + # split path string + paths="`echo $opt_p |\ + sed -e 's/^:/.:/' \ + -e 's/::/:.:/g' \ + -e 's/:$/:./' \ + -e 's/:/ /g'`" + + # SPECIAL REQUEST + # translate forward to reverse path + if [ ".$opt_r" = .yes ]; then + if [ "x$namelist" = "x." ]; then + rp='.' + else + rp='' + for pe in `IFS="$IFS/"; echo $namelist`; do + rp="../$rp" + done + fi + echo $rp | sed -e 's:/$::' + exit 0 + fi + + # SPECIAL REQUEST + # strip out directory or base name + if [ ".$opt_d" = .yes ]; then + echo "$namelist" |\ + sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' + exit 0 + fi + if [ ".$opt_b" = .yes ]; then + echo "$namelist" |\ + sed -e 's;.*/\([^/]*\)$;\1;' + exit 0 + fi + + # MAGIC SITUATION + # Perl Interpreter (perl) + if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then + rm -f $tmpfile + touch $tmpfile + found=0 + pc=99 + for dir in $paths; do + dir=`echo $dir | sed -e 's;/*$;;'` + nc=99 + for name in perl perl5 miniperl; do + if [ $minusx "$dir/$name" ] && [ ! -d "$dir/$name" ]; then + perl="$dir/$name" + pv=`$perl -e 'printf("%.3f", $]);'` + echo "$pv:$pc:$nc:$perl" >>$tmpfile + found=1 + fi + nc=`expr $nc - 1` + done + pc=`expr $pc - 1` + done + if [ $found = 1 ]; then + perl="`cat $tmpfile | sort -u | tail -1 | cut -d: -f4`" + rm -f $tmpfile + echo "$perl" + exit 0 + fi + exit 1 + fi + + # MAGIC SITUATION + # C pre-processor (cpp) + if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then + cat >$tmpfile.c <<'EOT' +#include +Syntax Error +EOT + # 1. try the standard cc -E approach + cpp="${CC-cc} -E" + (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out + my_error=`grep -v '^ *+' $tmpfile.out` + if [ ".$my_error" != . ]; then + # 2. try the cc -E approach and GCC's -traditional-ccp option + cpp="${CC-cc} -E -traditional-cpp" + (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out + my_error=`grep -v '^ *+' $tmpfile.out` + if [ ".$my_error" != . ]; then + # 3. try a standalone cpp command in path and lib dirs + for path in $paths /lib /usr/lib /usr/local/lib; do + path=`echo $path | sed -e 's;/*$;;'` + if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then + cpp="$path/cpp" + break + fi + done + if [ ".$cpp" != . ]; then + (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out + my_error=`grep -v '^ *+' $tmpfile.out` + if [ ".$my_error" != . ]; then + # ok, we gave up... + cpp='' + fi + fi + fi + fi + rm -f $tmpfile.c $tmpfile.out + if [ ".$cpp" != . ]; then + echo "$cpp" + exit 0 + fi + exit 1 + fi + + # STANDARD SITUATION + # iterate over names + for name in $namelist; do + # iterate over paths + for path in $paths; do + path=`echo $path | sed -e 's;/*$;;'` + if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then + if [ ".$opt_s" != .yes ]; then + echo "$path/$name" 2>&1 + fi + exit 0 + fi + done + done + exit 1 + ;; + +esac + +exit 0 + +##EOF##