2 # $Id: tcfmgr 34641 2014-07-17 16:38:18Z karl $
3 # tcfmgr - TeX configuration file manager (sort of).
4 # Public domain. Originally written by Thomas Esser.
6 # invoke the right shell:
8 test -f /bin
/ksh
&& test -z "$RUNNING_KSH" \
9 && { UNAMES
=`uname -s`; test "x$UNAMES" = xULTRIX
; } 2>/dev
/null \
10 && { RUNNING_KSH
=true
; export RUNNING_KSH
; exec /bin
/ksh
$0 ${1+"$@"}; }
13 test -f /bin
/bsh
&& test -z "$RUNNING_BSH" \
14 && { UNAMES
=`uname -s`; test "x$UNAMES" = xAIX
; } 2>/dev
/null \
15 && { RUNNING_BSH
=true
; export RUNNING_BSH
; exec /bin
/bsh
$0 ${1+"$@"}; }
18 # preferentially use subprograms from our own directory.
19 mydir
=`echo "$0" | sed 's,/[^/]*$,,'`
20 mydir
=`cd "$mydir" && pwd`
21 PATH
="$mydir:$PATH"; export PATH
23 # hack around a bug in zsh:
24 test -n "${ZSH_VERSION+set}" && alias -g '${1+"$@"}'='"$@"'
30 echo "$progname: $@." >&2
37 "$TFC_MKTEXUPD" "$@" >&2
40 # call mktexdir script, disable all features (to prevent sticky directories)
44 MT_FEATURES
=none
"$TFC_MKTEXDIR" "$@" >&2
51 *) (exit 0); return 0;;
55 "") TFC_MAP
=`(kpsewhich -progname=texconfig -format='other text files' tcfmgr.map) 2>/dev/null`;;
59 "") abort
"config file \`tcfmgr.map' (usually in \$TEXMFMAIN/texconfig) not found (ls-R missing?)";;
62 if test ! -f "$TFC_MAP"; then
63 abort
"config file \`TFC_MAP' does not exist"
72 *) (exit 0); return 0;;
76 "") TFC_TEMP
=${TEMPDIR-/tmp};;
79 if test ! -d "$TFC_TEMP"; then
80 abort
"temp directory \`$TFC_TEMP' does not exist"
83 if test ! -w "$TFC_TEMP"; then
84 abort
"temp directory \`$TFC_TEMP' is not writable"
91 case $TFC_TEXMFCONFIG in
92 "") TFC_TEXMFCONFIG
=`(kpsewhich -var-value=TEXMFCONFIG) 2>/dev/null`;;
93 *) (exit 0); return 0;;
95 case $TFC_TEXMFCONFIG in
96 "") abort
"variable \$TEXMFCONFIG is not defined in texmf.cnf";;
102 case $TFC_MKTEXDIR in
103 "") TFC_MKTEXDIR
=`(kpsewhich --format='web2c files' mktexdir) 2>/dev/null`;;
106 case $TFC_MKTEXDIR in
107 "") abort
"program mktexdir (usually in \$TEXMFMAIN/web2c) not found";;
113 case $TFC_MKTEXUPD in
114 "") TFC_MKTEXUPD
=`(kpsewhich --format='web2c files' mktexupd) 2>/dev/null`;;
117 case $TFC_MKTEXUPD in
118 "") abort
"program mktexupd (usually in \$TEXMFMAIN/web2c) not found";;
125 if test ! -d "$TFC_TEXMFCONFIG"; then
126 mktexdir
"$TFC_TEXMFCONFIG" >/dev
/null
2>&1
127 if test ! -d "$TFC_TEXMFCONFIG"; then
128 msg
="Directory TEXMFCONFIG=\`$TFC_TEXMFCONFIG' does not exist"
136 if test -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" \
137 && test -w "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"
142 if test -d "$TFC_TEXMFCONFIG/$relDir"; then
143 if test -w "$TFC_TEXMFCONFIG/$relDir"; then
146 msg
="Directory \`$TFC_TEXMFCONFIG/$relDir' is not writable"
150 # we assume that a "mkdir -p" would work if the top-level
151 # $TFC_TEXMFCONFIG is writable
152 if test -w "$TFC_TEXMFCONFIG"; then
155 msg
="Directory \`$TFC_TEXMFCONFIG' is not writable"
164 "") abort
"missing --file option or empty argument";;
169 # set -- x `(awk '$1 == file' file=$TFC_FILE <$TFC_MAP) 2>/dev/null`; shift
170 set -- x
`(grep "^$TFC_FILE[ ]" $TFC_MAP) 2>/dev/null`; shift
181 "") abort
"no info for file \`$TFC_FILE' in map \`$TFC_MAP'";;
185 -) abort
"no known standard location for file \`$TFC_FILE' in map \`$TFC_MAP'";;
189 -) kpseProgArg
=kpsewhich
;;
195 if $createEmptyFile; then
201 orig
=`(kpsewhich -format="$kpseFormat" -progname="$kpseProgArg" "$TFC_FILE") 2>/dev/null`
204 test -f "$orig" || orig
=
208 "") abort
"file \`$TFC_FILE' not found";;
212 # writableCheck needs to get a valid relDir, so it calls get_info if necessary
213 if writableCheck
; then
218 There was a problem finding a proper place to store configuration data.
222 To overcome such problems, set up the environment variable TEXMFCONFIG to
223 point to a directory tree that is writable to you, e.g.
224 TEXMFCONFIG=\$HOME/texmf; export TEXMFCONFIG
226 setenv TEXMFCONFIG \$HOME/texmf
233 for d
in "$TFC_TEMP/$TFC_ID" "$TFC_TEMP/$TFC_ID/in" "$TFC_TEMP/$TFC_ID/out"; do
234 (umask 077; mkdir
"$d") || abort
"could not create directory \`$d'"
237 if $createEmptyFile; then
239 > "$TFC_TEMP/$TFC_ID/in/$TFC_FILE"
240 > "$TFC_TEMP/$TFC_ID/out/$TFC_FILE")
242 cp "$orig" "$TFC_TEMP/$TFC_ID/in/$TFC_FILE" \
243 || abort
"copy \`$orig' -> \`$TFC_TEMP/$TFC_ID/in/$TFC_FILE' failed"
245 cp "$orig" "$TFC_TEMP/$TFC_ID/out/$TFC_FILE" \
246 || abort
"copy \`$orig' -> \`$TFC_TEMP/$TFC_ID/out/$TFC_FILE' failed"
248 chmod u
+w
"$TFC_TEMP/$TFC_ID/out/$TFC_FILE"
251 cat >"$TFC_TEMP/$TFC_ID/relDir" <<eof
255 cat > "$TFC_TEMP/$TFC_ID/file" <<eof
259 echo "$TFC_ID $TFC_TEMP/$TFC_ID/in/$TFC_FILE $TFC_TEMP/$TFC_ID/out/$TFC_FILE $orig"
266 if test ! -d "$TFC_TEMP/$TFC_ID"; then
267 abort
"directory \`$TFC_TEMP/$TFC_ID' does not exist. Perhaps missing arg --id"
271 "") TFC_FILE
=`(cat "$TFC_TEMP/$TFC_ID/file") 2>/dev/null`;;
274 for f
in "$TFC_TEMP/$TFC_ID/relDir" "$TFC_TEMP/$TFC_ID/file" "$TFC_TEMP/$TFC_ID/in/$TFC_FILE" "$TFC_TEMP/$TFC_ID/out/$TFC_FILE"; do
275 if test ! -f "$f"; then
276 abort
"Oops! file \`$f' does not exist"
280 if (cmp "$TFC_TEMP/$TFC_ID/in/$TFC_FILE" "$TFC_TEMP/$TFC_ID/out/$TFC_FILE") >/dev
/null
2>&1; then
285 relDir
=`cat "$TFC_TEMP/$TFC_ID/relDir"`
286 if test ! -d "$TFC_TEXMFCONFIG/$relDir"; then
288 mktexdir
"$TFC_TEXMFCONFIG/$relDir" || abort
"could not create directory \`$TFC_TEXMFCONFIG/$relDir'"
291 if test -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"; then
293 test -w "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" ||
rm -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"
298 if test -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"; then
299 cat <"$TFC_TEMP/$TFC_ID/out/$TFC_FILE" >"$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" ||
300 abort
"failed to write new file \`$TFC_TEXMFCONFIG/$relDir/$TFC_FILE'"
302 cp "$TFC_TEMP/$TFC_ID/out/$TFC_FILE" "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" ||
303 abort
"failed to copy \`$TFC_TEMP/$TFC_ID/out/$TFC_FILE' to \`$TFC_TEXMFCONFIG/$relDir/$TFC_FILE'"
304 chmod 644 "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" 2>/dev
/null
306 if $needsLSRUpdate; then
307 mktexupd
"$TFC_TEXMFCONFIG/$relDir" "$TFC_FILE"
309 echo "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"
316 kpsewhich
-format="$kpseFormat" -progname="$kpseProgArg" "$TFC_FILE"
322 Usage: $progname [option] ...
325 --reldir specify directory relative to texmf root
326 --infile specify input file
327 --emptyinfile create an empty input file
328 --map specify map file
329 --texmfconfig texmf tree for config files
330 --mktexdir full path of mktexdir
331 --mktexupd full path of mktexupd
333 --id identity string (generated when running command co)
334 --file specify configuration entry from map file
335 --cmd command to execute
336 --help display this help
338 Valid commands (--cmd) are:
341 find look up source for file
342 mapfile display path name of map file
356 createEmptyFile
=false
358 STD_IFS
="$TAB$SPACE$NL"
361 --reldir) relDir
=$2; shift;;
362 --infile) orig
=$2; shift;;
363 --emptyinfile) createEmptyFile
=true
;;
364 --map) TFC_MAP
=$2; shift;;
366 TFC_TEXMFCONFIG
=$2; shift;;
371 --tmp) TFC_TEMP
=$2; shift;;
372 --id) TFC_ID
=$2; shift;;
373 --file)TFC_FILE
=$2; shift;;
374 --cmd) TFC_CMD
=$2; shift;;
375 --help) TFC_CMD
=help;;
377 *) abort
"unknown option \`$1'; try $progname --help"; (exit 1); exit 1;;
379 do test $# -gt 0 && shift; done
388 abort
"no command; try $progname --help"; (exit 1); exit 1;;
390 abort
"unknown command \`$TFC_CMD'; try $progname --help"; (exit 1); exit 1;;