#!/bin/bash
# Script to install a catalog in the centralized SGML catalog
# Send any comments to Eric Bischoff <eric@caldera.de>
# This program is under GPL license. See LICENSE file for details.

# Modified by Gentoo developers to better integrate it to portage.
# <text-markup@gentoo.org>

# Set help message
SGML_HELP_MESSAGE="Usage: `basename $0` [<option>] <action>\n\
where <option> is:\n\
\040 -d|--delegate: \t\t\t Use DELEGATE instead of CATALOG\n\
and where <action> is:\n\
\040 -a|--add <centralized> <ordinary>: \t Declare ordinary catalog in the centralized catalog\n\
\040 -r|--remove <centralized> <ordinary>:\t Remove ordinary catalog from the centralized catalog\n\
\040 -h, --help: \t\t\t\t Print this help message and exit\n\
\040 -v, --version: \t\t\t Print the version number and exit\n"

# Set version message
SGML_VERSION_MESSAGE="sgml-common version @VERSION@ (install-catalog version 1.0)"

# Set type of pointer
SGML_POINTER="CATALOG"

# Set action to be performed
SGML_ACTION=""

# Set catalogs
SGML_CENTRALIZED=""
SGML_ORDINARY=""

# Default ROOT value (usually defined by portage)
[ -z "$ROOT" ] && ROOT="/"
[[ $ROOT == */ ]] || ROOT="${ROOT}/"


# Process options
case $1 in
   -d|--delegate) SGML_POINTER="DELEGATE"
                shift 1
                ;;
esac

# Process actions
case $1 in
   -a|--add)    SGML_ACTION="addition"
		SGML_CENTRALIZED=$2
		SGML_ORDINARY=$3
		;;
   -r|--remove)	if [ -z "$3" -o "$3" = "--version" ]
		then
		  echo "install-catalog: Old syntax; doing nothing"
		  exit 0
		fi
   		SGML_ACTION="removal"
		SGML_CENTRALIZED=$2
		SGML_ORDINARY=$3
		;;
   -h|--help)	echo -e $SGML_HELP_MESSAGE
		exit 0
		;;
   -v|--version) echo -e $SGML_VERSION_MESSAGE
	 	exit 0
		;;
   --install)   echo "install-catalog: Old syntax; doing nothing"
		exit 0
		;;
   *)		echo -e $SGML_HELP_MESSAGE >&2
		exit 1
		;;
esac


# The arguments to this program should always be relative to $ROOT. Here we
# declare some extra variables to distingish between the absolute and
# relative paths.
SGML_ROOT_CENTRALIZED="${ROOT%/}${SGML_CENTRALIZED}"
SGML_ROOT_ORDINARY="${ROOT%/}${SGML_ORDINARY}"


# Check that the super catalog can be created and changed and deleted
if [ ! -w ${ROOT}etc/sgml ]
then
  echo "`basename $0`: unable to write in ${ROOT}etc/sgml." >&2
  exit 2
fi
case $SGML_ACTION in
   addition)
	if [ -e ${ROOT}etc/sgml/catalog -a ! -w ${ROOT}etc/sgml/catalog ]
	then
	  echo "`basename $0`: can not modify \"${ROOT}etc/sgml/catalog\"." >&2
	  exit 2
	fi
	;;
   removal)
	if [ ! -w ${ROOT}etc/sgml/catalog ]
	then
	  echo "`basename $0`: can not modify \"${ROOT}etc/sgml/catalog\"." >&2
	  exit 2
	fi
	;;
esac

# Check that the centralized catalog can be created, changed and deleted
if [ -z "$SGML_ROOT_CENTRALIZED" ]
then
  echo -e $SGML_HELP_MESSAGE >&2
  exit 1
fi
case $SGML_ACTION in
   addition)
	if [ -e "$SGML_ROOT_CENTRALIZED" -a ! -w "$SGML_ROOT_CENTRALIZED" ]
	then
	  echo "`basename $0`: can not modify \"$SGML_ROOT_CENTRALIZED\"." >&2
	  exit 2
	fi
	;;
   removal)
	if [ ! -w "$SGML_ROOT_CENTRALIZED" ]
	then
	  echo "`basename $0`: can not modify \"$SGML_ROOT_CENTRALIZED\"." >&2
	  exit 2
	fi
	;;
esac

# Check that we have at least one ordinary package to process
if [ -z "$SGML_ROOT_ORDINARY" ]
then
  echo -e $SGML_HELP_MESSAGE >&2
  exit 1
fi
case $SGML_ACTION in
   addition)
	if [ ! -s $SGML_ROOT_ORDINARY ]
	then
	  echo "`basename $0`: \"$SGML_ROOT_ORDINARY\" does not exist or is empty." >&2
	  exit 2
	fi
	;;
esac

# Installation or removal of pointers
case $SGML_ACTION in
    addition)
	echo "`basename $0`: addition of $SGML_ORDINARY in $SGML_CENTRALIZED"
	if grep -q $SGML_ORDINARY $SGML_ROOT_CENTRALIZED 2>/dev/null
	then
	  echo "Warning: $SGML_ORDINARY is already installed in the centralized catalog $SGML_CENTRALIZED" >&2
	else
	  echo "$SGML_POINTER \"$SGML_ORDINARY\"" >> $SGML_ROOT_CENTRALIZED
	fi
	grep -q $SGML_CENTRALIZED ${ROOT}etc/sgml/catalog 2>/dev/null
	if [ $? -ne 0 ]
	then
		echo "`basename $0`: addition of $SGML_CENTRALIZED in ${ROOT}etc/sgml/catalog"
		echo "$SGML_POINTER \"$SGML_CENTRALIZED\"" >> ${ROOT}etc/sgml/catalog
	fi
	;;
   removal)
	echo "`basename $0`: removal of $SGML_ORDINARY from $SGML_CENTRALIZED"
	if grep -q $SGML_ORDINARY $SGML_ROOT_CENTRALIZED 2>/dev/null
	then
		sed -e "\:$SGML_POINTER \"$SGML_ORDINARY\":d" < \
			$SGML_ROOT_CENTRALIZED > ${SGML_ROOT_CENTRALIZED}.new
		mv ${SGML_ROOT_CENTRALIZED}.new $SGML_ROOT_CENTRALIZED
	else
	  echo "Warning: $SGML_ORDINARY was not found in the centralized catalog $SGML_CENTRALIZED" >&2
	fi
	if [ ! -s "$SGML_ROOT_CENTRALIZED" ]
	then
	  rm $SGML_ROOT_CENTRALIZED
	  echo "`basename $0`: removal of $SGML_CENTRALIZED from ${ROOT}etc/sgml/catalog"
          sed -e "\:$SGML_POINTER \"$SGML_CENTRALIZED\":d" < ${ROOT}etc/sgml/catalog > ${ROOT}etc/sgml/catalog.new
          mv ${ROOT}etc/sgml/catalog.new ${ROOT}etc/sgml/catalog
	fi
	;;
esac

exit 0
