File: //proc/self/root/usr/bin/texhash
#!/bin/sh
# original mktexlsr -- create or rebuild ls-R.
#
# (If you change or delete the word `original' on the previous line,
# installation won't write this script over yours.)
#
# Suitable for calling from cron, as in:
# 0 * * * * cd /your/texmf/root && /usr/local/bin/mktexlsr
# unless the scripts live in a different directory than the 'kpseaccess',
# 'kpsestat', 'kpsereadlink', and 'kpsewhich' binaries.
#
# Originally written as `texhash' by Thomas Esser
# <te@dbs.uni-hannover.de>, Okt., 1994.
# Public domain.
version='$Id: mktexlsr,v 1.45 2005/01/21 19:13:57 olaf Exp $'
progname=`echo $0 | sed 's%.*/%%'`
usage="Usage: $progname [DIRS ...]
Rebuild all necessary ls-R filename databases completely. If one or
more arguments DIRS are given, these are used as texmf directories to
build ls-R for. Else all directories in the search path for ls-R files
(\$TEXMFDBS) are used."
# MS-DOS and MS-Windows define $COMSPEC or $ComSpec and use `;' to separate
# directories in path lists whereas Unix uses `:'. Make an exception for
# Cygwin, which pretends to be UNIX.
# Create a variable that holds the right character to be used by the scripts.
DOSISH=no
case `uname -s` in
CYGWIN*|Cygwin*|cygwin*) ;;
*) if test -n "$COMSPEC" || test -n "$ComSpec"; then DOSISH=yes; fi
esac
if test "$DOSISH" = "no"; then SEP=':'; else SEP=';';fi
# Add the location of the script to the PATH if necessary. This must
# be done before kpsewhich can be called, and thus cannot be put into
# mktex.opt.
dirname=`echo $0 | sed 's%/*[^/][^/]*$%%'`
case $dirname in
"") # Do nothing
;;
/* | [A-z]:/*) # Absolute name
PATH="$dirname$SEP$PATH" ;;
*) # Relative name
PATH="`pwd`/$dirname$SEP$PATH" ;;
esac
# A copy of some stuff from mktex.opt, so we can run in the presence of
# terminally damaged ls-R files.
if test "x$1" = x--help || test "x$1" = x-help; then
echo "$usage"
exit 0
elif test "x$1" = x--version || test "x$1" = x-version; then
echo "`basename $0` $version"
kpsewhich --version
exit 0
fi
# mktexupd and mktexlsr make sure they're coordinated via this. A copy
# is found mktex.opt.
ls_R_magic='% ls-R -- filename database for kpathsea; do not change this line.'
# The old string, which should continue to work.
old_ls_R_magic='% ls-R -- maintained by MakeTeXls-R; do not change this line.'
trap 'cd / ; test -z "$db_dir_tmp" || rm -rf "$db_dir_tmp"; exit' 0 1 2 3 7 13 15
# Get list of directories from $TEXMFDBS; eliminate duplicates.
test $# = 0 && {
OIFS=$IFS
IFS='
'
set x `kpsewhich --show-path=ls-R | tr : '
' | sort | uniq`; shift
IFS=$OIFS
}
for TEXMFLS_R in "$@"; do
# Prepend cwd if the directory was relative.
case "$TEXMFLS_R" in
"") continue ;; # Strictly speaking, it is an error if this case is taken.
/* | [A-z]:/*) ;;
*) TEXMFLS_R="`pwd`/$TEXMFLS_R"
esac
# Allow for ls-R and ls-r to exist. But create ls-R if we're working
# from scratch.
if test -f "$TEXMFLS_R/ls-R"; then
db_file="$TEXMFLS_R/ls-R"
elif test -f "$TEXMFLS_R/ls-r"; then
db_file="$TEXMFLS_R/ls-r"
else
db_file="$TEXMFLS_R/ls-R"
fi
# Follow a possible symlink to get the right filesystem.
# The '|| true' construct prevents an sh -e aborting.
db_readlink=`kpsereadlink "$TEXMFLS_R/ls-R" 2>/dev/null` || true
case "$db_readlink" in
"") ;;
/* | [A-z]:/*) db_file="$db_readlink" ;;
*) db_file="$TEXMFLS_R/$db_readlink"
esac
db_dir=`echo "$db_file" | sed 's%/[^/][^/]*$%%'` # can't rely on dirname
test -d "$db_dir" || continue
test -w "$db_dir" || { echo "$progname: $db_dir: directory not writable. Skipping..." >&2; continue; }
if test ! -f "$db_file"; then
cp /dev/null "$db_file"
# Use same permissions as parent directory, minus x,s, or t bits.
chmod `kpsestat -xst "$db_dir"` "$db_file"
elif test -s "$db_file" \
&& test "x`sed '1s/
$//;1q' \"$db_file\"`" != "x$ls_R_magic" \
&& test "x`sed '1s/
$//;1q' \"$db_file\"`" != "x$old_ls_R_magic"; then
echo "$progname: $db_file lacks magic string. Skipping..." >&2
continue
fi
# Skip if we cannot write the file:
kpseaccess -w "$db_file" || { echo "$progname: $db_file: no write permission. Skipping..." >&2; continue; }
db_dir_tmp=`mktemp -d "$db_dir/lsR.XXXXXX"` \
|| { echo "$progname: could not create secure temporary directory. Skipping..." >&2; continue; }
db_file_tmp="$db_dir_tmp/lsR$$.tmp"
rm -f "$db_file_tmp"
tty -s && echo "$progname: Updating $db_file... " >&2
echo "$ls_R_magic" >"$db_file_tmp"
# The main task. We put ./: in the output, so top-level files can be
# found via ls-R. Probably irrelevant in practice.
# The sed command inserts the leading ./ for directory names, and
# removes . and .. from the list. Note that using colons in directory
# names results in nothing but grief.
echo "./:" >>"$db_file_tmp"
(cd "$TEXMFLS_R" && \ls -LRa 2>/dev/null) |
sed '/^$/{n;s%^\./%%;s%^%./%;}; /^\.$/d; /^\.\.$/d; /^[\.\/]*lsR[0-9]*\.tmp:*$/d' >>"$db_file_tmp"
# To be really safe, a loop.
until PERMS=`kpsestat = "$db_file"`; do sleep 1; done
chmod $PERMS "$db_file_tmp"
rm -f "$db_file"
install "$db_file_tmp" "$db_file"
rm -rf "$db_dir_tmp"
done
tty -s && echo "$progname: Done." >&2
exit 0