#!/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.
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=""

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
        :
fi

if [ x"$dir_arg" != x ]; then
        dst=$src
        src=""
        
        if [ -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 [ -f "$src" ] || [ -d "$src" ]
        then
                :
        else
                echo "install:  $src does not exist"
                exit 1
        fi
        
        if [ x"$dst" = x ]
        then
                echo "install:  no destination specified"
                exit 1
        else
                :
        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
                :
        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
                $mkdirprog "${pathcomp}"
        else
                :
        fi

        pathcomp="${pathcomp}/"
done
fi

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

        if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
        if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; 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
                :
        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 :;fi &&
        if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
        if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
        if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&

# Now rename the file to the real destination.

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

fi &&


exit 0
