#!/bin/bash
#
# Copyright 2005 Timo Hirvonen <tihirvon@ee.oulu.fi>
#
# This file is licensed under the GPLv2.

source $(dirname $0)/utils.sh || exit 1

fmode="0644"
dmode="0755"

owner_group=""
cmd_prefix=""

usage()
{
	echo "Usage: $PROGRAM_NAME [OPTIONS] DSTDIR FILE|DIRECTORY..."
	echo "   or: $PROGRAM_NAME --auto FILE..."
	echo "Install FILES and DIRECTORIES to DESTDIR/DSTDIR"
	echo
	echo "  --fmode=mode   set file mode [0644]"
# 	echo "  --dmode=mode   set directory mode [0755]"
	echo "  --owner=owner  set file owner"
	echo "  --group=group  set file group"
	echo "  --auto         auto mode (see examples)"
	echo "  --help         show this help and exit"
	echo
	echo "Installed files are logged to \$install_log."
	echo
	echo "Supported filename extensions for auto mode:"
	echo "  <none>           binary (\$bindir)"
	echo "  .a               static library (\$libdir)"
	echo "  .so              shared library (\$libdir)"
	echo "  .pc              pkg-config file (\$libdir/pkgconfig)"
	echo "  .[0-9], .[0-9]p  man page (\$mandir)"
	echo
	echo "Examples:"
	echo "  # install library using auto mode"
	echo "  # destination files:"
	echo "  #   \$DESTDIR/usr/lib/libfoo-1.so         (mode 0755)"
	echo "  #   \$DESTDIR/usr/lib/libfoo-1.a          (mode 0644)"
	echo "  #   \$DESTDIR/usr/lib/pkgconfig/foo-1.pc  (mode 0644)"
	echo "  $PROGRAM_NAME --auto libfoo-1.so libfoo-1.a foo-1.pc"
	echo
	echo "  # install man pages using auto mode"
	echo "  # destination files:"
	echo "  #   \$DESTDIR/\$mandir/man1/foo.1  (mode 0644)"
	echo "  #   \$DESTDIR/\$mandir/man3/foo.3  (mode 0644)"
	echo "  $PROGRAM_NAME --auto foo.1 bar.3"
	echo
	echo "  # install headers (copy foo-1 recursively)"
	echo "  $PROGRAM_NAME /usr/include foo-1/"
}

log_install()
{
	echo "$1" >> "$install_log"
}

make_dir()
{
	local dir

	dir="${DESTDIR}/${1}"
	if [[ ! -d $dir ]]
	then
		$cmd_prefix mkdir -p "$dir" || exit 1
	fi
}

copy_file()
{
	local src dir dst

	src="$1"
	dir="${DESTDIR}/${2}"
	dst="${dir}/$(basename $src)"
	dst=${dst//\/\//\/}
	[[ $BUILD_VERBOSITY -ne 2 ]] && echo "   INSTALL $dst"
	$cmd_prefix cp "$src" "$dst" || exit 1
	log_install "$dst"
	if [[ -n $owner_group ]]
	then
		$cmd_prefix chown $owner_group "$dst" || exit 1
	fi
	$cmd_prefix chmod $fmode "$dst" || exit 1
}

do_copy_file()
{
	local src dir dst

	src="$1"
	dir="$2"
	dst="${dir}/$(basename $src)"
	dst=${dst//\/\//\/}
	[[ $BUILD_VERBOSITY -ne 2 ]] && echo "   INSTALL $dst"
	$cmd_prefix cp "$src" "$dst" || exit 1
	log_install "$dst"
}

do_copy_dir()
{
	local src dst i

	src="$1"
	dst="$2/$(basename $src)"
	dst=${dst//\/\//\/}
	$cmd_prefix mkdir -p "$dst" || exit 1
	for i in $src/*
	do
		[[ "$i" = "$src/*" ]] && break
		if [[ -d $i ]]
		then
			do_copy_dir "$i" "$dst"
		else
			do_copy_file "$i" "$dst"
		fi
	done
}

copy_dir()
{
	do_copy_dir "$1" "${DESTDIR}/${2}"
}

install_one()
{
	local dir src

	dir="$1"
	src="$2"
	make_dir "$dir"
	copy_file "$src" "$dir"
}

install_many()
{
	local dir src

	dir="$1"
	shift
	make_dir "$dir"
	while [[ $# -gt 0 ]]
	do
		if [[ -d $1 ]]
		then
			copy_dir "$1" "$dir"
		else
			copy_file "$1" "$dir"
		fi
		shift
	done
}

main()
{
	local auto=0 owner="" group=""

	while [[ $# -gt 0 ]]
	do
		case $1 in
			--auto)
				auto=1
				;;
# 			--dmode=*)
# 				dmode=${1##--dmode=}
# 				;;
			--fmode=*)
				fmode=${1##--fmode=}
				;;
			--owner=*)
				owner=${1##--owner=}
				;;
			--group=*)
				group=${1##--group=}
				;;
			--help)
				usage
				exit 0
				;;
			--)
				shift
				break
				;;
			-*)
				pdie "unrecognized option: \`$1'"
				;;
			*)
				break
				;;
		esac
		shift
	done

	if [[ -n $owner ]]
	then
		if [[ -n $group ]]
		then
			owner_group="$owner:$group"
		else
			owner_group="$owner"
		fi
	elif [[ -n $group ]]
	then
		owner_group=":$group"
	fi

	if [[ $BUILD_VERBOSITY -eq 2 ]]
	then
		cmd_prefix="run_verbose"
	fi

	# dirs 0755
	umask 022

	var_assert install_log

	if [[ $auto -eq 1 ]]
	then
		[[ $# -lt 1 ]] && pdie "too few arguments"
		for file in "$@"
		do
			case $file in
				*.so)
					var_assert libdir
					fmode=0755
					install_one "${libdir}" "$file"
					;;
				*.a)
					var_assert libdir
					fmode=0644
					install_one "${libdir}" "$file"
					;;
				*.pc)
					var_assert libdir
					fmode=0644
					install_one "${libdir}/pkgconfig" "$file"
					;;
				*.[0-9]|*.[0-9]p)
					var_assert mandir
					fmode=0644
					install_one "${mandir}/man${file##*.}" "$file"
					;;
				*.*)
					pdie "unrecognized filename extension \`${file##*.}'"
					;;
				*)
					var_assert bindir
					fmode=0755
					install_one "${bindir}" "$file"
					;;
			esac
		done
	else
		[[ $# -lt 2 ]] && pdie "too few arguments"
		local dstdir="$1"
		shift
		install_many "$dstdir" "$@"
	fi
}

main "$@"
