| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- #!@l_prefix@/bin/bash
- ##
- ## mkcatalog - script for managing SGML catalog file
- ## Created: 20001015 Shigeyuki Fukushima <shige@FreeBSD.org>.
- ## Modified: 20001019 Hiroki Sato <hrs@FreeBSD.org>.
- ##
- sh_basename () {
- l_value=$1
- IFS_old=${IFS}; IFS=" /"; set -- ${l_value}; IFS=${IFS_old}
- case $# in
- 0) ;;
- *) echo `eval echo \\$$#` ;;
- esac
- }
- sh_dirname () {
- l_value=$1
- IFS_old=${IFS}; IFS=" /"; set -- ${l_value}; IFS=${IFS_old}
- l_dirname=$1
- shift
- while
- case $# in
- 0) break ;;
- 1) echo ${l_dirname}; break ;;
- *) ;;
- esac
- do
- l_dirname="${l_dirname}/$1";
- shift;
- done
- }
- norm_dir () {
- [ -d "$1" ] && echo `exec 2>/dev/null; cd $1; echo ${PWD}`
- }
- verbose_msg () {
- case ${F_VERBOSE} in
- 1) echo " ===> $*" ;;
- *) ;;
- esac
- }
- PREFIX=@l_prefix@
- TMPDIR=/tmp
- ARGV0=`sh_basename $0`
- CAT_DIR=${PREFIX}/share/sgml
- CAT_FILE=catalog
- F_PRESERVE_OLD=""
- F_VERBOSE=""
- args=`getopt pqvc: $*` ; set -- $args
- for i
- do
- case "$i" in
- -c) CAT_DIR=`sh_dirname $2`; CAT_FILE=`sh_basename $2`; shift; shift ;;
- -p) F_PRESERVE_OLD=1; shift ;;
- -q) exec 1>/dev/null 2>&1; shift ;;
- -v) F_VERBOSE=1; shift ;;
- --) shift; break ;;
- esac
- done
- dtd_act=$1
- dtd_dir=$2
- dtd_catalog=`sh_basename "$3"`
- # option check and normalize ${dtd_dir}
- case "${dtd_act}" in
- add|install|delete|deinstall|enable|disable)
- if [ ! -d "${CAT_DIR}" ]; then
- echo "${ARGV0}: top-level catalog dir \"${CAT_DIR}\" not found."
- exit 1
- elif [ ! -n "${dtd_dir}" ]; then
- echo "${ARGV0}: DTD directory is not specified."
- exit 1
- elif [ ! -d "${CAT_DIR}/${dtd_dir}"\
- -a ! -d "${dtd_dir}" ]; then
- echo "${ARGV0}: DTD directory \"${dtd_dir}\" not found."
- exit 1
- elif [ ! -f "${CAT_DIR}/${dtd_dir}/${dtd_catalog:-catalog}"\
- -a ! -f "${dtd_dir}/${dtd_catalog:-catalog}" ]; then
- echo "${ARGV0}: DTD catalog \"${dtd_dir}/${dtd_catalog:-catalog}\" not found."
- exit 1
- fi
- verbose_msg "top-level catalog dir (specified): ${CAT_DIR}"
- CAT_DIR=`norm_dir ${CAT_DIR}`
- verbose_msg "top-level catalog dir (normalized): ${CAT_DIR}"
- verbose_msg "target catalog dir (specified): ${dtd_dir}"
- dtd_dir=`norm_dir ${CAT_DIR}/${dtd_dir} || norm_dir ${dtd_dir}`
- verbose_msg "target catalog dir (normalized): ${dtd_dir}"
- case "${dtd_dir}" in
- ${CAT_DIR}/*) ;;
- *) echo "${ARGV0}: DTD directory \"${dtd_dir}\" is invalid."
- exit 1 ;;
- esac
- # keep dtd_dir relative
- dtd_dir=${dtd_dir#"${CAT_DIR}/"}
- ;;
- *)
- echo "${ARGV0}: missing options."
- cat <<EOF
- Usage: ${ARGV0} [-c toplv-catalog-filename] [-pqv]
- [install|add|deinstall|delete|enable|disable]
- dtd-directory-name [catalog-filename]
- -c filename specifies top-level catalog file
- (default: ${PREFIX}/share/sgml/catalog)
- -p preserve old catalog file (as .old)
- -q quiet mode
- -v verbose mode (for debug)
- ex.) mkcatalog install html/4.0
- mkcatalog -c /home/foo/sgml/catalog install html/4.0/my_ext html_catalog
- EOF
- exit 1
- ;;
- esac
- echo "* top-level catalog: ${CAT_DIR}/${CAT_FILE}"
- verbose_msg "action: ${dtd_act}"
- verbose_msg "target catalog dir: ${dtd_dir}"
- verbose_msg "target catalog file: ${dtd_catalog:-catalog}"
- echo "* attempt to ${dtd_act} catalog in ${dtd_dir}"
- TMPCAT=/tmp/catalog.$$
- proc_catalog () {
- l_bottom_p=$1 # allow to delete upper catalog?
- l_upper=$2 # dirname of upper catalog
- l_lower=$3 # dirname of lower catalog
- case ${first_p} in
- [Yy][Ee][Ss]) catalog=${dtd_catalog:-"catalog"} ;;
- *) catalog=${CAT_FILE} ;;
- esac
- # l_upper_cat -> relative path from ${CAT_DIR}
- # l_lower_cat -> relative path from l_upper
- l_upper_cat="${l_upper}/${CAT_FILE}"
- l_lower_cat="`sh_basename ${l_lower}`/${catalog}"
- # l_*_abs_* -> absolute path respectively
- l_upper_abs="${CAT_DIR}/${l_upper}"
- l_lower_abs="${CAT_DIR}/${l_lower}"
- l_upper_abs_cat="${CAT_DIR}/${l_upper}/${CAT_FILE}"
- l_lower_abs_cat="${CAT_DIR}/${l_lower}/${catalog}"
- l_cat_line="CATALOG \"${l_lower_cat}\""
- l_abs_path_head=`cd ${l_upper_abs}; echo ${PWD}`
- # first, create temporary catalog from l_upper_cat
- # not including CATALOG line of l_lower_cat (if no catalog,
- # create empty one).
- #
- # NOTE: file manipulations require absolute path, but
- # CATALOG line do relative from upper's one.
- #
- touch ${l_upper_abs_cat} || exit 1
- grep -v "\( *-- *\)\?CATALOG *\"\(${l_abs_path_head}/\)\?${l_lower_cat}\"\( *-- *\)\?" \
- ${l_upper_abs_cat} >${TMPCAT}
- # preserve old catalog as necessary
- if [ "x${F_PRESERVE_OLD}" != "x" ]; then
- cp ${l_upper_abs_cat} ${l_upper_abs_cat}.old || exit 1
- fi
- case "${dtd_act}" in
- add|install|enable)
- # if "install or add or enable",
- # create "the temporary catalog + l_cat_line" and install it.
- echo " - ${dtd_act} ${l_cat_line} line in ${l_upper_cat}"
- echo "${l_cat_line}" >>${TMPCAT}
- cp ${TMPCAT} ${l_upper_abs_cat} || exit 1
- ;;
- disable)
- # if "disable", install the same above but l_cat_line is
- # commented out.
- case ${first_p} in
- [Yy][Ee][Ss])
- echo " - ${dtd_act} ${l_cat_line} line in ${l_upper_cat}"
- echo "-- ${l_cat_line} --" >>${TMPCAT}
- cp ${TMPCAT} ${l_upper_abs_cat} || exit 1
- ;;
- *) rm -f ${TMPCAT}
- exit 0
- ;;
- esac
- ;;
- delete|deinstall)
- # if "deinstall or delete" install the temporary catalog
- # ${l_bottom_p}=YES means that
- # ${l_upper_cat} can be deleted safely, otherwise not.
- case ${l_bottom_p} in
- [Yy][Ee][Ss])
- echo " - ${dtd_act} ${l_cat_line} line from ${l_upper_cat}"
- cp ${TMPCAT} ${l_upper_abs_cat} || exit 1
- ;;
- *) rm -f ${TMPCAT}
- exit 0
- ;;
- esac
- ;;
- esac
- # when flag "preserve old" is specified but
- # there is no difference between new file and old one,
- # preservation is silently denied.
- if [ "x${F_PRESERVE_OLD}" != "x" ] && \
- cmp -s ${l_upper_abs_cat}.old ${l_upper_abs_cat}; then
- rm -f ${l_upper_abs_cat}.old
- fi
- rm -f ${TMPCAT}
- }
- compose_dir_list () {
- l_dir=$1
- # Creates dirlist such as the following.
- # input: docbook/4.1/my_extension
- # return: docbook/4.1/my_extension docbook/4.1 docbook
- IFS_old=${IFS}; IFS=" /"; set -- ${l_dir}
- l_dir_top=$1
- shift
- l_dir_rest="$*"
- IFS=${IFS_old}
- l_dir_item=${l_dir_top}
- l_dir_list=${l_dir_top}
- for i in ${l_dir_rest}; do
- l_dir_item="${l_dir_item}/${i}"
- l_dir_list="${l_dir_item} ${l_dir_list}"
- done
- echo ${l_dir_list}
- }
- bottom_p=YES
- first_p=YES
- set -- `compose_dir_list ${dtd_dir}` .
- verbose_msg "process catalog (relative to top one): $*"
- while
- case $# in
- 1) break ;;
- *) ;;
- esac
- do
- lower=$1
- upper=$2
- proc_catalog "${bottom_p}" "${upper}" "${lower}"
- first_p=NO
- if [ -f ${CAT_DIR}/${upper}/${CAT_FILE} ]; then
- bottom_p=NO
- fi
- shift
- done
- exit 0
|