#!/bin/sh
# install - install a program, script, or datafile
# This originally came from X11R5 (mit/util/scripts/install.sh).

scriptversion=2003-01-17.15

# Copyright 1991 by the Massachusetts Institute of Technology
# (FSF changes in the public domain.)
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission.  M.I.T. makes no representations about the
# suitability of this software for any purpose.  It is provided "as is"
# without express or implied warranty.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch.  It can only install one file at a time, a restriction
# shared with many OS's install programs.

# set DOITPROG to echo to test this script

# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"

# put in absolute paths if you don't have them in your path; or use env. vars.

mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"

transformbasename=
transform_arg=
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
chowncmd=
chgrpcmd=
stripcmd=
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=
dst=
dir_arg=

usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
   or: $0 -d DIR1 DIR2...

In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
In the second, create the directory path DIR.

Options:
-b=TRANSFORMBASENAME
-c         copy source (using $cpprog) instead of moving (using $mvprog).
-d         create directories instead of installing files.
-g GROUP   $chgrp installed files to GROUP.
-m MODE    $chmod installed files to MODE.
-o USER    $chown installed files to USER.
-s         strip installed files (using $stripprog).
-t=TRANSFORM
--help     display this help and exit.
--version  display version info and exit.

Environment variables override the default commands:
  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
"

while test -n "$1"; do
  case $1 in
    -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
        shift
        continue;;

    -c) instcmd=$cpprog
        shift
        continue;;

    -d) dir_arg=true
        shift
        continue;;

    -g) chgrpcmd="$chgrpprog $2"
        shift
        shift
        continue;;

    --help) echo "$usage"; exit 0;;

    -m) chmodcmd="$chmodprog $2"
        shift
        shift
        continue;;

    -o) chowncmd="$chownprog $2"
        shift
        shift
        continue;;

    -s) stripcmd=$stripprog
        shift
        continue;;

    -t=*) transformarg=`echo $1 | sed 's/-t=//'`
        shift
        continue;;

    --version) echo "$0 $scriptversion"; exit 0;;

    *)  if test -z "$src"; then
          src=$1
        else
          # this colon is to work around a 386BSD /bin/sh bug
          :
          dst=$1
        fi
        shift
        continue;;
  esac
done

if test -z "$src"; then
  echo "$0: no input file specified." >&2
  exit 1
fi

if test -n "$dir_arg"; then
  dst=$src
  src=

  if test -d "$dst"; then
    instcmd=:
    chmodcmd=
  else
    instcmd=$mkdirprog
  fi
else
  # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
  # might cause directories to be created, which would be especially bad
  # if $src (and thus $dsttmp) contains '*'.
  if test ! -f "$src" && test ! -d "$src"; then
    echo "$0: $src does not exist." >&2
    exit 1
  fi

  if test -z "$dst"; then
    echo "$0: no destination specified." >&2
    exit 1
  fi

  # If destination is a directory, append the input filename; won't work
  # if double slashes aren't ignored.
  if test -d "$dst"; then
    dst=$dst/`basename "$src"`
  fi
fi

## this sed command emulates the dirname command
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`

# Make sure that the destination directory exists.
# (this part is taken from Noah Friedman's mkinstalldirs script.)

# Skip lots of stat calls in the usual case.
if test ! -d "$dstdir"; then
  defaultIFS='
	'
  IFS="${IFS-$defaultIFS}"

  oIFS=$IFS
  # Some sh's can't handle IFS=/ for some reason.
  IFS='%'
  set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
  IFS=$oIFS

  pathcomp=

  while test $# -ne 0 ; do
    pathcomp=$pathcomp$1
    shift
    test -d "$pathcomp" || $mkdirprog "$pathcomp"
    pathcomp=$pathcomp/
  done
fi

if test -n "$dir_arg"; then
  $doit $instcmd "$dst" \
    && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
    && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
    && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
    && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }

else
  # If we're going to rename the final executable, determine the name now.
  if test -z "$transformarg"; then
    dstfile=`basename "$dst"`
  else
    dstfile=`basename "$dst" $transformbasename \
             | sed $transformarg`$transformbasename
  fi

  # don't allow the sed command to completely eliminate the filename.
  test -z "$dstfile" && dstfile=`basename "$dst"`

  # Make a couple of temp file names in the proper directory.
  dsttmp=$dstdir/#inst.$$#
  rmtmp=$dstdir/#rm.$$#

  # Trap to clean up those temp files at exit.
  trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
  trap '(exit $?); exit' 1 2 13 15

  # Move or copy the file name to the temp name
  $doit $instcmd "$src" "$dsttmp" &&

  # and set any options; do chmod last to preserve setuid bits.
  #
  # If any of these fail, we abort the whole thing.  If we want to
  # ignore errors from any of these, just make sure not to ignore
  # errors from the above "$doit $instcmd $src $dsttmp" command.
  #
  { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
    && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
    && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
    && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&

  # Now remove or move aside any old file at destination location.  We
  # try this two ways since rm can't unlink itself on some systems and
  # the destination file might be busy for other reasons.  In this case,
  # the final cleanup might fail but the new file should still install
  # successfully.
  {
    if test -f "$dstdir/$dstfile"; then
      $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
      || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
      || {
	  echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
	  (exit 1); exit
      }
    else
      :
    fi
  } &&

  # Now rename the file to the real destination.
  $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
fi &&

# The final little trick to "correctly" pass the exit status to the exit trap.
{
  (exit 0); exit
}

# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:
