#! /bin/sh
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
#
# Copyright 1991 by the Massachusetts Institute of Technology
#
# 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.
#
# Modified 1 Feb 2000 MHES to cater for mkdir -p
#
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"
mkdircmd="$mkdirprog -p"
src=""
dst=""
dir_arg=""

while [ x"$1" != x ]; do
    case $1 in
        -c) instcmd="$cpprog"
            shift
            continue;;

        -d) dir_arg=true
            shift
            continue;;

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

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

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

        -s) stripcmd="$stripprog"
            shift
            continue;;

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

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

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

if [ x"$src" = x ]
then
        echo "install:  no input file specified"
        exit 1
else
        true
fi

if [ x"$dir_arg" != x ]; then
        dst=$src
        src=""

        if [ -d $dst ]; then
                instcmd=:
        else
                instcmd=mkdir
        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 [ -f $src -o -d $src ]
        then
                true
        else
                echo "install:  $src does not exist"
                exit 1
        fi

        if [ x"$dst" = x ]
        then
                echo "install:  no destination specified"
                exit 1
        else
                true
        fi

# If destination is a directory, append the input filename; if your system
# does not like double slashes in filenames, you may need to add some logic

        if [ -d $dst ]
        then
                dst="$dst"/`basename $src`
        else
                true
        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 [ ! -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 [ $# -ne 0 ] ; do
        pathcomp="${pathcomp}${1}"
        shift

        if [ ! -d "${pathcomp}" ] ;
        then
                $mkdircmd "${pathcomp}"
        else
                true
        fi

        pathcomp="${pathcomp}/"
done
fi

if [ x"$dir_arg" != x ]
then
        $doit $instcmd $dst &&

        if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
        if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
else

# If we're going to rename the final executable, determine the name now.

        if [ x"$transformarg" = x ]
        then
                dstfile=`basename $dst`
        else
                dstfile=`basename $dst $transformbasename |
                        sed $transformarg`$transformbasename
        fi

# don't allow the sed command to completely eliminate the filename

        if [ x"$dstfile" = x ]
        then
                dstfile=`basename $dst`
        else
                true
        fi

# Make a temp file name in the proper directory.

        dsttmp=$dstdir/#inst.$$#

# Move or copy the file name to the temp name

        $doit $instcmd $src $dsttmp &&

        trap "rm -f ${dsttmp}" 0 &&

# 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.

        if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
        if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&

# Now rename the file to the real destination.

        $doit $rmcmd -f $dstdir/$dstfile &&
        $doit $mvcmd $dsttmp $dstdir/$dstfile

fi &&

exit 0
