xsel

Program for manipulating the X clipboard
git clone https://git.sinitax.com/kfish/xsel
Log | Files | Refs | README | LICENSE | sfeed.txt

install-sh (9505B)


      1#!/bin/sh
      2# install - install a program, script, or datafile
      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.
      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 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.
    289
    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	   } &&
    307
    308	   # Now rename the file to the real destination.
    309	   $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
    310	 }
    311    }
    312  fi || { (exit 1); exit; }
    313done
    314
    315# The final little trick to "correctly" pass the exit status to the exit trap.
    316{
    317  (exit 0); exit
    318}
    319
    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: