#!/bin/sh -e # Copyright 2008-2019 Norbert Preining # This file is licensed under the GNU General Public License version 2 # or any later version. # # Update a TeX Live tlnet area, with testing. vc_id='$Id$' unset CDPATH unset LS_COLORS yyyy=2019 check_consistency=true chicken=false critical= pretest=false recreate= scheme=full testinstall=true tlweb=/home/ftp/texlive/tlnet verbose= gpgcmd= while test $# -gt 0; do case $1 in --critical) critical=--all;; --dry-run|-n) chicken=true;; --master) shift; Master=$1;; --no-consistency) check_consistency=false;; # takes a long time. --no-testinstall|-N) testinstall=false;; # and no updates; quit early. --pretest) tlweb=/home/ftp/texlive/tlpretest;; --recreate) recreate=--recreate;; --scheme) shift; scheme=$1;; --gpgcmd) shift; gpgcmd="--gpgcmd \"$1\"";; --testlocation) shift; tltrybase=$1;; -v|-vv|-vvv) verbose=$1;; --help) echo "ustl. sorry."; exit 0;; --version) echo "$vc_id"; exit 0;; --*) echo "$0: unrecognized option \`$1'." >&2 exit 1;; *) tlweb=$1;; esac shift done if test -z "$Master"; then mydir=`dirname $0` Master=`cd $mydir/../.. && pwd` fi if test ! -r "$tlweb/tlpkg/texlive.tlpdb"; then cat <&2 $0: fatal: no file $tlweb/tlpkg/texlive.tlpdb. $0: If you are setting up a new release, touch the file, $0: and then use --critical --recreate. $0: (Or otherwise set up the tlnet hierarchy manually.) $0: Goodbye. END_NO_TLPDB # and typically we will fail because there are new messages # in the installer. move the trial dir by hand to avoid # time-consuming full recreate more than once. exit 1 fi # Keep the default out of ~ftp/texlive/tlnet, which CTAN mirrors. test -z "$tltrybase" \ && tltrybase=`cd $tlweb/../.. && pwd`/tlnet-trial-`date +%y%m%d` tltry=$tltrybase/tlsrc.try echo "$0: Using tlweb=$tlweb" # top level network directory, mirrored echo "$0: Using tltry=$tltry" # local working dir # Save tlpdb in case of disaster. cp --force --backup $tlweb/tlpkg/texlive.tlpdb* /tmp # # Be sure we're starting the test cleanly. rm -rf $tltrybase mkdir -p $tltry chmod g+w $tltry # cp/link files in a loop so we can exclude the mactex files, which is a # waste of time, and more importantly can uselessly fail due to permissions. for f in $tlweb/*; do if echo "$f" | grep mactex >/dev/null; then : # skip mactex else cp -al "$f" $tltry # assume GNU cp so we can link instead of copy fi done # Update packages in our working dir. echo "$0: Updating $tltry with cow-shell..." cd $tltry cow-shell <texlive.profile # silence envvar warnings and the welcome message. TEXLIVE_INSTALL_ENV_NOCHECK=1; export TEXLIVE_INSTALL_ENV_NOCHECK TEXLIVE_INSTALL_NO_WELCOME=1; export TEXLIVE_INSTALL_NO_WELCOME tlnet_install_log=`pwd`/install.log echo "$0: Running test install (log: $tlnet_install_log)..." perl install-tl -location $tltry -profile texlive.profile \ >$tlnet_install_log 2>&1 \ || true # install-tl can fail, but we test the output, so don't abort. # the following long grep command should filter away all *normal* # installation messages. # if there are any other messages they will end up on stdout and # thus be noticed. unexpected_output=`cat $tlnet_install_log \ | sed '/The following environment variables/,/^ ------/d' \ | grep -Ev '^ ------' \ | grep -Ev '^$' \ | grep -Ev '^cryptographic signature of' \ | grep -Ev '^Automated TeX Live installation using profile' \ | grep -Ev '^Installing from:' \ | grep -Ev '^Platform: ' \ | grep -Ev '^Distribution: inst' \ | grep -Ev '^Directory for temporary files' \ | grep -Ev '^Loading ' \ | grep -Ev '^Installing ' \ | grep -Ev '^(re-)?running mktexlsr' \ | grep -Ev '^mktexlsr: Updating ' \ | grep -Ev '^mktexlsr: Done' \ | grep -Ev '^writing fmtutil.cnf to' \ | grep -Ev '^writing updmap.cfg to' \ | grep -Ev '^writing language.(dat|def|dat.lua) to' \ | grep -Ev '^pre-generating all format file' \ | grep -Ev '^making ConTeXt MkIV cache' \ | grep -Ev '^running ' \ | grep -Ev '^done running ' \ | grep -Ev '^finished ' \ | grep -Ev '^Welcome to TeX Live' \ | grep -Ev '^The TeX Live web site' \ | grep -Ev '^contains updates' \ | grep -Ev '^TeX Live is a joint project of the TeX user groups' \ | grep -Ev '^please consider supporting it by joining the group' \ | grep -Ev '^The list of groups is available' \ | grep -Ev '^Add ' \ | grep -Ev '^Most importantly, add ' \ | grep -Ev '^to your PATH for current and future sessions' \ | grep -Ev ' \(if not dynamically found\)' \ | grep -Ev 'install-tl: done' \ | grep -Ev '^Logfile: ' \ | grep -Ev '^Time used for installing ' \ | grep -Ev '^setting up ConTeXt cache' \ | grep -Ev '^resolvers +\|' \ | grep -Ev '^system +\|' \ | grep -Ev '^mtxrun +\|' \ | grep -Ev '^done$' \ | cat` failure=false if test -n "$unexpected_output"; then failure=true echo >&2 echo "$0: Test installation failed." >&2 echo "$0: Here is the unexpected output:" >&2 echo "$unexpected_output" >&2 fi # more consistency checks. if test $failure = false; then for cmd in \ "$tltryinst/$yyyy/bin/*/tlmgr --repository $tltry update --list" \ "$tltryinst/$yyyy/bin/*/updmap-sys -n" \ "$Master/tlpkg/bin/check-tlnet-consistency --location=$tltry" \ "$Master/tlpkg/bin/tl-compare-tlpdbs $critical $tltry/tlpkg/texlive.tlpdb" \ ; do cmdname=`echo "$cmd" | awk '{print $1}'` if echo "$cmdname" | grep check-tlnet-consistency >/dev/null; then # skip consistency check if requested (for development only). $check_consistency || continue fi basecmd=`basename $cmdname` echo "$0: Running $basecmd ($cmd)" outfile=/tmp/tlnet.$basecmd if $cmd >$outfile 2>&1; then :; else echo "$0: $basecmd failed ($cmd):" >&2 sed 8q $outfile >&2 echo "... see $outfile for full output ..." >&2 echo >&2 failure=true fi done fi # Format creation check, in case fmtutil's exit status wasn't right. install_tl_log=$tltryinst/$yyyy/install-tl.log if grep -i '^fmtutil.*error.*' $install_tl_log >/dev/null; then echo >&2 echo "$0: seems fmtutil failed, check $install_tl_log." >&2 failure=true fi # In all cases, make copies in /tmp for inspection in case of # undetected failure. cp -f $tlnet_install_log $install_tl_log /tmp if $failure; then echo >&2 echo "$0: Our transcript file: $tlnet_install_log" >&2 echo "$0: install-tl log file: $install_tl_log" >&2 echo "$0: Copies of both are in /tmp." >&2 echo "$0: Please rm -rf the trial dir." >&2 exit 1 fi # # no unexpected output, so ship the new packages. cd $tltrybase if $chicken; then echo "$0: Chicken mode, not updating anything." else echo "$0: Updating $tlweb from $tltry." # copy any mactex files since we didn't link them. for f in $tlweb/*mactex*; do test ! -r $f || cp -pf $f $tltry done # mv then rm to avoid the mirmon probe from making the rm fail. mv $tlweb $tltrybase/tlnet.old mv $tltry $tlweb rm -rf $tltrybase echo "$0: Done." fi exit 0