Home | History | Annotate | Download | only in cpython3
      1 #!/bin/sh
      2 #
      3 # install - install a program, script, or datafile
      4 #
      5 # This originates from X11R5 (mit/util/scripts/install.sh), which was
      6 # later released in X11R6 (xc/config/util/install.sh) with the
      7 # following copyright and license.
      8 #
      9 # Copyright (C) 1994 X Consortium
     10 #
     11 # Permission is hereby granted, free of charge, to any person obtaining a copy
     12 # of this software and associated documentation files (the "Software"), to
     13 # deal in the Software without restriction, including without limitation the
     14 # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
     15 # sell copies of the Software, and to permit persons to whom the Software is
     16 # furnished to do so, subject to the following conditions:
     17 #
     18 # The above copyright notice and this permission notice shall be included in
     19 # all copies or substantial portions of the Software.
     20 #
     21 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     22 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     23 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
     24 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     25 # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
     26 # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     27 #
     28 # Except as contained in this notice, the name of the X Consortium shall not
     29 # be used in advertising or otherwise to promote the sale, use or other deal-
     30 # ings in this Software without prior written authorization from the X Consor-
     31 # tium.
     32 #
     33 #
     34 # FSF changes to this file are in the public domain.
     35 #
     36 # Calling this script install-sh is preferred over install.sh, to prevent
     37 # `make' implicit rules from creating a file called install from it
     38 # when there is no Makefile.
     39 #
     40 # This script is compatible with the BSD install script, but was written
     41 # from scratch.  It can only install one file at a time, a restriction
     42 # shared with many OS's install programs.
     43 
     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.
     48 doit="${DOITPROG-}"
     49 
     50 
     51 # put in absolute paths if you don't have them in your path; or use env. vars.
     52 
     53 mvprog="${MVPROG-mv}"
     54 cpprog="${CPPROG-cp}"
     55 chmodprog="${CHMODPROG-chmod}"
     56 chownprog="${CHOWNPROG-chown}"
     57 chgrpprog="${CHGRPPROG-chgrp}"
     58 stripprog="${STRIPPROG-strip}"
     59 rmprog="${RMPROG-rm}"
     60 mkdirprog="${MKDIRPROG-mkdir}"
     61 
     62 transformbasename=""
     63 transform_arg=""
     64 instcmd="$mvprog"
     65 chmodcmd="$chmodprog 0755"
     66 chowncmd=""
     67 chgrpcmd=""
     68 stripcmd=""
     69 rmcmd="$rmprog -f"
     70 mvcmd="$mvprog"
     71 src=""
     72 dst=""
     73 dir_arg=""
     74 
     75 while [ x"$1" != x ]; do
     76     case $1 in
     77 	-c) instcmd=$cpprog
     78 	    shift
     79 	    continue;;
     80 
     81 	-d) dir_arg=true
     82 	    shift
     83 	    continue;;
     84 
     85 	-m) chmodcmd="$chmodprog $2"
     86 	    shift
     87 	    shift
     88 	    continue;;
     89 
     90 	-o) chowncmd="$chownprog $2"
     91 	    shift
     92 	    shift
     93 	    continue;;
     94 
     95 	-g) chgrpcmd="$chgrpprog $2"
     96 	    shift
     97 	    shift
     98 	    continue;;
     99 
    100 	-s) stripcmd=$stripprog
    101 	    shift
    102 	    continue;;
    103 
    104 	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
    105 	    shift
    106 	    continue;;
    107 
    108 	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
    109 	    shift
    110 	    continue;;
    111 
    112 	*)  if [ x"$src" = x ]
    113 	    then
    114 		src=$1
    115 	    else
    116 		# this colon is to work around a 386BSD /bin/sh bug
    117 		:
    118 		dst=$1
    119 	    fi
    120 	    shift
    121 	    continue;;
    122     esac
    123 done
    124 
    125 if [ x"$src" = x ]
    126 then
    127 	echo "$0: no input file specified" >&2
    128 	exit 1
    129 else
    130 	:
    131 fi
    132 
    133 if [ x"$dir_arg" != x ]; then
    134 	dst=$src
    135 	src=""
    136 
    137 	if [ -d "$dst" ]; then
    138 		instcmd=:
    139 		chmodcmd=""
    140 	else
    141 		instcmd=$mkdirprog
    142 	fi
    143 else
    144 
    145 # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
    146 # might cause directories to be created, which would be especially bad
    147 # if $src (and thus $dsttmp) contains '*'.
    148 
    149 	if [ -f "$src" ] || [ -d "$src" ]
    150 	then
    151 		:
    152 	else
    153 		echo "$0: $src does not exist" >&2
    154 		exit 1
    155 	fi
    156 
    157 	if [ x"$dst" = x ]
    158 	then
    159 		echo "$0: no destination specified" >&2
    160 		exit 1
    161 	else
    162 		:
    163 	fi
    164 
    165 # If destination is a directory, append the input filename; if your system
    166 # does not like double slashes in filenames, you may need to add some logic
    167 
    168 	if [ -d "$dst" ]
    169 	then
    170 		dst=$dst/`basename "$src"`
    171 	else
    172 		:
    173 	fi
    174 fi
    175 
    176 ## this sed command emulates the dirname command
    177 dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
    178 
    179 # Make sure that the destination directory exists.
    180 #  this part is taken from Noah Friedman's mkinstalldirs script
    181 
    182 # Skip lots of stat calls in the usual case.
    183 if [ ! -d "$dstdir" ]; then
    184 defaultIFS='
    185 	'
    186 IFS="${IFS-$defaultIFS}"
    187 
    188 oIFS=$IFS
    189 # Some sh's can't handle IFS=/ for some reason.
    190 IFS='%'
    191 set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
    192 IFS=$oIFS
    193 
    194 pathcomp=''
    195 
    196 while [ $# -ne 0 ] ; do
    197 	pathcomp=$pathcomp$1
    198 	shift
    199 
    200 	if [ ! -d "$pathcomp" ] ;
    201         then
    202 		$mkdirprog "$pathcomp"
    203 	else
    204 		:
    205 	fi
    206 
    207 	pathcomp=$pathcomp/
    208 done
    209 fi
    210 
    211 if [ x"$dir_arg" != x ]
    212 then
    213 	$doit $instcmd "$dst" &&
    214 
    215 	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
    216 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
    217 	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
    218 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
    219 else
    220 
    221 # If we're going to rename the final executable, determine the name now.
    222 
    223 	if [ x"$transformarg" = x ]
    224 	then
    225 		dstfile=`basename "$dst"`
    226 	else
    227 		dstfile=`basename "$dst" $transformbasename |
    228 			sed $transformarg`$transformbasename
    229 	fi
    230 
    231 # don't allow the sed command to completely eliminate the filename
    232 
    233 	if [ x"$dstfile" = x ]
    234 	then
    235 		dstfile=`basename "$dst"`
    236 	else
    237 		:
    238 	fi
    239 
    240 # Make a couple of temp file names in the proper directory.
    241 
    242 	dsttmp=$dstdir/#inst.$$#
    243 	rmtmp=$dstdir/#rm.$$#
    244 
    245 # Trap to clean up temp files at exit.
    246 
    247 	trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
    248 	trap '(exit $?); exit' 1 2 13 15
    249 
    250 # Move or copy the file name to the temp name
    251 
    252 	$doit $instcmd "$src" "$dsttmp" &&
    253 
    254 # and set any options; do chmod last to preserve setuid bits
    255 
    256 # If any of these fail, we abort the whole thing.  If we want to
    257 # ignore errors from any of these, just make sure not to ignore
    258 # errors from the above "$doit $instcmd $src $dsttmp" command.
    259 
    260 	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
    261 	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
    262 	if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
    263 	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
    264 
    265 # Now remove or move aside any old file at destination location.  We try this
    266 # two ways since rm can't unlink itself on some systems and the destination
    267 # file might be busy for other reasons.  In this case, the final cleanup
    268 # might fail but the new file should still install successfully.
    269 
    270 {
    271 	if [ -f "$dstdir/$dstfile" ]
    272 	then
    273 		$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
    274 		$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
    275 		{
    276 		  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
    277 		  (exit 1); exit
    278 		}
    279 	else
    280 		:
    281 	fi
    282 } &&
    283 
    284 # Now rename the file to the real destination.
    285 
    286 	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
    287 
    288 fi &&
    289 
    290 # The final little trick to "correctly" pass the exit status to the exit trap.
    291 
    292 {
    293 	(exit 0); exit
    294 }
    295