Linux ip-172-26-7-228 5.4.0-1103-aws #111~18.04.1-Ubuntu SMP Tue May 23 20:04:10 UTC 2023 x86_64
Your IP : 3.12.76.168
# 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=`findUserfiles $matchfiles`
if [ `(set $usermatchfiles; echo $#)` -eq 1 ]; then
# exactly one of them is a user-specific file
echo $usermatchfiles
verboseMsg "Enabling format in user-specific file $usermatchfiles."
return 0
else
# two files in the user directory (as bad as two in the site-wide
# dir), or no user-specific files. If there are two user-specific
# files, report about them:
test -n "$usermatchfiles" && matchfiles="$usermatchfiles" || true
fi
fi
# for now, we exit with an error. Any sensible choice would have to
# check whether teTeX or texlive is installed, and I want to save me
# that hazzle.
cat >&2 <<EOF
Entries for format $fmt found in several files:
$matchfiles
Since fmtutil.cnf is a generated file in Debian, I don't know how to proceed.
Please refer to the manpage of update-fmtutil(1)
EOF
fi
}
###############################################################################
# pickLocalFile (mapname,directory)
# pick the right local file in directory
###############################################################################
pickLocalFile(){
fmt=$1
debDirname=$2
debDirname=${debDirname%/}
# Is there a file with "local" in the name?
localfile="`ls $debDirname/*local*cfg 2>/dev/null`"
if [ -n "$localfile" ]; then
# there is at least one
if [ `(set $localfile; echo $#)` -eq 1 ]; then
# exactly one
verboseMsg "Using local configuration file $localfile"
echo $localfile
return 0
else
# more than one local file? Brrrr.
cat >&2 <<EOF
While trying to enable $fmt locally, I found several user-specific config files:
$localfile
I don't know how to proceed here. Please refer to the manpage of update-fmtutil(1)
EOF
fi
else
# no user config file yet
echo $debDirname/10local.cfg
return 0
fi
}
###############################################################################
# findRightLocalfile (fmt)
# find the right file to enable fmt, site-wide or user-specific
###############################################################################
findRightLocalfile(){
fmt=$1
# Do we know about a user-specific directory?
if DebianSyswideMode; then
DebCnfFile=`pickLocalFile $fmt /etc/texmf/fmt.d`
else
debianuserdir=`FindDebianUserdir`
test -w $debianuserdir || (
echo "Target directory $debianuserdir not writable." >&2
echo "Exiting" >&2
exit 0
)
DebCnfFile=`pickLocalFile $fmt $debianuserdir`
fi
# # configReplace will try to grep in the file: touch it to prevent a error message
# touch $DebCnfFile
verboseMsg "Using local configuration file $DebCnfFile"
echo $DebCnfFile
}
###############################################################################
# runUpdate
# run update-fmtutil
###############################################################################
runUpdate(){
updOptions=""
if [ -n "$cfgparam" ]; then
# --conffile option was given on the command line
updOptions="--output-file $orig"
fi
# here we could check for an alternative user dir, or output file
# but as long as FindDebianUserdir only reports the default location,
# it doesn't make sense
verboseMsg "Running update-fmtutil to merge the changed files"
update-fmtutil --quiet $updOptions
}
###############################################################################
# disableFmtInner (map)
# disables fmt in config file (any type) (real command)
###############################################################################
disableFmtInner()
{
fmt=$1
noverbose="$2"
local debCnfFile
oldverbose="$verbose"
if [ -n "$noverbose" ]; then
# don't confuse users with disable messages when they called --enable
# verboseMsg "disabling verbosity"
verbose=false
fi
if [ -z "$DebianConffilelist" ]; then
DebianConffilelist=`createDebianConffilelist`
fi
# create list of all files that contain an entry
for debCnfFile in $DebianConffilelist; do
if grep -q "^$fmt" $debCnfFile; then
if ! snippetFileIsWritable $debCnfFile; then
debCnfFile=`makeUserCopy $debCnfFile`
fi
verboseMsg "Disabling $fmt in $debCnfFile."
ed $debCnfFile >/dev/null 2>&1 <<-eof
g/^$fmt[ ]/s/^/#! /
w
q
eof
fi
done
verbose="$oldverbose"
return 0
}
###############################################################################
# enableFmtInner (fmt)
# enables fmt in config file (any type) (real command)
###############################################################################
enableFmtInner(){
fmt=$1
local debCnfFile=""
if [ -z "$DebianConffilelist" ]; then
DebianConffilelist=`createDebianConffilelist`
fi
# a format should only be defined once, so we carefully disable
# everything about it here:
disableFmtInner "$fmt" noverbose
# now enable with the right type.
# But we have to determine where to enable.
# is there already a file that contains a (commented) entry?
matchfiles=""
for file in $DebianConffilelist; do
if grep -q "^#![ ]*$fmt[ ]" "$file"; then
matchfiles="$matchfiles $file"
fi
done
if [ -n "$matchfiles" ]; then
# there is already (at least) one file that has a commented entry for our map
debCnfFile=`findRightMatchfile $fmt $matchfiles`
test -w "$debCnfFile" || debCnfFile=""
fi
if [ -z "$debCnfFile" ]; then
# still none, there is no (commented) entry in any writable file yet.
debCnfFile=`findRightLocalfile $fmt`
test -n "$debCnfFile" || abort "Cannot proceed. Exiting"
verboseMsg "Creating new entry for format $fmt in $debCnfFile"
fi
ed $debCnfFile >/dev/null 2>&1 <<-eof
g/^#![ ]*$fmt[ ]/s/..[ ]*//
w
q
eof
}
|