#!/bin/sh -e # Copyright 2008-2019 Norbert Preining # This file is licensed under the GNU General Public License version 2 # or any later version. # # Build a TeX Live tlnet area in a temporary directory, # then (unless -N) do a test installation from it, # then (if the test install succeeded), update the live area, # all as specified in the options. vc_id='$Id$' renice 20 $$ >/dev/null 2>&1 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;; --dest) shift; tlweb=$1;; --dry-run|-n) chicken=true;; --gpgcmd) shift; gpgcmd="--gpgcmd \"$1\"";; --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;; # scheme for test install. --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'; see source." >&2 exit 1;; esac shift done 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 if test -z "$Master"; then mydir=`dirname $0` Master=`cd $mydir/../.. && pwd` fi # If there are broken symlinks anywhere in the bin directories, give up # right away. The nightly cron checks that there no symlinks anywhere else. # Below, we check for broken symlinks in the bin/ dir as installed. $Master/tlpkg/bin/tl-check-symlinks $Master/bin # Keep the default out of ~ftp/texlive, which CTAN mirrors much of 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 current 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..." containers_prog="$Master/tlpkg/bin/tl-update-containers" containers_args=" $verbose -location $tltry $critical $recreate $gpgcmd" containers_invoke="$containers_prog $containers_args" # 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 # Minimal PATH from here on! E.g., we don't want the test install to # find our own mktexlsr, but only have the programs in the test available. PATH=/usr/bin tlnet_install_log=`pwd`/update-tlnet-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 ignore_unexpected_output=false #true, if frustration if test -n "$unexpected_output"; then $ignore_unexpected_output || failure=true echo >&2 echo "$0: Test installation failed." >&2 echo "$0: Here is the unexpected output, from $tlnet_install_log:" >&2 echo "$unexpected_output" >&2 echo "$0: (end of 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" \ "$tltryinst/$yyyy/bin/*/mktexlsr -n --verbose" \ "$Master/tlpkg/bin/tl-check-symlinks $tltryinst/$yyyy/bin" \ "$Master/tlpkg/bin/tl-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. # This might not exist if the test install didn't get this far. install_tl_log=$tltryinst/$yyyy/install-tl.log if test ! -r $install_tl_log \ || 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 /tmp test ! -r $install_tl_log || cp -f $install_tl_log /tmp if $failure || $chicken; 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 if $failure; then exit 1 elif $chicken; then echo echo "$0: Chicken mode, not updating anything." exit 0 else echo "$0: impossible non-failure non-chicken." >&2 exit 2 fi fi # # no unexpected output, so ship the new packages. cd $tltrybase 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." exit 0