#!/bin/sh
# $Id: tl-update-auto 30759 2013-05-28 14:38:08Z karl $
# Public domain.  Originally written 2003, Karl Berry.
# 
# Deal with files that are automatically updated in one way or another.

PATH=/usr/local/gnu/bin:/usr/local/bin:$PATH; export PATH
umask 0

# maybe someday we'll make real options.
chicken=echo
chicken=
#
verbose=echo
verbose=false
#
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.
# 
#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


#  modes.mf from elsewhere on tug.org.
#
if $config_scripts_only; then :; else
modesmaster=/home/ftp/tex/modes.mf
modesslave=texmf-dist/metafont/misc/modes.mf
#
if $diff $modesslave $modesmaster >$temp.modes.diff; then
  $verbose "  $modesslave ok."
else
  $chicken $cp $modesmaster $modesslave
  update_list="$update_list $modesslave"
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 Makefile bitstrea.aka \
             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
  test $basef = wolfram.map && continue   # obsolete for TL
  fontnamemapslavef=$fontnamemapslave/$basef
  if $diff $fontnamemaster/$basef $fontnamemapslavef >$temp.$basef.diff; then
    $verbose "   $fontnamemapslavef ok."
  else
    $chicken $cp $fontnamemaster/$basef $fontnamemapslavef
    update_list="$update_list $fontnamemapslavef"
  fi
done

fontnameencslave=texmf-dist/fonts/enc/dvips/base
#
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


#  config.guess/sub/etc. from elsewhere on tug.org, mirrored from GNU.
# See Build/source/build-aux/README.TL for more info on common scripts.
# 
config_masterdir=/home/ftp/dist/build-aux
#
for gnuconf in 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


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

# return 0 if files $1 and $2 are the same except for the first lines.
# (we need to ignore the timestamps in the generation lines.)
same_except_for_th ()
{
  rm -f $TMPDIR/seft1 $TMPDIR/seft2
  sed '/^\.TH/d' <"$1" >$TMPDIR/seft1
  sed '/^\.TH/d' <"$2" >$TMPDIR/seft2
  cmp -s $TMPDIR/seft1 $TMPDIR/seft2
}

mandir=texmf-dist/doc/man
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_th $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"
    $pod2html $script >$webdir/$basescript.html
  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.new doc.html
  update_list="$update_list doc.html"
fi
fi # !config_scripts_only


#  ctan mirror list from ctan.
if $config_scripts_only; then :; else
if test `date +%w` = 0; then             # only update on Sundays
  ctan_mirrors=$TMPDIR/mirrors           # incoming data from CTAN
  ctan_mirmon=$TMPDIR/mirmon.state
  mirrors4tl=tlpkg/installer/ctan-mirrors.pl  # massaged for TL

  if wget --quiet http://ctan.org/tex-archive/CTAN.sites -O $ctan_mirrors \
     && rsync rsync://comedy.dante.de/MirMon/mirmon.state $ctan_mirmon; then
    $mydir/tl-update-ctan-mirrors $ctan_mirrors $ctan_mirmon >$mirrors4tl.new
    if $diff $mirrors4tl $mirrors4tl.new; then
      $verbose "  $mirrors4tl ok."
    else
      $chicken $mv $mirrors4tl.new $mirrors4tl
      update_list="$update_list $mirrors4tl"
    fi
  else
    echo "$0: ctan mirror data not retrievable, skipping." >&2
  fi
fi
fi # !config_scripts_only


#  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$0 $update_list
  status=$?
  test $status -ne 0 && echo "$0: *** svn commit failed, fix me." >&2    
fi

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