beta-0.89.2
[luatex.git] / source / texk / texlive / tl_scripts / tcfmgr
blob08dddbd4d1a71e5be749e58b6dba37efade96b9e
1 #!/bin/sh
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+"$@"}; }
11 unset RUNNING_KSH
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+"$@"}; }
16 unset RUNNING_BSH
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+"$@"}'='"$@"'
26 progname=tcfmgr
28 abort()
30 echo "$progname: $@." >&2
31 (exit 1); exit 1
34 mktexupd()
36 setupMktexupd
37 "$TFC_MKTEXUPD" "$@" >&2
40 # call mktexdir script, disable all features (to prevent sticky directories)
41 mktexdir()
43 setupMktexDir
44 MT_FEATURES=none "$TFC_MKTEXDIR" "$@" >&2
47 setupMap()
49 case $setupMapOK in
50 "") : ;;
51 *) (exit 0); return 0;;
52 esac
54 case $TFC_MAP in
55 "") TFC_MAP=`(kpsewhich -progname=texconfig -format='other text files' tcfmgr.map) 2>/dev/null`;;
56 esac
58 case $TFC_MAP in
59 "") abort "config file \`tcfmgr.map' (usually in \$TEXMFMAIN/texconfig) not found (ls-R missing?)";;
60 esac
62 if test ! -f "$TFC_MAP"; then
63 abort "config file \`TFC_MAP' does not exist"
65 setupMapOK=true
68 setupTemp()
70 case $setupTempOK in
71 "") : ;;
72 *) (exit 0); return 0;;
73 esac
75 case $TFC_TEMP in
76 "") TFC_TEMP=${TEMPDIR-/tmp};;
77 esac
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"
86 setupTempOK=true
89 setupTexmfConfig()
91 case $TFC_TEXMFCONFIG in
92 "") TFC_TEXMFCONFIG=`(kpsewhich -var-value=TEXMFCONFIG) 2>/dev/null`;;
93 *) (exit 0); return 0;;
94 esac
95 case $TFC_TEXMFCONFIG in
96 "") abort "variable \$TEXMFCONFIG is not defined in texmf.cnf";;
97 esac
100 setupMktexDir()
102 case $TFC_MKTEXDIR in
103 "") TFC_MKTEXDIR=`(kpsewhich --format='web2c files' mktexdir) 2>/dev/null`;;
104 esac
106 case $TFC_MKTEXDIR in
107 "") abort "program mktexdir (usually in \$TEXMFMAIN/web2c) not found";;
108 esac
111 setupMktexupd()
113 case $TFC_MKTEXUPD in
114 "") TFC_MKTEXUPD=`(kpsewhich --format='web2c files' mktexupd) 2>/dev/null`;;
115 esac
117 case $TFC_MKTEXUPD in
118 "") abort "program mktexupd (usually in \$TEXMFMAIN/web2c) not found";;
119 esac
122 writableCheck()
124 setupTexmfConfig
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"
129 (exit 1); return 1
133 case "$relDir" in
134 "") get_info;;
135 esac
136 if test -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" \
137 && test -w "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"
138 then
139 (exit 0); return 0
142 if test -d "$TFC_TEXMFCONFIG/$relDir"; then
143 if test -w "$TFC_TEXMFCONFIG/$relDir"; then
144 (exit 0); return 0
145 else
146 msg="Directory \`$TFC_TEXMFCONFIG/$relDir' is not writable"
147 (exit 1); return 1
149 else
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
153 (exit 0); return 0
154 else
155 msg="Directory \`$TFC_TEXMFCONFIG' is not writable"
156 (exit 1); return 1
161 get_info()
163 case "$TFC_FILE" in
164 "") abort "missing --file option or empty argument";;
165 esac
166 setupMap
167 # prepare + get info
168 IFS=$TAB
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
171 IFS=$STD_IFS
173 # assign results
174 file="$1"
175 relDir="$2"
176 kpseFormat="$3"
177 kpseProgArg="$4"
179 # sanity checks
180 case $file in
181 "") abort "no info for file \`$TFC_FILE' in map \`$TFC_MAP'";;
182 esac
184 case $relDir in
185 -) abort "no known standard location for file \`$TFC_FILE' in map \`$TFC_MAP'";;
186 esac
188 case $kpseProgArg in
189 -) kpseProgArg=kpsewhich;;
190 esac
193 check_out()
195 if $createEmptyFile; then
197 else
198 case "$orig" in
200 get_info
201 orig=`(kpsewhich -format="$kpseFormat" -progname="$kpseProgArg" "$TFC_FILE") 2>/dev/null`
204 test -f "$orig" || orig=
205 esac
207 case $orig in
208 "") abort "file \`$TFC_FILE' not found";;
209 esac
212 # writableCheck needs to get a valid relDir, so it calls get_info if necessary
213 if writableCheck; then
214 : ok
215 else
216 cat >&2 <<eof
218 There was a problem finding a proper place to store configuration data.
219 The message was:
220 $msg
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
228 (exit 1); exit 1
231 setupTemp
232 : ${TFC_ID=tfc$$}
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'"
235 done
237 if $createEmptyFile; then
238 (umask 022
239 > "$TFC_TEMP/$TFC_ID/in/$TFC_FILE"
240 > "$TFC_TEMP/$TFC_ID/out/$TFC_FILE")
241 else
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
252 $relDir
255 cat > "$TFC_TEMP/$TFC_ID/file" <<eof
256 $TFC_FILE
259 echo "$TFC_ID $TFC_TEMP/$TFC_ID/in/$TFC_FILE $TFC_TEMP/$TFC_ID/out/$TFC_FILE $orig"
262 check_in()
264 setupTemp
266 if test ! -d "$TFC_TEMP/$TFC_ID"; then
267 abort "directory \`$TFC_TEMP/$TFC_ID' does not exist. Perhaps missing arg --id"
270 case "$TFC_FILE" in
271 "") TFC_FILE=`(cat "$TFC_TEMP/$TFC_ID/file") 2>/dev/null`;;
272 esac
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"
278 done
280 if (cmp "$TFC_TEMP/$TFC_ID/in/$TFC_FILE" "$TFC_TEMP/$TFC_ID/out/$TFC_FILE") >/dev/null 2>&1; then
281 (exit 0); return 0
284 setupTexmfConfig
285 relDir=`cat "$TFC_TEMP/$TFC_ID/relDir"`
286 if test ! -d "$TFC_TEXMFCONFIG/$relDir"; then
287 setupMktexDir
288 mktexdir "$TFC_TEXMFCONFIG/$relDir" || abort "could not create directory \`$TFC_TEXMFCONFIG/$relDir'"
291 if test -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"; then
292 needsLSRUpdate=false
293 test -w "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" || rm -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"
294 else
295 needsLSRUpdate=true
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'"
301 else
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"
310 (exit 0); return 0
313 find_file()
315 get_info
316 kpsewhich -format="$kpseFormat" -progname="$kpseProgArg" "$TFC_FILE"
319 help()
321 cat <<eof
322 Usage: $progname [option] ...
324 Valid options:
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
332 --tmp temp directory
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:
339 co check out
340 ci check in
341 find look up source for file
342 mapfile display path name of map file
346 show_map()
348 setupMap
349 echo "$TFC_MAP"
352 TAB=' '
353 SPACE=' '
354 NL='
356 createEmptyFile=false
358 STD_IFS="$TAB$SPACE$NL"
359 while
360 case $1 in
361 --reldir) relDir=$2; shift;;
362 --infile) orig=$2; shift;;
363 --emptyinfile) createEmptyFile=true;;
364 --map) TFC_MAP=$2; shift;;
365 --texmfconfig)
366 TFC_TEXMFCONFIG=$2; shift;;
367 --mktexdir)
368 TFC_MKTEXDIR=$2;;
369 --mktexupd)
370 TFC_MKTEXUPD=$2;;
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;;
376 "") break;;
377 *) abort "unknown option \`$1'; try $progname --help"; (exit 1); exit 1;;
378 esac
379 do test $# -gt 0 && shift; done
381 case $TFC_CMD in
382 ci) check_in;;
383 co) check_out;;
384 find) find_file;;
385 mapfile) show_map;;
386 help) help;;
388 abort "no command; try $progname --help"; (exit 1); exit 1;;
390 abort "unknown command \`$TFC_CMD'; try $progname --help"; (exit 1); exit 1;;
391 esac