source: trunk/third/gnome2-user-docs/install-sh @ 21068

Revision 21068, 9.0 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r21067, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
Line 
1#!/bin/sh
2# install - install a program, script, or datafile
3
4scriptversion=2004-02-15.20
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.
9#
10# Copyright (C) 1994 X Consortium
11#
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:
18#
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#
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
61transformbasename=
62transform_arg=
63instcmd="$mvprog"
64chmodcmd="$chmodprog 0755"
65chowncmd=
66chgrpcmd=
67stripcmd=
68rmcmd="$rmprog -f"
69mvcmd="$mvprog"
70src=
71dst=
72dir_arg=
73
74usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
75   or: $0 [OPTION]... SRCFILES... DIRECTORY
76   or: $0 -d DIRECTORIES...
77
78In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
79In the second, create the directory path DIR.
80
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.
92
93Environment variables override the default commands:
94  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
95"
96
97while test -n "$1"; do
98  case $1 in
99    -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
100        shift
101        continue;;
102
103    -c) instcmd=$cpprog
104        shift
105        continue;;
106
107    -d) dir_arg=true
108        shift
109        continue;;
110
111    -g) chgrpcmd="$chgrpprog $2"
112        shift
113        shift
114        continue;;
115
116    --help) echo "$usage"; exit 0;;
117
118    -m) chmodcmd="$chmodprog $2"
119        shift
120        shift
121        continue;;
122
123    -o) chowncmd="$chownprog $2"
124        shift
125        shift
126        continue;;
127
128    -s) stripcmd=$stripprog
129        shift
130        continue;;
131
132    -t=*) transformarg=`echo $1 | sed 's/-t=//'`
133        shift
134        continue;;
135
136    --version) echo "$0 $scriptversion"; exit 0;;
137
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
163fi
164
165for src
166do
167  # Protect names starting with `-'.
168  case $src in
169    -*) src=./$src ;;
170  esac
171
172  if test -n "$dir_arg"; then
173    dst=$src
174    src=
175
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
190
191    if test -z "$dstarg"; then
192      echo "$0: no destination specified." >&2
193      exit 1
194    fi
195
196    dst=$dstarg
197    # Protect names starting with `-'.
198    case $dst in
199      -*) dst=./$dst ;;
200    esac
201
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
208
209  # This sed command emulates the dirname command.
210  dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
211
212  # Make sure that the destination directory exists.
213
214  # Skip lots of stat calls in the usual case.
215  if test ! -d "$dstdir"; then
216    defaultIFS='
217         '
218    IFS="${IFS-$defaultIFS}"
219
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
225
226    pathcomp=
227
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
241
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"; }
248
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
257
258    # don't allow the sed command to completely eliminate the filename.
259    test -z "$dstfile" && dstfile=`basename "$dst"`
260
261    # Make a couple of temp file names in the proper directory.
262    dsttmp=$dstdir/_inst.$$_
263    rmtmp=$dstdir/_rm.$$_
264
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
268
269    # Move or copy the file name to the temp name
270    $doit $instcmd "$src" "$dsttmp" &&
271
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"; } &&
282
283    # Now remove or move aside any old file at destination location.  We
284    # try this two ways since rm can't unlink itself on some systems and
285    # the destination file might be busy for other reasons.  In this case,
286    # the final cleanup might fail but the new file should still install
287    # successfully.
288    {
289      if test -f "$dstdir/$dstfile"; then
290        $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
291        || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
292        || {
293          echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
294          (exit 1); exit
295        }
296      else
297        :
298      fi
299    } &&
300
301    # Now rename the file to the real destination.
302    $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
303  fi || { (exit 1); exit; }
304done
305
306# The final little trick to "correctly" pass the exit status to the exit trap.
307{
308  (exit 0); exit
309}
310
311# Local variables:
312# eval: (add-hook 'write-file-hooks 'time-stamp)
313# time-stamp-start: "scriptversion="
314# time-stamp-format: "%:y-%02m-%02d.%02H"
315# time-stamp-end: "$"
316# End:
Note: See TracBrowser for help on using the repository browser.