source: trunk/third/diffutils/install-sh @ 16149

Revision 16149, 4.7 KB checked in by rbasch, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r16148, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
Line 
1#!/bin/sh
2#
3# install - install a program, script, or datafile
4# This comes from X11R5.
5#
6# Calling this script install-sh is preferred over install.sh, to prevent
7# `make' implicit rules from creating a file called install from it
8# when there is no Makefile.
9#
10# This script is compatible with the BSD install script, but was written
11# from scratch.
12#
13
14
15# set DOITPROG to echo to test this script
16
17# Don't use :- since 4.3BSD and earlier shells don't like it.
18doit="${DOITPROG-}"
19
20
21# put in absolute paths if you don't have them in your path; or use env. vars.
22
23mvprog="${MVPROG-mv}"
24cpprog="${CPPROG-cp}"
25chmodprog="${CHMODPROG-chmod}"
26chownprog="${CHOWNPROG-chown}"
27chgrpprog="${CHGRPPROG-chgrp}"
28stripprog="${STRIPPROG-strip}"
29rmprog="${RMPROG-rm}"
30mkdirprog="${MKDIRPROG-mkdir}"
31
32tranformbasename=""
33transform_arg=""
34instcmd="$mvprog"
35chmodcmd="$chmodprog 0755"
36chowncmd=""
37chgrpcmd=""
38stripcmd=""
39rmcmd="$rmprog -f"
40mvcmd="$mvprog"
41src=""
42dst=""
43dir_arg=""
44
45while [ x"$1" != x ]; do
46    case $1 in
47        -c) instcmd="$cpprog"
48            shift
49            continue;;
50
51        -d) dir_arg=true
52            shift
53            continue;;
54
55        -m) chmodcmd="$chmodprog $2"
56            shift
57            shift
58            continue;;
59
60        -o) chowncmd="$chownprog $2"
61            shift
62            shift
63            continue;;
64
65        -g) chgrpcmd="$chgrpprog $2"
66            shift
67            shift
68            continue;;
69
70        -s) stripcmd="$stripprog"
71            shift
72            continue;;
73
74        -t=*) transformarg=`echo $1 | sed 's/-t=//'`
75            shift
76            continue;;
77
78        -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
79            shift
80            continue;;
81
82        *)  if [ x"$src" = x ]
83            then
84                src=$1
85            else
86                # this colon is to work around a 386BSD /bin/sh bug
87                :
88                dst=$1
89            fi
90            shift
91            continue;;
92    esac
93done
94
95if [ x"$src" = x ]
96then
97        echo "install:  no input file specified"
98        exit 1
99else
100        true
101fi
102
103if [ x"$dir_arg" != x ]; then
104        dst=$src
105        src=""
106       
107        if [ -d $dst ]; then
108                instcmd=:
109        else
110                instcmd=mkdir
111        fi
112else
113
114# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
115# might cause directories to be created, which would be especially bad
116# if $src (and thus $dsttmp) contains '*'.
117
118        if [ -f $src -o -d $src ]
119        then
120                true
121        else
122                echo "install:  $src does not exist"
123                exit 1
124        fi
125       
126        if [ x"$dst" = x ]
127        then
128                echo "install:  no destination specified"
129                exit 1
130        else
131                true
132        fi
133
134# If destination is a directory, append the input filename; if your system
135# does not like double slashes in filenames, you may need to add some logic
136
137        if [ -d $dst ]
138        then
139                dst="$dst"/`basename $src`
140        else
141                true
142        fi
143fi
144
145## this sed command emulates the dirname command
146dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
147
148# Make sure that the destination directory exists.
149#  this part is taken from Noah Friedman's mkinstalldirs script
150
151# Skip lots of stat calls in the usual case.
152if [ ! -d "$dstdir" ]; then
153defaultIFS='   
154'
155IFS="${IFS-${defaultIFS}}"
156
157oIFS="${IFS}"
158# Some sh's can't handle IFS=/ for some reason.
159IFS='%'
160set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
161IFS="${oIFS}"
162
163pathcomp=''
164
165while [ $# -ne 0 ] ; do
166        pathcomp="${pathcomp}${1}"
167        shift
168
169        if [ ! -d "${pathcomp}" ] ;
170        then
171                $mkdirprog "${pathcomp}"
172        else
173                true
174        fi
175
176        pathcomp="${pathcomp}/"
177done
178fi
179
180if [ x"$dir_arg" != x ]
181then
182        $doit $instcmd $dst &&
183
184        if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
185        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
186        if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
187        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
188else
189
190# If we're going to rename the final executable, determine the name now.
191
192        if [ x"$transformarg" = x ]
193        then
194                dstfile=`basename $dst`
195        else
196                dstfile=`basename $dst $transformbasename |
197                        sed $transformarg`$transformbasename
198        fi
199
200# don't allow the sed command to completely eliminate the filename
201
202        if [ x"$dstfile" = x ]
203        then
204                dstfile=`basename $dst`
205        else
206                true
207        fi
208
209# Make a temp file name in the proper directory.
210
211        dsttmp=$dstdir/#inst.$$#
212
213# Move or copy the file name to the temp name
214
215        $doit $instcmd $src $dsttmp &&
216
217        trap "rm -f ${dsttmp}" 0 &&
218
219# and set any options; do chmod last to preserve setuid bits
220
221# If any of these fail, we abort the whole thing.  If we want to
222# ignore errors from any of these, just make sure not to ignore
223# errors from the above "$doit $instcmd $src $dsttmp" command.
224
225        if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
226        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
227        if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
228        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
229
230# Now rename the file to the real destination.
231
232        $doit $rmcmd -f $dstdir/$dstfile &&
233        $doit $mvcmd $dsttmp $dstdir/$dstfile
234
235fi &&
236
237
238exit 0
Note: See TracBrowser for help on using the repository browser.