summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
Diffstat (limited to 'Master')
-rwxr-xr-xMaster/tlpkg/bin/tl-update-bindir203
1 files changed, 203 insertions, 0 deletions
diff --git a/Master/tlpkg/bin/tl-update-bindir b/Master/tlpkg/bin/tl-update-bindir
new file mode 100755
index 00000000000..2f432168e6b
--- /dev/null
+++ b/Master/tlpkg/bin/tl-update-bindir
@@ -0,0 +1,203 @@
+#!/bin/sh -e
+# Update a TeX Live Master/bin/PLATFORM directory.
+
+vc_id='$Id$'
+unset CDPATH
+unset LS_COLORS
+
+tmpdir=${TMPDIR-/tmp}/tlupbin.$$
+trap "rm -rf $tmpdir" 0 1 2 15
+
+usage="$0 [OPTION]... TL-PLATFORM...
+
+Update the TeX Live executables for each TL-PLATFORM (which must be a TL
+platform name, e.g., i386-linux) from a build directory.
+
+The new binaries are taken from the location specified by --bin-loc,
+either a directory (whose contents are copied), or a tar file (which is
+unpacked and then copied).
+
+The output directory is computed relative to the location of this script
+by default, or can be explicitly specified via --master. An upper-level
+directory is specified so multiple platforms can be installed.
+
+This checks for broken symlinks, and symlinks with the svn:executable
+property set (which would mess up Subversion; see the thread around
+http://svn.haxx.se/users/archive-2007-03/1259.shtml.)
+
+It also takes care of doing the explicit remove/add sequence Subversion
+requires when a symlink is replaced by a file or vice versa.
+
+Options:
+ --bin-loc DIR-OR-TAR use binaries from DIR-OR-TAR
+ --master DIR install binaries to DIR/bin/TL-PLATFORM
+ [default is the bin dir relative to this script]
+
+ --help display this help and exit
+ --quiet, --silent no progress reports
+ --version output version information and exit
+
+For more information about building TeX Live, see
+http://tug.org/texlive/build.html.
+
+Report bugs to tlbuild@tug.org."
+
+# parse options.
+bin_loc=
+msg=echo
+tlnames=
+while test $# -gt 0; do
+ case $1 in
+ --help|-help|-v) echo "$usage"; exit 0;;
+ --version|-version|-v) echo "$vc_id"; exit 0;;
+ --quiet|-quiet|-q|--silent|-silent|-s) msg=true;;
+
+ --master) shift; Master=$1;;
+ --bin-loc) shift; bin_loc=$1;;
+
+ --*) echo "$0: unrecognized option \`$1'; try --help if you need it." >&2
+ exit 1;;
+
+ *) tlnames="$tlnames $1";;
+ esac
+ shift
+done
+
+if test -z "$tlnames"; then
+ echo "$0: missing TL platform name; try --help if you need it." >&2
+ exit 1
+fi
+
+if test -z "$Master"; then
+ mydir=`dirname $0`
+ Master=`cd $mydir/../.. && pwd`
+fi
+if test ! -d "$Master/bin"; then
+ echo "$0: Master directory $Master has no bin/ subdir; goodbye." >&2
+ exit 1
+fi
+
+# loop through tl platform names
+for tlname in $tlnames; do
+ destdir=$Master/bin/$tlname
+ if test ! -d $destdir; then
+ echo "$0: unrecognized platform name \`$tlname'" >&2
+ echo "$0: (no directory $destdir)" >&2
+ exit 1
+ fi
+
+ # karl convenience
+ default_bin_loc=
+ if test x"$USER" = xkarl; then
+ case $tlname in
+ i386-linux)
+ default_bin_loc=/home/texlive/sarge/tmp/source/inst/bin/i686-pc-linux-gnu;;
+ esac
+ fi
+
+ test -z "$bin_loc" && test -n "$default_bin_loc" \
+ && bin_loc=$default_bin_loc
+ if test -z "$bin_loc"; then
+ echo "$0: missing binary location, try --help if you need it." >&2
+ exit 1
+ fi
+
+ $msg "installing from $bin_loc to $destdir"
+ rm -rf $tmpdir
+ mkdir $tmpdir
+
+ # if we were given a tar file, unpack it.
+ if test -f "$bin_loc"; then
+ srcdir=$tmpdir/unpacked
+ (cd $srcdir && tar xf $bin_loc)
+
+ elif test -d "$bin_loc"; then
+ srcdir=$bin_loc # already have a directory
+
+ else
+ echo "$0: strange non-file non-directory binary location $bin_loc" >&2
+ exit 1
+ fi
+
+ # state of things. srcdir is full of the new binaries.
+ (cd $destdir && ls) >$tmpdir/now
+ (cd $srcdir && ls) >$tmpdir/new
+
+ ourdel=$tmpdir/2del
+ ouradd=$tmpdir/2add
+ comm -23 $tmpdir/now $tmpdir/new >$ourdel # looking for deletions
+ comm -13 $tmpdir/now $tmpdir/new >$ouradd # looking for additions
+
+ # get symlink list.
+ (cd $destdir && find -type l | sort) >$tmpdir/now.symlink
+ (cd $srcdir && find -type l | sort) >$tmpdir/new.symlink
+
+ cd $destdir || exit 1
+
+ # svn requires separate delete/add operations when symlinks change to
+ # regular files or vice versa.
+ #
+ # remove symlinks which have become files.
+ comm -23 $tmpdir/now.symlink $tmpdir/new.symlink >$tmpdir/s.now
+ replaced_symlinks=
+ for sl in `cat $tmpdir/s.now`; do
+ test -f $srcdir/$sl && replaced_symlinks="$replaced_symlinks $sl"
+ done
+ test -n "$replaced_symlinks" \
+ && $msg "removing symlinks which have become files..." \
+ && svn rm $replaced_symlinks
+ #
+ # remove files which have become symlinks.
+ comm -13 $tmpdir/now.symlink $tmpdir/new.symlink >$tmpdir/s.new
+ replaced_files=
+ for sl in `cat $tmpdir/s.new`; do
+ test -f $destdir/$sl && replaced_files="$replaced_files $sl"
+ done
+ test -n "$replaced_files" \
+ && $msg "removing files which have become symlinks..." \
+ && svn rm $replaced_files
+
+ # the bulk copy.
+ $msg "copying from $srcdir"
+ $msg "to $destdir"
+ (cd $srcdir && tar cf - *) | tar xf -
+
+ # the normal deletions and additions.
+ $msg "removing old..."
+ test -s $ourdel && svn rm `cat $ourdel`
+ $msg "adding new..."
+ test -s $ouradd && svn add `cat $ouradd`
+
+ # anything which is no longer a symlink but still exists
+ # needs to be added.
+ test -n "$replaced_symlinks" \
+ && $msg "adding files that replaced symlinks..." \
+ && svn add $replaced_symlinks
+
+ # anything which is now a symlink but didn't used to be
+ # also needs to be added.
+ test -n "$replaced_files" \
+ && $msg "adding symlinks that replaced files..." \
+ && svn add $replaced_files
+
+ # be sure the svn:executable property is not set on any symlink.
+ # there is also a pre-commit hook on the repo, but of course we don't
+ # want to unnecessarily trigger it.
+ badlinks=`svn propget svn:executable \`cat $tmpdir/new.symlink\` \
+ | awk '{print $1}'`
+ if test -n "$badlinks"; then
+ $msg "removing svn:executable property from symlinks..."
+ svn propdel svn:executable $badlinks
+ fi
+
+ # check for broken symlinks.
+ for sl in `cat $tmpdir/new.symlink`; do
+ test ! -r "$sl" && echo "$0: broken new symlink $sl" >&2
+ done
+
+ # final results.
+ $msg "final svn status..."
+ svn status
+
+ rm -rf $tmpdir
+done