#!/bin/sh
# $Id: tl-update-auto 74435 2025-03-04 17:01:16Z karl $
# Public domain.  Originally written 2003, Karl Berry.
# 
# Deal with files that are automatically updated in one way or another.

LC_ALL=C; export LC_ALL
PATH=/usr/local/gnu/bin:/usr/local/bin:$PATH; export PATH
umask 022
exec </dev/null # no redirection

# maybe someday we'll make real options.
chicken=echo
chicken=
#
if test "x$1" = x-v; then
  verbose=echo
  shift
else
  verbose=false
fi
#
# Toward the end of a release, we may want to update config.{guess,sub}
# but nothing else:
config_scripts_only=false

TMPDIR=/tmp/tlua; export TMPDIR
test -d $TMPDIR || mkdir $TMPDIR
test -d $TMPDIR || { echo "$0: no directory $TMPDIR, goodbye." >&2; exit 1; }

cp="cp -fv"
mv="mv -fv"
diff="diff -U 2"

mydir=`cd \`dirname $0\` && /bin/pwd`
Master=`cd $mydir/../.. && /bin/pwd`
cd $Master || exit 1

temp=$TMPDIR/ua$$
trap "rm -f $temp*" 0 1 2 15

update_list=
add_list=


#  autogenerate README.EN from readme.html.
# (skip, better to generate when needed to avoid spurious changes.)
#
#if $config_scripts_only; then :; else
#$mydir/htmltext <readme-html.dir/readme.en.html >$temp
#if $diff readme-txt.dir/README.EN $temp >$temp.en.diff; then
#  $verbose "  README.EN ok."
#else
#  $chicken $cp $temp readme-txt.dir/README.EN
#  update_list="$update_list readme-txt.dir/README.EN"
#fi
#fi # !config_scripts_only


#  texinfo.tex from elsewhere on tug.org.
#
if $config_scripts_only; then :; else
tximaster=/home/ftp/tex/texinfo.tex
txislave=texmf-dist/tex/texinfo/texinfo.tex
#
if $diff $txislave $tximaster >$temp.txi.diff; then
  $verbose "  $txislave ok."
else
  $chicken $cp $tximaster $txislave
  update_list="$update_list $txislave"
fi
fi # !config_scripts_only


#  fontname from elsewhere on tug.org.
#
if $config_scripts_only; then :; else
fontnamemaster=/home/httpd/html/fontname
fontnamedocslave=texmf-dist/doc/fonts/fontname
#
for basef in ChangeLog HEADER.html Makefile \
             fontname.pdf fontname.html fontname.texi; do
  fontnameslavef=$fontnamedocslave/$basef
  if $diff $fontnamemaster/$basef $fontnameslavef >$temp.$basef.diff; then
    $verbose "   $fontnameslavef ok."
  else
    $chicken $cp $fontnamemaster/$basef $fontnameslavef
    update_list="$update_list $fontnameslavef"
  fi
done

# fontname runtime files.
#
fontnamemapslave=texmf-dist/fonts/map/fontname
#
files=`cd $fontnamemaster && ls *.map`
for basef in $files; do
  fontnamemapslavef=$fontnamemapslave/$basef
  if test -e $fontnamemapslavef; then
    if $diff $fontnamemaster/$basef $fontnamemapslavef >$temp.$basef.diff; then
      $verbose "   $fontnamemapslavef ok."
    else
      $chicken $cp $fontnamemaster/$basef $fontnamemapslavef
      update_list="$update_list $fontnamemapslavef"
    fi
  else
    $verbose "  $fontnamemapslavef skipped, not in Master."
  fi
done

fontnameencslave=texmf-dist/fonts/enc/dvips/base
#
# These .enc files are distributed in other packages.
files=`cd $fontnamemaster && ls *.enc\
       | egrep -vw '(groff|t5|texnansi|xt2|xl2).enc'`
for basef in $files; do
  fontnameencslavef=$fontnameencslave/$basef
  if $diff $fontnameencslavef $fontnamemaster/$basef >$temp.$basef.diff; then
    $verbose "   $fontnameencslavef ok."
  else
    $chicken $cp $fontnamemaster/$basef $fontnameencslavef
    update_list="$update_list $fontnameencslavef"
  fi
done
fi # !config_scripts_only


#  beebe .bib from elsewhere on tug.org, mirrored from utah.
#
if $config_scripts_only; then :; else
beebe_master=/home/ftp/mirror/ftp.math.utah.edu/bib
beebe_slave=texmf-dist/bibtex/bib/beebe
#
# Unusually, we check and upate only the bib files already committed to
# TL, not all from the master area. There are tons of bib files there,
# some quite large, so await requests. When a new bib is to be added,
# commit manually the first time.
files=`cd $beebe_slave && ls *.bib`
# 
for basef in $files; do
  beebe_slavef=$beebe_slave/$basef
  if $diff $beebe_master/$basef $beebe_slavef >$temp.$basef.diff; then
    $verbose "   $beebe_slavef ok."
  else
    $chicken $cp $beebe_master/$basef $beebe_slavef
    update_list="$update_list $beebe_slavef"
  fi
done
fi # !config_scripts_only


#  config.guess/sub/etc. from elsewhere on tug.org, mirrored from gnulib.
# See Build/source/build-aux/README.TL for more info on common scripts.
# 
if $config_scripts_only || true; then # just for parallelism
config_masterdir=/home/ftp/dist/build-aux
for gnuconf in ar-lib compile config.guess config.sub depcomp \
               install-sh texinfo.tex; do 
  master_conffile=$config_masterdir/$gnuconf
  local_conffile=../Build/source/build-aux/$gnuconf
  #
  if test ! -s $master_conffile; then
    echo "$0: $master_conffile missing, skipping." >&2
    continue
  fi
  #
  if $diff $local_conffile $master_conffile >$temp.$gnuconf.diff; then
    $verbose "  $gnuconf ok."
    rm -f $temp.$gnuconf.diff
  else
    # updated needed. find all copies in source.
    # Build/source/utils/asymptote/gc* is not checked in (since it's not
    # unpacked in the original release), therefore we cannot commit to it.
    alldev="`find ../Build/source -name $gnuconf | grep -v asymptote/gc`"
    for f in $alldev; do
      $chicken $cp $master_conffile $f
    done
    update_list="$update_list $alldev"
    
    # in the case of config.guess, but nothing else, we also need it in
    # the installer.
    if test $gnuconf = config.guess; then
      installer_config_guess=tlpkg/installer/$gnuconf
      $chicken $cp $master_conffile $installer_config_guess
      update_list="$update_list $installer_config_guess"
    fi
  fi
done
fi # !config_scripts_only


#  tlmgr and install-tl man pages + html autogenerated.
# Arrange to ignore date differences.
# 
if $config_scripts_only; then :; else

# return 0 if files $1 and $2 are the same except for .TH and Id lines.
same_except_for_auto ()
{
  rm -f $TMPDIR/seft1 $TMPDIR/seft2
  sed -e '/^\.TH/d' -e '/[$]Id:/d' <"$1" >$TMPDIR/seft1
  sed -e '/^\.TH/d' -e '/[$]Id:/d' <"$2" >$TMPDIR/seft2
  cmp -s $TMPDIR/seft1 $TMPDIR/seft2
}

mandir=texmf-dist/doc/man
tldocdir=texmf-dist/doc/texlive
webdir=/home/httpd/html/texlive/doc
man_update=false

for script in texmf-dist/scripts/texlive/tlmgr.pl install-tl; do
  pod2man $script >$temp

  basescript=`basename $script .pl`
  manfile=$mandir/man1/$basescript.1

  if same_except_for_auto $manfile $temp; then
    $verbose "    `basename $manfile` ok."
    rm -f $manfile.new
  else
    $chicken $mv $temp $manfile
    man_update=true

    # Update the version on the web site; since these aren't checked in, we
    # can do it unconditionally.
    # 
    pod2html="$chicken pod2html --cachedir=$TMPDIR"
    if test -z "$chicken"; then
      $pod2html $script >$webdir/$basescript.html
      cp -p $webdir/$basescript.html $tldocdir/
      update_list="$update_list $tldocdir/$basescript.html"
    fi
  fi
done

if test -z "$chicken" && $man_update; then
  (cd $mandir && make)  # remake pdfs, should do always but better than nothing
  update_list="$update_list $mandir"
  add_list=`svn status $mandir | sed -n 's/^\? *//p'`
fi
fi # !config_scripts_only


#  doc.html.
#
if $config_scripts_only; then :; else
$mydir/tl-update-docindex | tee $temp.doc \
| grep -v '<small>Generated' >$temp.doc.new
#
grep -v '<small>Generated' doc.html >$temp.doc.cur
if $diff $temp.doc.cur $temp.doc.new >$temp.doc.diff; then
  $verbose "  doc.html ok."
else
  $chicken $cp $temp.doc doc.html
  update_list="$update_list doc.html"
fi
fi # !config_scripts_only


#  ctan mirror list from ctan. There is constant churn, so don't
# update more than once a day.
if $config_scripts_only; then :; else
  ctan_mirrors=$TMPDIR/mirrors           # incoming data from CTAN
  ctan_mirmon=$TMPDIR/mirmon.state
  mirrors4tl=tlpkg/installer/ctan-mirrors.pl  # massaged for TL

  if test -n "`find $mirrors4tl -newermt '23 hours ago'`"; then
    echo "$0: ctan mirror list already updated today, skipping update:" >&2
    ls -lt $mirrors4tl >&2
    
#     && rsync rsync://rsync.dante.ctan.org/MirMon/mirmon.state $ctan_mirmon; then
  elif wget -nv https://ctan.org/tex-archive/CTAN.sites -O $ctan_mirrors \
     && scp -pq ctan.org:/serv/ctan/scripts/mirmon-2.11/mirmon.state \
                $ctan_mirmon; then
    #echo "got new mirror data"; ls -ltr $TMPDIR
    $mydir/tl-update-ctan-mirrors -v $ctan_mirrors $ctan_mirmon \
      >$mirrors4tl.new
    if test $? -ne 0 || test ! -s $mirrors4tl.new; then
      echo "$0: tl-update-ctan-mirrors apparently failed, skipping." >&2
    elif $diff $mirrors4tl $mirrors4tl.new; then
      $verbose "  $mirrors4tl ok."
      rm -f $mirrors4tl.new
    else
      $chicken $mv $mirrors4tl.new $mirrors4tl
      $verbose "  $mirrors4tl update."
      test $verbose >/dev/null \
      && ls -l $ctan_mirrors $ctan_mirmon $mirrors4tl
      update_list="$update_list $mirrors4tl"
    fi
  else
    echo "$0: ctan mirror data not retrievable, skipping." >&2
  fi
fi # !config_scripts_only


#  curl cert bundle. Every other day is more than often enough.
if $config_scripts_only || test `expr $(date +%d) % 2` = 0; then :; else
  curl_cert_src=https://curl.se/ca/cacert.pem
  curl_cert_dl=$TMPDIR/cacert.pem
  curl_cert_inst=tlpkg/installer/curl/curl-ca-bundle.crt
  if wget --quiet $curl_cert_src -O $curl_cert_dl; then
    if cmp -s $curl_cert_dl $curl_cert_inst; then
      $verbose "  `basename $curl_cert_inst` ok."
    else
      $chicken $cp $curl_cert_dl $curl_cert_inst
      update_list="$update_list $curl_cert_inst"
    fi
  else
    echo "$0: cert bundle not retrievable (wget $curl_cert_src), skipping." >&2
  fi
fi # !config_scripts_only || !odd_day_num


#  svn commits.
status=0
if test -z "$update_list"; then
  echo "$0: nothing to update."
else
  if test -z "$add_list"; then :; else
    test x"$chicken" = xecho || echo "$0: svn adding $add_list"
    $chicken svn add $add_list
  fi
  test x"$chicken" = xecho || echo "$0: committing $update_list"
  $chicken svn commit --force-log -m"`basename $0`" $update_list
  status=$?
  test $status -ne 0 && echo "$0: *** svn commit failed, fix me." >&2    
fi

echo "$0: done `date`."
exit $status
