# This file, debianize-fmtutil, is meant to be sourced by fmtutil and
# enhance the --enable and --disable options with the functionality
# needed to deal with Debian's generated fmtutil.cnf.
# $Id$

# This is the planned scheme how it works
# 
# A for disablefmt:
#   1. create a list of files to act on (either in sysconfdir only, or in user dirs too)
#   2. grep for not-commented lines in these files that contain $fmt
#   3. if in syswide-mode, for each of these files, run configReplace appropriately;
#      if not in syswide mode, for each of these files,
#             test whether it is in the syswide dir
#   3.a if not, run configReplace appropriately
#   3b. if yes, create copy in user dir and run configReplace appropriately
#
# B for enableMap:
#   1. create a list of files to act on (either in sysconfdir only, or in user dirs too)
#   2. grep for commented lines in these files that contain $map
#   2.1. if any are found, check whether it is only one
#   2.1.1 if there is only one, run configReplace on that file appropriately
#   2.1.2 if there is more than one, the precedence is 
#         20tetex-extra.cfg > XX*local*.cfg > 10tetex-base.cfg > any
#	  (extra has maximum priority because 
#   2.1.2.1 if it's clear on which file to act, run configReplace on that file
#           appropriately
#   2.1.2.2 if unclear (i.e. only "any"), exit with an error
#   2.2 if none are found, act on 10local.cfg (could be made configurable)
#       - if 10local.cfg does not exist, create it (with an explanatory comment)
#       - run configReplace on it appropriately
#
# C for syncwithtrees (and even more?)
# ?
#
# After that, update-fmtutil must be run (in the appropriate mode!), and then fmtutil
# must reexecute itself.  Since disableMap is called by enableMap, we need a wrapper
# for it.  

###############################################################################
# verboseMsg(msg)
#   print `msg' to stderr is $verbose is true
###############################################################################
verboseMsg() {
  $verboseFlag && verbose echo ${1+"$@"} >&2
}

###############################################################################
#  enablefmt(format)
#    enables format in configuration file
###############################################################################
enablefmt()
{
  enableFmtInner $1
  runUpdate
}

###############################################################################
# disablefmt(format)
#   disables format in configuration file
###############################################################################
disablefmt()
{
  disableFmtInner $1
  runUpdate
}

###############################################################################
# debianEditWarnAndShow()
#   warn that this won't work
###############################################################################
debianEditWarnAndShow(){
  echo "Warning!"
  echo ""
  echo "In Debian, fmtutil.cnf, the format configuration file, is a generated file."
  echo "The actual configuration files are in /etc/texmf/fmt.d."
  echo "Please read the update-fmtutil(1) manpage and edit those files."
  echo ""
  echo "Instead of editing, you will now be shown fmtutil.cnf in a pager."
  echo ""
  echo "Press enter to continue."
  read dummy
  
  sensible-pager $cnf_file

}

###############################################################################
# DebianSyswideMode ()
#   determine whether we are running in syswide mode (or user-specific)
###############################################################################
DebianSyswideMode(){
  test "$(id -u)" -eq 0 && return 0 || return 1
}

###############################################################################
# FindDebianUserdir ()
#   find the directory containing user-specific fmt.d snippets
###############################################################################
FindDebianUserdir(){
#  verboseMsg "entering FindDebianUserdir"

  texmfconfig=$(kpsewhich --expand-path '$TEXMFCONFIG')
  OLDIFS="$IFS"
  IFS=:
  count=0
  for d in "$texmfconfig"; do
    count=$(($count+1))
    : ${cnfdir:=$d}
    if [ -d "$d/fmt.d" ]; then
      defaultuserdir="$d/fmt.d"
      break
    fi
  done
  IFS="$OLDIFS"
  # still empty?  Pick one
  if [ -z "$defaultuserdir" ]; then
    if [ $count -eq 1 ]; then
      defaultuserdir="$cnfdir/fmt.d"
    else
      echo "TEXMFCONFIG contains more than one directory, and none of them" >&2
      echo "already contains a fmt.d/ subdirectory." >&2
      echo "I don't know how to proceed here, stopping." >&2
      return 
    fi
  fi

  /usr/share/texmf/web2c/mktexdir $defaultuserdir
  if [ -d $defaultuserdir ]; then
    echo $defaultuserdir
  fi
}

###############################################################################
# createDebianConffilelist
#   create a list of configuration files containing fmtutil snippets;
#   we are going to act on these
###############################################################################
createDebianConffilelist(){
#  verboseMsg "entering createDebianConffilelist"

  userFiles=""
  local DebianConffilelist=""
  syswideFiles=`find /etc/texmf/fmt.d -maxdepth 1 -type f -name '*.cnf'`
  if ! DebianSyswideMode; then
    debianuserdir=`FindDebianUserdir`
    if [ -n "$debianuserdir" ]; then
      userFiles=`find "$debianuserdir" -maxdepth 1 -type f -name '*.cnf'`
    fi
  fi
  if [ -n "$userFiles" ]; then
    for sysfile in $syswideFiles; do
      for userfile in $userFiles; do
	if [ ! "`basename $userfile`" = "`basename $sysfile`" ]; then
	  DebianConffilelist="$DebianConffilelist $sysfile"
	fi
      done
    done
    DebianConffilelist="$DebianConffilelist $userFiles"
  else
    DebianConffilelist="$syswideFiles"
  fi
  echo $DebianConffilelist
}

###############################################################################
# snippetFileIsWritable (debCnfFile)
#   checks whether we are (supposed to be) able to write to a file
###############################################################################
snippetFileIsWritable(){
  local file=$1

  if DebianSyswideMode; then
    return 0
  else
    # /etc/texmf/fmt.d shouldn't be hardcoded
    if [ "${file#/etc/texmf}" = "${file}" ]; then
      # file is not in systemwide dir
      return 0
    else
      return 1
    fi
  fi
}

###############################################################################
# makeUserCopy (filename)
#   create a copy in the user dir
###############################################################################
makeUserCopy(){
  local debCnfFile="$1"

  # create a copy of that file in the user dir
  debianuserdir=`FindDebianUserdir`
  newdebCnfFile="$debianuserdir/`basename $debCnfFile`"
  verboseMsg "I'm not allowed to handle $fmt in $debCnfFile." >&2
  verboseMsg "Creating copy in $debianuserdir instead." >&2
  cp $debCnfFile $newdebCnfFile
  echo "$newdebCnfFile"
}

###############################################################################
# findUserfiles (filelist)
#   pick user-specific files out of a filelist of configuration files
###############################################################################
findUserfiles(){
  userfiles=""
  while [ $# -gt 0 ]; do
    file="$1"
    if [ "$file" = "${file#/etc/texmf/}" ]; then
      # doesn't start with /etc/texmf/: must be user-specific
      userfiles="$userfiles $file"
    fi
    shift;
  done
  echo $userfiles
}

###############################################################################
# findRightMatchfile (format,filelist)
#   find the right file from filelist to enable mapname 
###############################################################################
findRightMatchfile(){
  fmt=$1; shift
  matchfiles="$@"
  local debCnfFile=""

  if [ $# -eq 1 ]; then
    # it is only one, enable map in it.  May we write it?
    debCnfFile=$matchfiles
    if ! snippetFileIsWritable $debCnfFile; then
      debCnfFile=`makeUserCopy $debCnfFile`
    fi
    echo $debCnfFile
    verboseMsg "Enabling format in $debCnfFile."
    return 0
  else
    # there are more than one; 
    if ! DebianSyswideMode; then
      # can only change files in the user's dir
      usermatchfiles=`findUserfi                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          