summaryrefslogtreecommitdiff
path: root/Build/source/texk/tetex/tcfmgr
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/tetex/tcfmgr')
-rwxr-xr-xBuild/source/texk/tetex/tcfmgr385
1 files changed, 385 insertions, 0 deletions
diff --git a/Build/source/texk/tetex/tcfmgr b/Build/source/texk/tetex/tcfmgr
new file mode 100755
index 00000000000..fcbf45e520c
--- /dev/null
+++ b/Build/source/texk/tetex/tcfmgr
@@ -0,0 +1,385 @@
+#!/bin/sh
+
+# invoke the right shell:
+
+test -f /bin/ksh && test -z "$RUNNING_KSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xULTRIX; } 2>/dev/null \
+ && { RUNNING_KSH=true; export RUNNING_KSH; exec /bin/ksh $0 ${1+"$@"}; }
+unset RUNNING_KSH
+
+test -f /bin/bsh && test -z "$RUNNING_BSH" \
+ && { UNAMES=`uname -s`; test "x$UNAMES" = xAIX; } 2>/dev/null \
+ && { RUNNING_BSH=true; export RUNNING_BSH; exec /bin/bsh $0 ${1+"$@"}; }
+unset RUNNING_BSH
+
+export PATH
+
+# hack around a bug in zsh:
+test -n "${ZSH_VERSION+set}" && alias -g '${1+"$@"}'='"$@"'
+
+progname=tcfmgr
+
+abort()
+{
+ echo "$progname: $@." >&2
+ (exit 1); exit 1
+}
+
+mktexupd()
+{
+ setupMktexupd
+ $TFC_MKTEXUPD "$@" >&2
+}
+
+# call mktexdir script, disable all features (to prevent sticky directories)
+mktexdir()
+{
+ setupMktexDir
+ MT_FEATURES=none $TFC_MKTEXDIR "$@" >&2
+}
+
+setupMap()
+{
+ case $setupMapOK in
+ "") : ;;
+ *) (exit 0); return 0;;
+ esac
+
+ case $TFC_MAP in
+ "") TFC_MAP=`(kpsewhich -progname=texconfig -format='other text files' tcfmgr.map) 2>/dev/null`;;
+ esac
+
+ case $TFC_MAP in
+ "") abort "config file \`tcfmgr.map' (usually in \$TEXMFMAIN/texconfig) not found";;
+ esac
+
+ if test ! -f "$TFC_MAP"; then
+ abort "config file \`TFC_MAP' does not exist"
+ fi
+ setupMapOK=true
+}
+
+setupTemp()
+{
+ case $setupTempOK in
+ "") : ;;
+ *) (exit 0); return 0;;
+ esac
+
+ case $TFC_TEMP in
+ "") TFC_TEMP=${TEMPDIR-/tmp};;
+ esac
+
+ if test ! -d "$TFC_TEMP"; then
+ abort "temp directory \`$TFC_TEMP' does not exist"
+ fi
+
+ if test ! -w "$TFC_TEMP"; then
+ abort "temp directory \`$TFC_TEMP' is not writable"
+ fi
+ setupTempOK=true
+}
+
+setupTexmfConfig()
+{
+ case $TFC_TEXMFCONFIG in
+ "") TFC_TEXMFCONFIG=`(kpsewhich -var-value=TEXMFCONFIG) 2>/dev/null`;;
+ *) (exit 0); return 0;;
+ esac
+ case $TFC_TEXMFCONFIG in
+ "") abort "variable \$TEXMFCONFIG is not defined in texmf.cnf";;
+ esac
+}
+
+setupMktexDir()
+{
+ case $TFC_MKTEXDIR in
+ "") TFC_MKTEXDIR=`(kpsewhich --format='web2c files' mktexdir) 2>/dev/null`;;
+ esac
+
+ case $TFC_MKTEXDIR in
+ "") abort "program mktexdir (usually in \$TEXMFMAIN/web2c) not found";;
+ esac
+}
+
+setupMktexupd()
+{
+ case $TFC_MKTEXUPD in
+ "") TFC_MKTEXUPD=`(kpsewhich --format='web2c files' mktexupd) 2>/dev/null`;;
+ esac
+
+ case $TFC_MKTEXUPD in
+ "") abort "program mktexupd (usually in \$TEXMFMAIN/web2c) not found";;
+ esac
+}
+
+writableCheck()
+{
+ setupTexmfConfig
+ if test ! -d "$TFC_TEXMFCONFIG"; then
+ mktexdir "$TFC_TEXMFCONFIG" >/dev/null 2>&1
+ if test ! -d "$TFC_TEXMFCONFIG"; then
+ msg="Directory TEXMFCONFIG=\`$TFC_TEXMFCONFIG' does not exist"
+ (exit 1); return 1
+ fi
+ fi
+
+ case "$relDir" in
+ "") get_info;;
+ esac
+ if test -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" \
+ && test -w "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"
+ then
+ (exit 0); return 0
+ fi
+
+ if test -d "$TFC_TEXMFCONFIG/$relDir"; then
+ if test -w "$TFC_TEXMFCONFIG/$relDir"; then
+ (exit 0); return 0
+ else
+ msg="Directory \`$TFC_TEXMFCONFIG/$relDir' is not writable"
+ (exit 1); return 1
+ fi
+ else
+ # we assume that a "mkdir -p" would work if the top-level
+ # $TFC_TEXMFCONFIG is writable
+ if test -w "$TFC_TEXMFCONFIG"; then
+ (exit 0); return 0
+ else
+ msg="Directory \`$TFC_TEXMFCONFIG' is not writable"
+ (exit 1); return 1
+ fi
+ fi
+}
+
+get_info()
+{
+ case "$TFC_FILE" in
+ "") abort "missing --file option or empty argument";;
+ esac
+ setupMap
+ # prepare + get info
+ IFS=$TAB
+ # set -- x `(awk '$1 == file' file=$TFC_FILE <$TFC_MAP) 2>/dev/null`; shift
+ set -- x `(grep "^$TFC_FILE[ ]" $TFC_MAP) 2>/dev/null`; shift
+ IFS=$STD_IFS
+
+ # assign results
+ file="$1"
+ relDir="$2"
+ kpseFormat="$3"
+ kpseProgArg="$4"
+
+ # sanity checks
+ case $file in
+ "") abort "no info for file \`$TFC_FILE' in map \`$TFC_MAP'";;
+ esac
+
+ case $relDir in
+ -) abort "no known standard location for file \`$TFC_FILE' in map \`$TFC_MAP'";;
+ esac
+
+ case $kpseProgArg in
+ -) kpseProgArg=kpsewhich;;
+ esac
+}
+
+check_out()
+{
+ if $createEmptyFile; then
+ :
+ else
+ case "$orig" in
+ "")
+ get_info
+ orig=`(kpsewhich -format="$kpseFormat" -progname="$kpseProgArg" "$TFC_FILE") 2>/dev/null`
+ ;;
+ *)
+ test -f "$orig" || orig=
+ esac
+
+ case $orig in
+ "") abort "file \`$TFC_FILE' not found";;
+ esac
+ fi
+
+ # writableCheck needs to get a valid relDir, so it calls get_info if necessary
+ if writableCheck; then
+ : ok
+ else
+ cat >&2 <<eof
+
+There was a problem finding a proper place to store configuration data.
+The message was:
+ $msg
+
+To overcome such problems, set up the environment variable TEXMFCONFIG to
+point to a directory tree that is writable to you, e.g.
+ TEXMFCONFIG=\$HOME/texmf; export TEXMFCONFIG
+or
+ setenv TEXMFCONFIG \$HOME/texmf
+eof
+ (exit 1); exit 1
+ fi
+
+ setupTemp
+ : ${TFC_ID=tfc$$}
+ for d in "$TFC_TEMP/$TFC_ID" "$TFC_TEMP/$TFC_ID/in" "$TFC_TEMP/$TFC_ID/out"; do
+ (umask 077; mkdir "$d") || abort "could not create directory \`$d'"
+ done
+
+ if $createEmptyFile; then
+ (umask 022
+ > "$TFC_TEMP/$TFC_ID/in/$TFC_FILE"
+ > "$TFC_TEMP/$TFC_ID/out/$TFC_FILE")
+ else
+ cp "$orig" "$TFC_TEMP/$TFC_ID/in/$TFC_FILE" \
+ || abort "copy \`$orig' -> \`$TFC_TEMP/$TFC_ID/in/$TFC_FILE' failed"
+
+ cp "$orig" "$TFC_TEMP/$TFC_ID/out/$TFC_FILE" \
+ || abort "copy \`$orig' -> \`$TFC_TEMP/$TFC_ID/out/$TFC_FILE' failed"
+
+ chmod u+w "$TFC_TEMP/$TFC_ID/out/$TFC_FILE"
+ fi
+
+ cat >"$TFC_TEMP/$TFC_ID/relDir" <<eof
+$relDir
+eof
+
+ cat > "$TFC_TEMP/$TFC_ID/file" <<eof
+$TFC_FILE
+eof
+
+ echo "$TFC_ID $TFC_TEMP/$TFC_ID/in/$TFC_FILE $TFC_TEMP/$TFC_ID/out/$TFC_FILE $orig"
+}
+
+check_in()
+{
+ setupTemp
+
+ if test ! -d "$TFC_TEMP/$TFC_ID"; then
+ abort "directory \`$TFC_TEMP/$TFC_ID' does not exist. Perhaps missing arg --id"
+ fi
+
+ case "$TFC_FILE" in
+ "") TFC_FILE=`(cat "$TFC_TEMP/$TFC_ID/file") 2>/dev/null`;;
+ esac
+
+ 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
+ if test ! -f "$f"; then
+ abort "Oops! file \`$f' does not exist"
+ fi
+ done
+
+ if (cmp "$TFC_TEMP/$TFC_ID/in/$TFC_FILE" "$TFC_TEMP/$TFC_ID/out/$TFC_FILE") >/dev/null 2>&1; then
+ (exit 0); return 0
+ fi
+
+ setupTexmfConfig
+ relDir=`cat "$TFC_TEMP/$TFC_ID/relDir"`
+ if test ! -d "$TFC_TEXMFCONFIG/$relDir"; then
+ setupMktexDir
+ mktexdir "$TFC_TEXMFCONFIG/$relDir" || abort "could not create directory \`$TFC_TEXMFCONFIG/$relDir'"
+ fi
+
+ if test -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"; then
+ needsLSRUpdate=false
+ test -w "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" || rm -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"
+ else
+ needsLSRUpdate=true
+ fi
+
+ if test -f "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"; then
+ cat <"$TFC_TEMP/$TFC_ID/out/$TFC_FILE" >"$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" ||
+ abort "failed to write new file \`$TFC_TEXMFCONFIG/$relDir/$TFC_FILE'"
+ else
+ cp "$TFC_TEMP/$TFC_ID/out/$TFC_FILE" "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" ||
+ abort "failed to copy \`$TFC_TEMP/$TFC_ID/out/$TFC_FILE' to \`$TFC_TEXMFCONFIG/$relDir/$TFC_FILE'"
+ chmod 644 "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE" 2>/dev/null
+ fi
+ if $needsLSRUpdate; then
+ mktexupd "$TFC_TEXMFCONFIG/$relDir" "$TFC_FILE"
+ fi
+ echo "$TFC_TEXMFCONFIG/$relDir/$TFC_FILE"
+ (exit 0); return 0
+}
+
+find_file()
+{
+ get_info
+ kpsewhich -format="$kpseFormat" -progname="$kpseProgArg" "$TFC_FILE"
+}
+
+help()
+{
+ cat <<eof
+Usage: $progname [option] ...
+
+Valid options:
+ --reldir specify directory relative to texmf root
+ --infile specify input file
+ --emptyinfile create an empty input file
+ --map specify map file
+ --texmfconfig texmf tree for config files
+ --mktexdir full path of mktexdir
+ --mktexupd full path of mktexupd
+ --tmp temp directory
+ --id identity string (generated when running command co)
+ --file specify configuration entry from map file
+ --cmd command to execute
+ --help display this help
+
+Valid commands (--cmd) are:
+ co check out
+ ci check in
+ find look up source for file
+ mapfile display path name of map file
+eof
+}
+
+show_map()
+{
+ setupMap
+ echo "$TFC_MAP"
+}
+
+TAB=' '
+SPACE=' '
+NL='
+'
+createEmptyFile=false
+
+STD_IFS="$TAB$SPACE$NL"
+while
+ case $1 in
+ --reldir) relDir=$2; shift;;
+ --infile) orig=$2; shift;;
+ --emptyinfile) createEmptyFile=true;;
+ --map) TFC_MAP=$2; shift;;
+ --texmfconfig)
+ TFC_TEXMFCONFIG=$2; shift;;
+ --mktexdir)
+ TFC_MKTEXDIR=$2;;
+ --mktexupd)
+ TFC_MKTEXUPD=$2;;
+ --tmp) TFC_TEMP=$2; shift;;
+ --id) TFC_ID=$2; shift;;
+ --file)TFC_FILE=$2; shift;;
+ --cmd) TFC_CMD=$2; shift;;
+ --help) TFC_CMD=help;;
+ "") break;;
+ *) abort "unknown option \`$1'; try $progname --help"; (exit 1); exit 1;;
+ esac
+do test $# -gt 0 && shift; done
+
+case $TFC_CMD in
+ ci) check_in;;
+ co) check_out;;
+ find) find_file;;
+ mapfile) show_map;;
+ help) help;;
+ "")
+ abort "no command; try $progname --help"; (exit 1); exit 1;;
+ *)
+ abort "unknown command \`$TFC_CMD'; try $progname --help"; (exit 1); exit 1;;
+esac