gitrev.sh: disable dirty-tree check
[dragonfly.git] / usr.sbin / manctl / manctl.sh
blob9e96dc777494cf19478b03658944cd86d723041b
1 #!/bin/sh
3 # Copyright (c) 1994 Geoffrey M. Rehmet, Rhodes University
4 # All rights reserved.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 # notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 # notice, this list of conditions and the following disclaimer in the
13 # documentation and/or other materials provided with the distribution.
14 # 3. All advertising materials mentioning features or use of this software
15 # must display the following acknowledgement:
16 # This product includes software developed by Geoffrey M. Rehmet
17 # 4. Neither the name of Geoffrey M. Rehmet nor that of Rhodes University
18 # may be used to endorse or promote products derived from this software
19 # without specific prior written permission.
21 # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 # IN NO EVENT SHALL GEOFFREY M. REHMET OR RHODES UNIVERSITY BE LIABLE
25 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 # SUCH DAMAGE.
33 # $FreeBSD: src/usr.sbin/manctl/manctl.sh,v 1.11.2.1 2001/02/05 13:53:03 jedgar Exp $
34 # $DragonFly: src/usr.sbin/manctl/manctl.sh,v 1.2 2003/06/17 04:29:57 dillon Exp $
36 # manctl:
37 # a utility for manipulating manual pages
38 # functions:
39 # compress uncompressed man pages (elliminating .so's)
40 # this is now two-pass. If possible, .so's
41 # are replaced with hard links
42 # uncompress compressed man pages
43 # purge old formatted man pages (not implemented yet)
44 # Things to watch out for:
45 # Hard links - careful with g(un)zipping!
46 # .so's - throw everything through soelim before gzip!
47 # symlinks - ignore these - eg: expn is its own man page:
48 # don't want to compress this!
50 PATH=/bin:/sbin:/usr/bin:/usr/sbin; export PATH
53 # purge cat? directories
55 do_purge()
57 echo "purge $@" 2>&1
58 echo "not implemented yet\n" 2>&1
63 # Uncompress one page
65 uncompress_page()
67 local pname
68 local fname
69 local sect
70 local ext
72 # break up file name
73 pname=$1
74 IFS='.' ; set $pname
75 # less than 3 fields - don't know what to do with this
76 if [ $# -lt 3 ] ; then
77 IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ;
79 # construct name and section
80 fname=$1 ; shift
81 while [ $# -gt 2 ] ; do
82 fname=$fname.$1
83 shift
84 done
85 sect=$1
86 ext=$2
88 IFS=" "
89 case "$ext" in
90 gz|Z) {
91 IFS=" " ; set `file $pname`
92 if [ $2 != "gzip" ] ; then
93 echo moving hard link $pname 1>&2
94 mv $pname $fname.$ext # link
95 else
96 if [ $2 != "symbolic" ] ; then
97 echo gunzipping page $pname 1>&2
98 temp=`mktemp -t manager` || exit 1
99 gunzip -c $pname > $temp
100 chmod u+w $pname
101 cp $temp $pname
102 chmod 444 $pname
103 mv $pname $fname.$sect
104 rm -f $temp
105 else
106 # skip symlinks - this can be
107 # a program like expn, which is
108 # its own man page !
109 echo skipping symlink $pname 1>&2
111 fi };;
112 *) {
113 IFS=" "
114 echo skipping file $pname 1>&2
115 } ;;
116 esac
117 # reset IFS - this is important!
118 IFS=" "
123 # Uncompress manpages in paths
125 do_uncompress()
127 local i
128 local dir
129 local workdir
131 workdir=`pwd`
132 while [ $# != 0 ] ; do
133 if [ -d $1 ] ; then
134 dir=$1
135 cd $dir
136 for i in * ; do
137 case $i in
138 *cat?) ;; # ignore cat directories
139 *) {
140 if [ -d $i ] ; then
141 do_uncompress $i
142 else
143 if [ -e $i ] ; then
144 uncompress_page $i
146 fi } ;;
147 esac
148 done
149 cd $workdir
150 else
151 echo "directory $1 not found" 1>&2
153 shift
154 done
158 # Remove .so's from one file
160 so_purge_page()
162 local so_entries
163 local lines
164 local fname
166 so_entries=`grep "^\.so" $1 | wc -l`
167 if [ $so_entries -eq 0 ] ; then return 0 ; fi
169 # we have a page with a .so in it
170 echo $1 contains a .so entry 2>&1
172 # now check how many lines in the file
173 lines=`wc -l < $1`
175 # if the file is only one line long, we can replace it
176 # with a hard link!
177 if [ $lines -eq 1 ] ; then
178 fname=$1;
179 echo replacing $fname with a hard link
180 set `cat $fname`;
181 rm -f $fname
182 ln ../$2 $fname
183 else
184 echo inlining page $fname 1>&2
185 temp=`mktemp -t manager` || exit 1
186 cat $fname | \
187 (cd .. ; soelim ) > $temp
188 chmod u+w $fname
189 cp $temp $fname
190 chmod 444 $fname
191 rm -f $temp
196 # Remove .so entries from man pages
197 # If a page consists of just one line with a .so,
198 # replace it with a hard link
200 remove_so()
202 local pname
203 local fname
204 local sect
206 # break up file name
207 pname=$1
208 IFS='.' ; set $pname
209 if [ $# -lt 2 ] ; then
210 IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ;
212 # construct name and section
213 fname=$1 ; shift
214 while [ $# -gt 1 ] ; do
215 fname=$fname.$1
216 shift
217 done
218 sect=$1
220 IFS=" "
221 case "$sect" in
222 gz) { echo file $pname already gzipped 1>&2 ; } ;;
223 Z) { echo file $pname already compressed 1>&2 ; } ;;
224 [12345678ln]*){
225 IFS=" " ; set `file $pname`
226 if [ $2 = "gzip" ] ; then
227 echo moving hard link $pname 1>&2
228 mv $pname $pname.gz # link
229 else
230 if [ $2 != "symbolic" ] ; then
231 echo "removing .so's in page $pname" 1>&2
232 so_purge_page $pname
233 else
234 # skip symlink - this can be
235 # a program like expn, which is
236 # its own man page !
237 echo skipping symlink $pname 1>&2
239 fi };;
240 *) {
241 IFS=" "
242 echo skipping file $pname 1>&2
243 } ;;
244 esac
245 # reset IFS - this is important!
246 IFS=" "
251 # compress one page
252 # We need to watch out for hard links here.
254 compress_page()
256 local pname
257 local fname
258 local sect
260 # break up file name
261 pname=$1
262 IFS='.' ; set $pname
263 if [ $# -lt 2 ] ; then
264 IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ;
266 # construct name and section
267 fname=$1 ; shift
268 while [ $# -gt 1 ] ; do
269 fname=$fname.$1
270 shift
271 done
272 sect=$1
274 IFS=" "
275 case "$sect" in
276 gz) { echo file $pname already gzipped 1>&2 ; } ;;
277 Z) { echo file $pname already compressed 1>&2 ; } ;;
278 [12345678ln]*){
279 IFS=" " ; set `file $pname`
280 if [ $2 = "gzip" ] ; then
281 echo moving hard link $pname 1>&2
282 mv $pname $pname.gz # link
283 else
284 if [ $2 != "symbolic" ] ; then
285 echo gzipping page $pname 1>&2
286 temp=`mktemp -t manager` || exit 1
287 cat $pname | \
288 (cd .. ; soelim )| gzip -c -- > $temp
289 chmod u+w $pname
290 cp $temp $pname
291 chmod 444 $pname
292 mv $pname $pname.gz
293 rm -f $temp
294 else
295 # skip symlink - this can be
296 # a program like expn, which is
297 # its own man page !
298 echo skipping symlink $pname 1>&2
300 fi };;
301 *) {
302 IFS=" "
303 echo skipping file $pname 1>&2
304 } ;;
305 esac
306 # reset IFS - this is important!
307 IFS=" "
311 # Compress man pages in paths
313 do_compress_so()
315 local i
316 local dir
317 local workdir
318 local what
320 what=$1
321 shift
322 workdir=`pwd`
323 while [ $# != 0 ] ; do
324 if [ -d $1 ] ; then
325 dir=$1
326 cd $dir
327 for i in * ; do
328 case $i in
329 *cat?) ;; # ignore cat directories
330 *) {
331 if [ -d $i ] ; then
332 do_compress_so $what $i
333 else
334 if [ -e $i ] ; then
335 $what $i
337 fi } ;;
338 esac
339 done
340 cd $workdir
341 else
342 echo "directory $1 not found" 1>&2
344 shift
345 done
349 # Display a usage message
351 ctl_usage()
353 echo "usage: $1 -compress <path> ... " 1>&2
354 echo " $1 -uncompress <path> ... " 1>&2
355 echo " $1 -purge <days> <path> ... " 1>&2
356 echo " $1 -purge expire <path> ... " 1>&2
357 exit 1
361 # remove .so's and do compress
363 do_compress()
365 # First remove all so's from the pages to be compressed
366 do_compress_so remove_so "$@"
367 # now do ahead and compress the pages
368 do_compress_so compress_page "$@"
372 # dispatch options
374 if [ $# -lt 2 ] ; then ctl_usage $0 ; fi ;
376 case "$1" in
377 -compress) shift ; do_compress "$@" ;;
378 -uncompress) shift ; do_uncompress "$@" ;;
379 -purge) shift ; do_purge "$@" ;;
380 *) ctl_usage $0 ;;
381 esac