diff --git a/textproc/mkcatalog/Makefile b/textproc/mkcatalog/Makefile index 438182e6550a..9a8789e7f61f 100644 --- a/textproc/mkcatalog/Makefile +++ b/textproc/mkcatalog/Makefile @@ -8,7 +8,7 @@ # PORTNAME= mkcatalog -PORTVERSION= 1.0 +PORTVERSION= 1.1 CATEGORIES= textproc MASTER_SITES= # none DISTFILES= # none diff --git a/textproc/mkcatalog/src/mkcatalog.in b/textproc/mkcatalog/src/mkcatalog.in index 6941e787666c..4f6a4191455c 100644 --- a/textproc/mkcatalog/src/mkcatalog.in +++ b/textproc/mkcatalog/src/mkcatalog.in @@ -7,123 +7,287 @@ # # $FreeBSD$ # +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=@@PREFIX@@ -CAT_DIR=${PREFIX}/share/sgml TMPDIR=/tmp +ARGV0=`sh_basename $0` + +# default top-level catalog file +CAT_DIR=${PREFIX}/share/sgml +CAT_FILE=catalog F_PRESERVE_OLD="" -F_QUIET="" -args=`getopt pq $*` ; set -- $args +F_VERBOSE="" +args=`getopt pqvc: $*` ; set -- $args for i do case "$i" in - -p) F_PRESERVE_OLD=1; shift ;; - -q) F_QUIET=1; shift ;; - --) shift; break ;; + -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 -[ "x${F_QUIET}" != "x" ] && exec 1> /dev/null 2>&1 - -dtd_install=$1 +dtd_act=$1 dtd_dir=$2 -[ x"$3" != "x" ] && dtd_catalog=`basename "$3"` || dtd_catalog='' +dtd_catalog=`sh_basename "$3"` -### option check -case "${dtd_install}" in -install|deinstall) - if [ -d "${CAT_DIR}/${dtd_dir}" -o -d "${dtd_dir}" ]; then - dtd_dir=`exec 2>/dev/null; cd ${CAT_DIR}/${dtd_dir} || cd ${dtd_dir}; pwd` - case "${dtd_dir}" in - ${CAT_DIR}/*) ;; - *) echo "`basename $0`: DTD directory \"${dtd_dir}\" is invalid." - exit 1 ;; - esac - else - echo "`basename $0`: DTD directory \"${dtd_dir}\" not found." +### 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 - ### normalize dtd_dir + 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 "`basename $0`: missig options." - echo "usage: `basename $0` [-pq] [install|deinstall] dtd-directory-name [catalog-filename]." - exit 1 + echo "${ARGV0}: missing options." + cat < ${TMPCAT} - - ### preserve old catalog - if [ "x${F_PRESERVE_OLD}" != "x" ]; then - cp ${catalog_high} ${catalog_high}.old || exit 1 - fi - - case "${dtd_install}" in - install) - echo " * add ${cat_line} line to ${catalog_high}" - echo "${cat_line}" >> ${TMPCAT} - cp ${TMPCAT} ${catalog_high} || exit 1 - ;; - deinstall) - echo " * delete ${cat_line} line from ${catalog_high}" - if [ ! -s ${TMPCAT} ]; then - echo " * delete empty catalog ${catalog_high}" - rm -f ${catalog_high} - else - cp ${TMPCAT} ${catalog_high} || exit 1 - undelete_flag="YES" - fi - ;; + 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} + + # for debug + #echo ${l_bottom_p} ${l_upper_cat} ${l_lower_cat} + + l_cat_line="CATALOG \"${l_lower_cat}\"" + l_abs_path_head=`cd ${l_upper_abs}; echo ${PWD}` + + # for debug + #echo ${l_cat_line} + + # 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 tamporary 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" and the temporary catalog is + # not empty, install the catalog itself (in the case of being + # empty, delete it). ${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}" + if [ ! -s ${TMPCAT} ]; then + echo " - delete empty catalog ${l_upper_cat}" + rm -f ${l_upper_abs_cat} + else + cp ${TMPCAT} ${l_upper_abs_cat} || exit 1 + fi + ;; + *) 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 ${catalog_high}.old ${catalog_high}; then - rm -f ${catalog_high}.old + cmp -s ${l_upper_abs_cat}.old ${l_upper_abs_cat}; then + rm -f ${l_upper_abs_cat}.old fi rm -f ${TMPCAT} } -IFS=" /"; set -- ${dtd_dir} -dtd_name=$1 -dtd_list="$*" -IFS=" " -n_dtd_list=$# -counter=${n_dtd_list} -undelete_flag="NO" +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} -while [ ${counter} -ne 0 ]; + 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_dtd_dir=`echo ${dtd_list} | sed 's/[^ ]* //g'` - upper_dtd_list=`echo ${dtd_list} | sed "s/${lower_dtd_dir}$//"` + lower=$1 + upper=$2 + proc_catalog "${bottom_p}" "${upper}" "${lower}" - cat_high_dir=${CAT_DIR}/`echo "${upper_dtd_list}" | sed 's; ;/;g'` - cat_high_dir=`echo ${cat_high_dir} | sed 's;/$;;'` - cat_low_dir=${lower_dtd_dir} - - if [ ${undelete_flag} = "YES" ]; then - exit 0; + first_p=NO + if [ -f ${CAT_DIR}/${upper}/${CAT_FILE} ]; then + bottom_p=NO fi - - if [ ${counter} -ne ${n_dtd_list} ]; then - proc_catalog ${cat_high_dir}/catalog ${cat_low_dir}/catalog - else - proc_catalog ${cat_high_dir}/catalog ${cat_low_dir}/${dtd_catalog:-catalog} - fi - - counter=`expr ${counter} - 1` - dtd_list=${upper_dtd_list} + shift; done exit 0;