1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
|
#!/bin/sh -e
# Public domain. Originally written 2008, Karl Berry.
# 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=
download=wget
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;;
--no-download|-N) download=true;; # secret option for karl
--*) 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=
download_loc=${TMPDIR-$tmpdir}/tl.$tlname.tar.gz
if test x"$USER" = xkarl; then
case $tlname in
alpha-linux)
default_bin_loc=$download_loc
$download http://www.logic.at/staff/salzer/alphapca56-unknown-linux-gnu.tgz -O $default_bin_loc;;
amd64-freebsd)
default_bin_loc=$download_loc
$download http://www.witticism.org/temp/amd64_fbsd7_r10230.tar.bz2 -O $default_bin_loc;;
hppa-hpux)
default_bin_loc=$download_loc
$download http://www.jtartlabs.com/test/hppa2.0-hp-hpux10.20.tar.gz -O $default_bin_loc;;
i386-freebsd)
default_bin_loc=/home/manfred/tl2008.bin.tar.lzma;;
i386-linux)
default_bin_loc=/home/texlive/sarge/tmp/source/inst/bin/i686-pc-linux-gnu;;
i386-openbsd)
default_bin_loc=$download_loc
$download http://students.dec.bmth.ac.uk/ebarrett/files/tl-bin-20080810.tgz -O $default_bin_loc;;
i386-solaris)
default_bin_loc=${TMPDIR-$tmpdir}/tl.$tlname.tar.lzma
$download http://ocean1.ee.duth.gr/~apostolo/i386-pc-solaris2.10.tar.lzma -O $default_bin_loc;;
*-darwin)
default_bin_loc=$download_loc
$download http://www.uoregon.edu/~koch/$tlname.tar.gz -O $default_bin_loc;;
powerpc-linux)
default_bin_loc=/home/tschmitz/powerpc-linux.tar.bz2;;
x86_64-linux)
default_bin_loc=$download_loc
$download http://www.bibles.org.uk/x86_64/x86_64-linux-gnu.tar.gz -O $default_bin_loc;;
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
mkdir $srcdir
if echo "$bin_loc" | grep 'lzma$' >/dev/null; then
lzma=--lzma # tar xf doesn't quite know lzma yet
else
lzma=
fi
(cd $srcdir && tar xf $bin_loc $lzma) || exit 1
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
# may need to cd into a subdirectory, depending on how the tar was made.
if test `ls $srcdir | wc -l` = 1; then
srcdir=$srcdir/*
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 | sort
rm -rf $tmpdir
done
|