source: trunk/third/libgtkhtml/install-sh @ 21514

Revision 21514, 9.3 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21513, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
RevLine 
[18343]1#!/bin/sh
2# install - install a program, script, or datafile
[21513]3
4scriptversion=2004-04-01.17
5
6# This originates from X11R5 (mit/util/scripts/install.sh), which was
7# later released in X11R6 (xc/config/util/install.sh) with the
8# following copyright and license.
[18343]9#
[21513]10# Copyright (C) 1994 X Consortium
[18343]11#
[21513]12# Permission is hereby granted, free of charge, to any person obtaining a copy
13# of this software and associated documentation files (the "Software"), to
14# deal in the Software without restriction, including without limitation the
15# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16# sell copies of the Software, and to permit persons to whom the Software is
17# furnished to do so, subject to the following conditions:
[18343]18#
[21513]19# The above copyright notice and this permission notice shall be included in
20# all copies or substantial portions of the Software.
21#
22# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
25# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
27# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28#
29# Except as contained in this notice, the name of the X Consortium shall not
30# be used in advertising or otherwise to promote the sale, use or other deal-
31# ings in this Software without prior written authorization from the X Consor-
32# tium.
33#
34#
35# FSF changes to this file are in the public domain.
36#
[18343]37# Calling this script install-sh is preferred over install.sh, to prevent
38# `make' implicit rules from creating a file called install from it
39# when there is no Makefile.
40#
41# This script is compatible with the BSD install script, but was written
42# from scratch.  It can only install one file at a time, a restriction
43# shared with many OS's install programs.
44
45# set DOITPROG to echo to test this script
46
47# Don't use :- since 4.3BSD and earlier shells don't like it.
48doit="${DOITPROG-}"
49
50# put in absolute paths if you don't have them in your path; or use env. vars.
51
52mvprog="${MVPROG-mv}"
53cpprog="${CPPROG-cp}"
54chmodprog="${CHMODPROG-chmod}"
55chownprog="${CHOWNPROG-chown}"
56chgrpprog="${CHGRPPROG-chgrp}"
57stripprog="${STRIPPROG-strip}"
58rmprog="${RMPROG-rm}"
59mkdirprog="${MKDIRPROG-mkdir}"
60
[21513]61transformbasename=
62transform_arg=
[18343]63instcmd="$mvprog"
64chmodcmd="$chmodprog 0755"
[21513]65chowncmd=
66chgrpcmd=
67stripcmd=
[18343]68rmcmd="$rmprog -f"
69mvcmd="$mvprog"
[21513]70src=
71dst=
72dir_arg=
[18343]73
[21513]74usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
75   or: $0 [OPTION]... SRCFILES... DIRECTORY
76   or: $0 -d DIRECTORIES...
[18343]77
[21513]78In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
79In the second, create the directory path DIR.
[18343]80
[21513]81Options:
82-b=TRANSFORMBASENAME
83-c         copy source (using $cpprog) instead of moving (using $mvprog).
84-d         create directories instead of installing files.
85-g GROUP   $chgrp installed files to GROUP.
86-m MODE    $chmod installed files to MODE.
87-o USER    $chown installed files to USER.
88-s         strip installed files (using $stripprog).
89-t=TRANSFORM
90--help     display this help and exit.
91--version  display version info and exit.
[18343]92
[21513]93Environment variables override the default commands:
94  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
95"
[18343]96
[21513]97while test -n "$1"; do
98  case $1 in
99    -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
100        shift
101        continue;;
[18343]102
[21513]103    -c) instcmd=$cpprog
104        shift
105        continue;;
[18343]106
[21513]107    -d) dir_arg=true
108        shift
109        continue;;
[18343]110
[21513]111    -g) chgrpcmd="$chgrpprog $2"
112        shift
113        shift
114        continue;;
[18343]115
[21513]116    --help) echo "$usage"; exit 0;;
[18343]117
[21513]118    -m) chmodcmd="$chmodprog $2"
119        shift
120        shift
121        continue;;
[18343]122
[21513]123    -o) chowncmd="$chownprog $2"
124        shift
125        shift
126        continue;;
[18343]127
[21513]128    -s) stripcmd=$stripprog
129        shift
130        continue;;
[18343]131
[21513]132    -t=*) transformarg=`echo $1 | sed 's/-t=//'`
133        shift
134        continue;;
[18343]135
[21513]136    --version) echo "$0 $scriptversion"; exit 0;;
[18343]137
[21513]138    *)  # When -d is used, all remaining arguments are directories to create.
139        test -n "$dir_arg" && break
140        # Otherwise, the last argument is the destination.  Remove it from $@.
141        for arg
142        do
143          if test -n "$dstarg"; then
144            # $@ is not empty: it contains at least $arg.
145            set fnord "$@" "$dstarg"
146            shift # fnord
147          fi
148          shift # arg
149          dstarg=$arg
150        done
151        break;;
152  esac
153done
154
155if test -z "$1"; then
156  if test -z "$dir_arg"; then
157    echo "$0: no input file specified." >&2
158    exit 1
159  fi
160  # It's OK to call `install-sh -d' without argument.
161  # This can happen when creating conditional directories.
162  exit 0
[18343]163fi
164
[21513]165for src
166do
167  # Protect names starting with `-'.
168  case $src in
169    -*) src=./$src ;;
170  esac
[18343]171
[21513]172  if test -n "$dir_arg"; then
173    dst=$src
174    src=
[18343]175
[21513]176    if test -d "$dst"; then
177      instcmd=:
178      chmodcmd=
179    else
180      instcmd=$mkdirprog
181    fi
182  else
183    # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
184    # might cause directories to be created, which would be especially bad
185    # if $src (and thus $dsttmp) contains '*'.
186    if test ! -f "$src" && test ! -d "$src"; then
187      echo "$0: $src does not exist." >&2
188      exit 1
189    fi
[18343]190
[21513]191    if test -z "$dstarg"; then
192      echo "$0: no destination specified." >&2
193      exit 1
194    fi
[18343]195
[21513]196    dst=$dstarg
197    # Protect names starting with `-'.
198    case $dst in
199      -*) dst=./$dst ;;
200    esac
[18343]201
[21513]202    # If destination is a directory, append the input filename; won't work
203    # if double slashes aren't ignored.
204    if test -d "$dst"; then
205      dst=$dst/`basename "$src"`
206    fi
207  fi
[18343]208
[21513]209  # This sed command emulates the dirname command.
210  dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
[18343]211
[21513]212  # Make sure that the destination directory exists.
[18343]213
[21513]214  # Skip lots of stat calls in the usual case.
215  if test ! -d "$dstdir"; then
216    defaultIFS='
217         '
218    IFS="${IFS-$defaultIFS}"
[18343]219
[21513]220    oIFS=$IFS
221    # Some sh's can't handle IFS=/ for some reason.
222    IFS='%'
223    set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
224    IFS=$oIFS
[18343]225
[21513]226    pathcomp=
[18343]227
[21513]228    while test $# -ne 0 ; do
229      pathcomp=$pathcomp$1
230      shift
231      if test ! -d "$pathcomp"; then
232        $mkdirprog "$pathcomp" || lasterr=$?
233        # mkdir can fail with a `File exist' error in case several
234        # install-sh are creating the directory concurrently.  This
235        # is OK.
236        test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; }
237      fi
238      pathcomp=$pathcomp/
239    done
240  fi
[18343]241
[21513]242  if test -n "$dir_arg"; then
243    $doit $instcmd "$dst" \
244      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
245      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
246      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
247      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
[18343]248
[21513]249  else
250    # If we're going to rename the final executable, determine the name now.
251    if test -z "$transformarg"; then
252      dstfile=`basename "$dst"`
253    else
254      dstfile=`basename "$dst" $transformbasename \
255               | sed $transformarg`$transformbasename
256    fi
[18343]257
[21513]258    # don't allow the sed command to completely eliminate the filename.
259    test -z "$dstfile" && dstfile=`basename "$dst"`
[18343]260
[21513]261    # Make a couple of temp file names in the proper directory.
262    dsttmp=$dstdir/_inst.$$_
263    rmtmp=$dstdir/_rm.$$_
[18343]264
[21513]265    # Trap to clean up those temp files at exit.
266    trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
267    trap '(exit $?); exit' 1 2 13 15
[18343]268
[21513]269    # Move or copy the file name to the temp name
270    $doit $instcmd "$src" "$dsttmp" &&
[18343]271
[21513]272    # and set any options; do chmod last to preserve setuid bits.
273    #
274    # If any of these fail, we abort the whole thing.  If we want to
275    # ignore errors from any of these, just make sure not to ignore
276    # errors from the above "$doit $instcmd $src $dsttmp" command.
277    #
278    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
279      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
280      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
281      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
[18343]282
[21513]283    # Now rename the file to the real destination.
284    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
285      || {
286           # The rename failed, perhaps because mv can't rename something else
287           # to itself, or perhaps because mv is so ancient that it does not
288           # support -f.
[18343]289
[21513]290           # Now remove or move aside any old file at destination location.
291           # We try this two ways since rm can't unlink itself on some
292           # systems and the destination file might be busy for other
293           # reasons.  In this case, the final cleanup might fail but the new
294           # file should still install successfully.
295           {
296             if test -f "$dstdir/$dstfile"; then
297               $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
298               || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
299               || {
300                 echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
301                 (exit 1); exit
302               }
303             else
304               :
305             fi
306           } &&
[18343]307
[21513]308           # Now rename the file to the real destination.
309           $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
310         }
311    }
312  fi || { (exit 1); exit; }
313done
[18343]314
[21513]315# The final little trick to "correctly" pass the exit status to the exit trap.
316{
317  (exit 0); exit
318}
[18343]319
[21513]320# Local variables:
321# eval: (add-hook 'write-file-hooks 'time-stamp)
322# time-stamp-start: "scriptversion="
323# time-stamp-format: "%:y-%02m-%02d.%02H"
324# time-stamp-end: "$"
325# End:
Note: See TracBrowser for help on using the repository browser.