# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

# @ECLASS: sgml-catalog.eclass
# @MAINTAINER:
# SGML Herd <sgml@gentoo.org>
# @AUTHOR:
# Author Matthew Turk <satai@gentoo.org>
# @BLURB: Functions for installing SGML catalogs

inherit base

DEPEND=">=app-text/sgml-common-0.6.3-r2"

# @ECLASS-VARIABLE: SGML_TOINSTALL
# @DESCRIPTION:
# An array of catalogs, arranged in pairs.
# Each pair consists of a centralized catalog followed by an ordinary catalog.
SGML_TOINSTALL=()

# @FUNCTION: sgml-catalog_cat_include
# @USAGE: <centralized catalog> <ordinary catalog>
# @DESCRIPTION:
# Appends a catalog pair to the SGML_TOINSTALL array.
sgml-catalog_cat_include() {
	debug-print function $FUNCNAME $*
	SGML_TOINSTALL+=("$1" "$2")
}

# @FUNCTION: sgml-catalog_cat_doinstall
# @USAGE: <centralized catalog> <ordinary catalog>
# @DESCRIPTION:
# Adds an ordinary catalog to a centralized catalog.
sgml-catalog_cat_doinstall() {
	debug-print function $FUNCNAME $*
	has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX=
	"${EPREFIX}"/usr/bin/install-catalog --add "${EPREFIX}$1" "${EPREFIX}$2" &>/dev/null
}

# @FUNCTION: sgml-catalog_cat_doremove
# @USAGE: <centralized catalog> <ordinary catalog>
# @DESCRIPTION:
# Removes an ordinary catalog from a centralized catalog.
sgml-catalog_cat_doremove() {
	debug-print function $FUNCNAME $*
	has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX=
	"${EPREFIX}"/usr/bin/install-catalog --remove "${EPREFIX}$1" "${EPREFIX}$2" &>/dev/null
}

sgml-catalog_pkg_postinst() {
	debug-print function $FUNCNAME $*
	has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX=

	set -- "${SGML_TOINSTALL[@]}"

	while (( $# )); do
		if [[ ! -e "${EPREFIX}$2" ]]; then
			ewarn "${EPREFIX}$2 doesn't appear to exist, although it ought to!"
			shift 2
			continue
		fi
		einfo "Now adding ${EPREFIX}$2 to ${EPREFIX}$1 and ${EPREFIX}/etc/sgml/catalog"
		sgml-catalog_cat_doinstall "$1" "$2"
		shift 2
	done
	sgml-catalog_cleanup
}

sgml-catalog_pkg_prerm() {
	sgml-catalog_cleanup
}

sgml-catalog_pkg_postrm() {
	debug-print function $FUNCNAME $*
	has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX=

	set -- "${SGML_TOINSTALL[@]}"

	while (( $# )); do
		einfo "Now removing ${EPREFIX}$2 from ${EPREFIX}$1 and ${EPREFIX}/etc/sgml/catalog"
		sgml-catalog_cat_doremove "$1" "$2"
		shift 2
	done
}

sgml-catalog_cleanup() {
	has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX=
	if [ -e "${EPREFIX}/usr/bin/gensgmlenv" ]
	then
		einfo Regenerating SGML environment variables ...
		gensgmlenv
		grep -v export "${EPREFIX}/etc/sgml/sgml.env" > "${EPREFIX}/etc/env.d/93sgmltools-lite"
	fi
}

sgml-catalog_src_compile() {
	return
}

EXPORT_FUNCTIONS pkg_postrm pkg_postinst src_compile pkg_prerm
