summaryrefslogtreecommitdiff
path: root/Master/tlpkg/bin/tl-update-bindir
blob: 1917e37f0d3f1e376b83dc23439320317ffa4d86 (plain)
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_r10553.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