#!/bin/sh
#
# Install a program, script, or datafile.
#
# Copyright 2008-2012 by Apple Inc.
#
# This script is not compatible with BSD (or any other) install program, as it
# allows owner and group changes to fail with a warning and makes sure that the
# destination directory permissions are as specified - BSD install and the
# original X11 install script did not change permissions of existing
# directories.  It also does not support the transform options since CUPS does
# not use them...
#
# Original script 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.

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

# Force umask to 022...
umask 022

# 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}"
gzipprog="${GZIPPROG-gzip}"

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

gzipcp() {
	# gzipcp from to
	$gzipprog -9 <"$1" >"$2"
}

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
		;;

		-z)
		instcmd="gzipcp"
		shift
		continue
		;;

		*)
		if [ x"$src" = x ]; then
			src="$1"
		else
			dst="$1"
		fi
		shift
		continue
		;;
	esac
done

if [ x"$src" = x ]; then
	echo "install-sh: No input file specified"
	exit 1
fi

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

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

	if [ x"$dst" = x ]; then
		echo "install: No destination specified"
		exit 1
	fi

	# If destination is a directory, append the input filename.
	if [ -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 [ ! -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 $doit $mkdirprog "${pathcomp}"; fi

		pathcomp="${pathcomp}/"
	done
fi

if [ x"$dir_arg" != x ]; then
	# Make a directory...
	$doit $instcmd $dst || exit 1

	# Allow chown/chgrp to fail, but log a warning
	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst || echo "warning: Unable to change owner of $dst!"; fi
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst || echo "warning: Unable to change group of $dst!"; fi
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst || exit 1; fi
else
	# Install a file...
	dstfile="`basename $dst`"

	# Check the destination file - for libraries just use the "-x" option
	# to strip...
	case "$dstfile" in
		*.a | *.dylib | *.sl | *.sl.* | *.so | *.so.*)
			stripopt="-x"
			;;
		*)
			stripopt=""
			;;
	esac

	# 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 || exit 1

	# Update permissions and strip as needed, then move to the final name.
	# If the chmod, strip, rm, or mv commands fail, remove the installed
	# file...
	if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripopt "$dsttmp" || echo "warning: Unable to strip $dst!"; fi
	if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp" || echo "warning: Unable to change owner of $dst!"; fi
	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp" || echo "warning: Unable to change group of $dst!"; fi

	trap "rm -f ${dsttmp}" 0 &&
	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; fi &&
	$doit $rmcmd -f "$dstdir/$dstfile" &&
	$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
fi

exit 0
