# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/zproduct.eclass,v 1.27 2009/02/26 14:25:44 tupone Exp $
# Author: Jason Shoemaker <kutsuya@gentoo.org>

# This eclass is designed to streamline the construction of
# ebuilds for new zope products

EXPORT_FUNCTIONS src_install pkg_prerm pkg_postinst pkg_config

DESCRIPTION="This is a zope product"

RDEPEND="net-zope/zope
	app-admin/zprod-manager"

IUSE=""
SLOT="0"
S=${WORKDIR}

ZI_DIR="${ROOT}/var/lib/zope/"
ZP_DIR="${ROOT}/usr/share/zproduct"
DOT_ZFOLDER_FPATH="${ZP_DIR}/${PF}/.zfolder.lst"

zproduct_src_install() {
	## Assume that folders or files that shouldn't be installed
	#  in the zproduct directory have been already been removed.
	## Assume $S set to the parent directory of the zproduct(s).

	debug-print-function ${FUNCNAME} ${*}
	[ -n "${ZPROD_LIST}" ] || die "ZPROD_LIST isn't defined."
	[ -z "${1}" ] && zproduct_src_install all

	# set defaults
	into ${ZP_DIR}
	dodir ${ZP_DIR}/${PF}

	while [ -n "$1" ] ; do
		case ${1} in
			do_zpfolders)
				## Create .zfolders.lst from $ZPROD_LIST.
				debug-print-section do_zpfolders
				for N in ${ZPROD_LIST} ; do
					echo ${N} >> "${D}"/${DOT_ZFOLDER_FPATH}
				done
				;;
			do_docs)
				#*Moves txt docs
				debug-print-section do_docs
				docs_move
				for ZPROD in ${ZPROD_LIST} ; do
					docs_move ${ZPROD}/
				done
				;;
			do_install)
				debug-print-section do_install
				# Copy everything that's left to ${D}${ZP_DIR}
				# modified to not copy ownership (QA)
				cp --recursive --no-dereference --preserve=timestamps,mode,links "${S}"/* "${D}"/${ZP_DIR}/${PF}
				;;
			all)
				debug-print-section all
				zproduct_src_install do_zpfolders do_docs do_install ;;
		esac
		shift
	done
	debug-print "${FUNCNAME}: result is ${RESULT}"
}

docs_move() {
	# if $1 == "/", then this breaks.
	if [ -n "$1" ] ; then
		docinto $1
	else
		docinto /
	fi
	dodoc $1HISTORY.txt $1README{.txt,} $1INSTALL{.txt,} > /dev/null 2>/dev/null
	dodoc $1AUTHORS $1COPYING $1CREDITS.txt $1TODO{.txt,} > /dev/null 2>/dev/null
	dodoc $1LICENSE{.GPL,.txt,} $1CHANGES{.txt,} > /dev/null 2>/dev/null
	dodoc $1DEPENDENCIES.txt $1FAQ.txt $1UPGRADE.txt > /dev/null 2>/dev/null
	for item in ${MYDOC} ; do
		dodoc ${1}${item} > /dev/null 2>/dev/null
	done
}

zproduct_pkg_postinst() {
	#*check for multiple zinstances, if several display install help msg.

	#*Use zprod-update to install this zproduct to the default zinstance.
	debug-print-function ${FUNCNAME} ${*}

	# this is a shared directory, so root should be owner;
	# zprod-manager or whatever is used to copy products into the
	# instances has to take care of setting the right permissions in
	# the target directory

	chown -R root:root ${ZP_DIR}/${PF}
	# make shure there is nothing writable in the new dir, and all is readable
	chmod -R go-w,a+rX ${ZP_DIR}/${PF}

	einfo "Attention: ${PF} was not installed in any instance! Use 'zprod-manager add'"
	#disabled by radek@20061228 - contact me in case of any question!
	#${ROOT}/usr/sbin/zprod-manager add ${ZP_DIR}/${PF}
}

zproduct_pkg_prerm() {
	# checks how many times product is installed and informs about it
	# it does not remove it (change in behaviour done by radek@20061228)
	debug-print-function ${FUNCNAME} ${*}
	ZINST_LST=$(ls /var/lib/zope/)
	if [ "${ZINST_LST}" ] ; then
		# first check and warn on any installed products into instances
		ARE_INSTALLED=0
		for N in ${ZINST_LST} ; do
			if [ -s $DOT_ZFOLDER_FPATH ]
			then
				# check only if installed product has non empty folder lists
				#
				# for every fodler inside product ...
				for PFOLD in `cat $DOT_ZFOLDER_FPATH`
				do
					# ... check if its in instance.
					if [ -d "${ZI_DIR}${N}/Products/${PFOLD}" ]
					then
						ARE_INSTALLED=$[ARE_INSTALLED + 1]
					fi
				done
			fi
		done
		if [ $ARE_INSTALLED -gt 0 ]
		then
			ewarn "Detected at least $ARE_INSTALLED copies of product being unmerged."
			ewarn "Please manually remove it from instances using 'zprod-manager del'"
			ewarn "Product is removed from ${ZP_DIR} but not from instances!"
		fi
	fi
}

zproduct_pkg_config() {
	einfo "To add zproducts to zope instances use:"
	einfo "\tzprod-manager add"
}
