summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Build/source/texk/texlive/linked_scripts/Makefile.am6
-rw-r--r--Build/source/texk/texlive/linked_scripts/Makefile.in6
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh (renamed from Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh)0
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl2136
-rw-r--r--Master/.mkisofsrc2
l---------Master/bin/aarch64-linux/tlcockpit2
l---------Master/bin/amd64-freebsd/tlcockpit2
l---------Master/bin/amd64-netbsd/tlcockpit2
l---------Master/bin/armel-linux/tlcockpit2
l---------Master/bin/armhf-linux/tlcockpit2
l---------Master/bin/i386-cygwin/tlcockpit2
l---------Master/bin/i386-darwin/tlcockpit2
l---------Master/bin/i386-freebsd/tlcockpit2
l---------Master/bin/i386-linux/tlcockpit2
l---------Master/bin/i386-netbsd/tlcockpit2
l---------Master/bin/i386-solaris/tlcockpit2
l---------Master/bin/powerpc-darwin/tlcockpit2
l---------Master/bin/powerpc-linux/tlcockpit2
l---------Master/bin/sparc-solaris/tlcockpit2
l---------Master/bin/x86_64-cygwin/tlcockpit2
l---------Master/bin/x86_64-darwin/tlcockpit2
l---------Master/bin/x86_64-darwinlegacy/tlcockpit2
-rwxr-xr-xMaster/bin/x86_64-linux/afm2plbin93728 -> 97928 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/afm2tfmbin98368 -> 104520 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/alephbin554816 -> 558008 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/asybin4199560 -> 3986040 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/autospbin39888 -> 36288 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/axohelpbin0 -> 62368 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/bboxbin9240 -> 9064 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/bg5convbin5016 -> 5064 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/bibtexbin163104 -> 167304 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/bibtex8bin192320 -> 193640 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/bibtexubin19521704 -> 19932384 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/cef5convbin6800 -> 6816 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/cefconvbin6800 -> 6816 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/cefsconvbin6800 -> 6816 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/cfftot1bin422560 -> 425840 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/chktexbin137760 -> 135480 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ctanglebin101904 -> 105976 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ctiebin81152 -> 85320 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/cweavebin138800 -> 143032 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/detexbin105824 -> 113832 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/devnagbin30944 -> 31256 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/disdvibin16088 -> 15992 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dt2dvbin45272 -> 42856 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dv2dtbin23120 -> 23648 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvi2ttybin143360 -> 155816 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvibookbin24728 -> 25304 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dviconcatbin22040 -> 22424 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvicopybin115856 -> 122200 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvidvibin19832 -> 20000 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvihp5
-rwxr-xr-xMaster/bin/x86_64-linux/dviljbin114712 -> 119296 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvilj2pbin114712 -> 119680 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvilj4bin120856 -> 127136 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvilj4lbin120888 -> 127136 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvipngbin1083600 -> 1067480 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dviposbin106176 -> 114424 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvipsbin259304 -> 266944 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dviselectbin24248 -> 24216 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvisvgmbin4765976 -> 5488992 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvitodvibin28504 -> 28376 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/dvitypebin101696 -> 109928 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/epsffitbin24336 -> 27616 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/eptexbin588096 -> 607880 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/euptexbin597888 -> 614856 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/extconvbin5016 -> 5064 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/gftodvibin105728 -> 109896 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/gftopkbin89344 -> 93512 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/gftypebin87904 -> 92488 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/gregoriobin683760 -> 687896 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/gsftopkbin89488 -> 93608 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/hbf2gfbin97920 -> 101912 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/kpseaccessbin5800 -> 5824 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/kpsereadlinkbin5680 -> 5728 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/kpsestatbin6784 -> 6800 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/kpsewhichbin82024 -> 86784 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/lacheckbin60152 -> 62312 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/luajittexbin8437208 -> 8955112 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/luatexbin8260360 -> 8760096 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/luatex53bin0 -> 8787232 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/magbin6824 -> 6840 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/makeindexbin142784 -> 145064 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/makejvfbin126448 -> 138808 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mendexbin213808 -> 203320 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mfbin336616 -> 345552 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mf-nowinbin332480 -> 342216 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mfluabin587336 -> 592624 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mfluajitbin870016 -> 894408 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mftbin112128 -> 118120 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mktexlsr13
-rwxr-xr-xMaster/bin/x86_64-linux/mmafmbin302280 -> 311072 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mmpfbbin364544 -> 372568 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/mpostbin4505312 -> 2396744 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/msxlintbin15096 -> 15104 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/odvicopybin119536 -> 126296 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/odvitypebin102880 -> 108264 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/omfontsbin170320 -> 178248 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/otanglebin101632 -> 106120 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/otfinfobin533856 -> 509088 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/otftotfmbin885984 -> 867768 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/otp2ocpbin93504 -> 97624 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/outocpbin73136 -> 77720 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/patgenbin37320 -> 37904 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pbibtexbin196224 -> 200392 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pdfclosebin11056 -> 11072 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pdfopenbin19288 -> 19304 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pdftexbin2214600 -> 2175872 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pdftosrcbin1165112 -> 1163104 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pdvitypebin138912 -> 147208 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pfb2pfabin9416 -> 9576 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pk2bmbin12752 -> 12656 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pktogfbin85248 -> 88584 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pktypebin81136 -> 85272 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pltotfbin56336 -> 56408 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pmpostbin4541632 -> 2435016 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pmxabbin516904 -> 535272 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pooltypebin23552 -> 23560 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ppltotfbin149344 -> 155272 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/prepmxbin124368 -> 127288 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ps2pkbin185680 -> 192184 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/psbookbin23480 -> 23512 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/psnupbin88944 -> 93144 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/psresizebin87120 -> 91288 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/psselectbin24224 -> 24480 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/pstopsbin88016 -> 92504 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ptexbin515264 -> 530504 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ptftoplbin138880 -> 142984 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/scor2prtbin82192 -> 83696 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/sjisconvbin5032 -> 5080 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/synctexbin144952 -> 186256 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1asciibin34136 -> 36784 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1asmbin41056 -> 45240 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1binarybin33672 -> 36208 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1disasmbin39952 -> 42376 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1dotlessjbin352720 -> 360968 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1lintbin314584 -> 327472 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1macbin44176 -> 48400 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1rawafmbin314616 -> 324752 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1reencodebin347392 -> 356184 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1testpagebin331016 -> 339816 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t1unmacbin40152 -> 41624 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/t4htbin91232 -> 96136 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/tanglebin105808 -> 109976 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/teckit_compilebin1920816 -> 2104224 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/texbin369920 -> 379800 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/tex2aspcbin0 -> 11160 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/tex4htbin156976 -> 158952 bytes
l---------Master/bin/x86_64-linux/texlua531
l---------Master/bin/x86_64-linux/texlua53c1
-rwxr-xr-xMaster/bin/x86_64-linux/tftoplbin101648 -> 105816 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/tiebin76928 -> 81064 bytes
l---------Master/bin/x86_64-linux/tlcockpit2
-rwxr-xr-xMaster/bin/x86_64-linux/ttf2afmbin93024 -> 96520 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ttf2pkbin700272 -> 737464 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ttf2tfmbin719072 -> 756776 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ttfdumpbin162032 -> 167352 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/ttftotype42bin365504 -> 372528 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/upbibtexbin202784 -> 206984 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/updvitypebin142016 -> 149640 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/upmendexbin19816840 -> 20059952 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/upmpostbin4542304 -> 2435016 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/uppltotfbin153600 -> 157960 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/uptexbin522624 -> 537544 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/uptftoplbin141312 -> 144200 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/vftovpbin110752 -> 114984 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/vlnabin15176 -> 15168 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/vptovfbin68632 -> 68704 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/weavebin130304 -> 134472 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/wofm2oplbin118832 -> 115608 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/wopl2ofmbin119152 -> 118808 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/wovf2ovpbin132608 -> 130408 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/wovp2ovfbin136536 -> 136608 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/xdvi-xawbin1234504 -> 1276560 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/xdvipdfmxbin1018960 -> 979096 bytes
-rwxr-xr-xMaster/bin/x86_64-linux/xetexbin23823984 -> 24034848 bytes
l---------Master/bin/x86_64-solaris/tlcockpit2
-rw-r--r--Master/release-texlive.txt2
-rwxr-xr-xMaster/texmf-dist/scripts/tlcockpit/tlcockpit.sh10
-rw-r--r--Master/texmf-dist/web2c/texmf.cnf15
-rw-r--r--Master/texmf-dist/web2c/texmfcnf.lua4
-rw-r--r--Master/tlpkg/TeXLive/TLConfig.pm2
-rwxr-xr-xMaster/tlpkg/bin/tl-update-bindir4
-rwxr-xr-xMaster/tlpkg/bin/tl-update-tlnet6
-rw-r--r--Master/tlpkg/doc/releng.txt48
-rw-r--r--Master/tlpkg/tlpsrc/autosp.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/axodraw2.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/luatex.tlpsrc5
188 files changed, 2246 insertions, 60 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am
index 2ababe9d2ca..b9611f0a98e 100644
--- a/Build/source/texk/texlive/linked_scripts/Makefile.am
+++ b/Build/source/texk/texlive/linked_scripts/Makefile.am
@@ -206,6 +206,8 @@ texmf_other_scripts = \
texliveonfly/texliveonfly.py \
texloganalyser/texloganalyser \
thumbpdf/thumbpdf.pl \
+ tlcockpit/tlcockpit.sh \
+ tlshell/tlshell.tcl \
ulqda/ulqda.pl \
urlbst/urlbst \
vpe/vpe.pl \
@@ -230,9 +232,9 @@ nobase_dist_texmf_scripts_SCRIPTS = \
## Symlinks within $(bindir): FILE:LINK here means "ln -s FILE LINK" is done.
bin_links = \
- texdef:latexdef \
epstopdf:repstopdf \
- pdfcrop:rpdfcrop
+ pdfcrop:rpdfcrop \
+ texdef:latexdef
# The idea is to install the scripts themselves in texmf*/scripts, and
# have bin/arch/foo be a symlink to, say,
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.in b/Build/source/texk/texlive/linked_scripts/Makefile.in
index 50c23d2bf7f..fb41af59f35 100644
--- a/Build/source/texk/texlive/linked_scripts/Makefile.in
+++ b/Build/source/texk/texlive/linked_scripts/Makefile.in
@@ -420,6 +420,8 @@ texmf_other_scripts = \
texliveonfly/texliveonfly.py \
texloganalyser/texloganalyser \
thumbpdf/thumbpdf.pl \
+ tlcockpit/tlcockpit.sh \
+ tlshell/tlshell.tcl \
ulqda/ulqda.pl \
urlbst/urlbst \
vpe/vpe.pl \
@@ -440,9 +442,9 @@ nobase_dist_texmf_scripts_SCRIPTS = \
$(texmf_context_scripts)
bin_links = \
- texdef:latexdef \
epstopdf:repstopdf \
- pdfcrop:rpdfcrop
+ pdfcrop:rpdfcrop \
+ texdef:latexdef
relpath = $(SHELL) $(top_srcdir)/../../build-aux/relpath
runscript = $(top_srcdir)/$(WIN_WRAPPER)/runscript.exe
diff --git a/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh b/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh
index 734ffe54c3c..734ffe54c3c 100755
--- a/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
+++ b/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh
diff --git a/Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl b/Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl
new file mode 100755
index 00000000000..2dc4f28341d
--- /dev/null
+++ b/Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl
@@ -0,0 +1,2136 @@
+#!/usr/bin/env wish
+
+# Copyright 2017, 2018 Siep Kroonenberg
+
+# This file is licensed under the GNU General Public License version 2
+# or any later version.
+
+package require Tk
+
+# searchpath:
+# windows: most scripts run via [w]runscript, which adjusts the searchpath
+# for the current process.
+# unix/linux: tlshell.tcl should be run via a symlink in a directory
+# which also contains (a symlink to) kpsewhich.
+# This directory will be prepended to the searchpath.
+# kpsewhich will disentangle symlinks.
+
+# dis/enable restore dialog
+set do_restore 0
+# dis/enable debug output (only for private development purposes)
+set ddebug 0
+
+##### general housekeeping ############################################
+
+# security: disable send
+catch {rename send {}}
+
+# menus: disable tearoff feature
+option add *Menu.tearOff 0
+
+# no bold text for messages
+option add *Dialog.msg.font TkDefaultFont userDefault
+
+## italicized items; not used
+#font create it_font {*}[font configure TkDefaultFont]
+#font configure it_font -slant italic
+
+set plain_unix 0
+if {$::tcl_platform(platform) eq "unix" && \
+ $::tcl_platform(os) ne "Darwin"} {
+ set plain_unix 1
+}
+
+proc search_nocase {needle haystack} {
+ if {$needle eq ""} {return -1}
+ if {$haystack eq ""} {return -1}
+ return [string first [string tolower $needle] [string tolower $haystack]]
+}
+
+# the stderr and stdout of tlmgr are each read into lists of strings
+set err_log {}
+set out_log {}
+
+#### debug output, ATM only for private development purposes ####
+
+if $ddebug {set dbg_log {}}
+
+proc do_debug {s} {
+ if $::ddebug {
+ puts stderr $s
+ # On windows, stderr output goes nowhere.
+ # Therefore also debug output for the log toplevel.
+ lappend ::dbg_log $s
+ # Track debug output in the log toplevel if it is running:
+ if [winfo exists .tllg.dbg.tx] {
+ .tllg.dbg.tx configure -state normal
+ .tllg.dbg.tx insert end "$s\n"
+ if {$::tcl_platform(os) ne "Darwin"} {
+ .tllg.dbg.tx configure -state disabled
+ }
+ }
+ }
+} ; # do_debug
+
+proc get_stacktrace {} {
+ set level [info level]
+ set s ""
+ for {set i 1} {$i < $level} {incr i} {
+ append s [format "Level %u: %s\n" $i [info level $i]]
+ }
+ return $s
+} ; # get_stacktrace
+
+proc maketemp {ext} {
+ set fname ""
+ foreach i {0 1 2 3 4 5 6 7 8 9} { ; # ten tries
+ set fname [file join $::tempsub "[expr {int(10000.0*rand())}]$ext"]
+ if {[file exist $fname]} {set fname ""; continue}
+ # create empty file. although we just want a name,
+ # we must make sure that it can be created.
+ set fid [open $fname w]
+ close $fid
+ if {! [file exists $fname]} {error "Cannot create temporary file"}
+ if {$::tcl_platform(platform) eq "unix"} {
+ file attributes $fname -permissions 0600
+ }
+ break
+ }
+ if {$fname eq ""} {error "Cannot create temporary file"}
+ return $fname
+} ; # maketemp
+
+set tempsub "" ; # subdir for temp files, set during initialization
+
+### GUI utilities #####################################################
+
+# dummy widgets for vertical spacing within $w
+set idummy -1
+proc spacing {w} {
+ incr ::idummy
+ pack [ttk::label $w.$::idummy -text " "]
+}
+
+proc pgrid {wdg args} { ; # grid command with padding
+ grid $wdg {*}$args -padx 3 -pady 3
+}
+
+proc ppack {wdg args} { ; # pack command with padding
+ pack $wdg {*}$args -padx 3 -pady 3
+}
+
+# mouse clicks: deal with MacOS platform differences
+if {[tk windowingsystem] eq "aqua"} {
+ event add <<RightClick>> <ButtonRelease-2> <Control-ButtonRelease-1>
+} else {
+ event add <<RightClick>> <ButtonRelease-3>
+}
+
+## default_bg color, only used for menus under ::plain_unix
+if [catch {ttk::style lookup TFrame -background} ::default_bg] {
+ set ::default_bg white
+}
+
+# unicode symbols as fake checkboxes in ttk::treeview widgets
+proc mark_sym {mrk} {
+ if $mrk {
+ return "\u25A3" ; # 'white square containing black small square'
+ } else {
+ return "\u25A1" ; # 'white square'
+ }
+} ; # mark_sym
+
+# place a toplevel, or at least its upperleft corner, centered wrt its parent
+proc place_dlg {wnd {p ""}} {
+ if {$p eq ""} {
+ set p [winfo toplevel [winfo parent $wnd]]
+ if {$p eq ""} return
+ }
+ set g [wm geometry $p]
+ scan $g "%dx%d+%d+%d" pw ph px py
+ set hcenter [expr {$px + $pw / 2}]
+ set vcenter [expr {$py + $ph / 2}]
+ set g [wm geometry $wnd]
+ set wh [winfo reqheight $wnd]
+ set ww [winfo reqwidth $wnd]
+ set wx [expr {$hcenter - $ww / 2}]
+ if {$wx < 0} { set wx 0}
+ set wy [expr {$vcenter - $wh / 2}]
+ if {$wy < 0} { set wy 0}
+ wm geometry $wnd [format "+%d+%d" $wx $wy]
+ wm attributes $wnd -topmost 1
+ wm attributes $p -topmost 0
+ wm state $wnd normal
+ raise $wnd $p
+ tkwait visibility $wnd
+ if {$::tcl_platform(platform) ne "windows"} {
+ # dont understand why these give trouble in windows
+ focus $wnd
+ grab set $wnd
+ }
+} ; # place_dlg
+
+proc long_message {str type {p "."}} {
+ # alternate messagebox implemented as custom dialog
+ # not all message types are supported
+ if {$type ne "ok" && $type ne "okcancel" && $type ne "yesnocancel"} {
+ err_exit "Illegal type $type for long_message"
+ }
+ set ::lms_parent $p
+ unset -nocomplain ::lms_var
+ do_debug "type $type"
+ catch {destroy .tlmg}
+ toplevel .tlmg -class Dialog
+ wm withdraw .tlmg
+ wm transient .tlmg .
+ if $::plain_unix {wm attributes .tlmg -type dialog}
+
+ # wallpaper frame; see make_widgets
+ pack [ttk::frame .tlmg.bg] -fill both -expand 1
+ ppack [ttk::frame .tlmg.tx] -in .tlmg.bg -side top -fill both -expand 1
+ pack [ttk::scrollbar .tlmg.tx.scroll -command ".tlmg.tx.txt yview"] \
+ -side right -fill y
+ ppack [text .tlmg.tx.txt -height 20 -width 60 -bd 2 -relief groove \
+ -wrap word -yscrollcommand ".tlmg.tx.scroll set"] -expand 1 -fill both
+
+ .tlmg.tx.txt insert end $str
+ .tlmg.tx.txt configure -state disabled
+
+ # buttons
+ pack [ttk::frame .tlmg.bts] -in .tlmg.bg -side bottom -fill x
+ if {$type eq "ok" || $type eq "okcancel"} {
+ ttk::button .tlmg.ok -text "ok" -command \
+ {raise $::lms_parent; destroy .tlmg; set ::lms_var "ok"}
+ ppack .tlmg.ok -in .tlmg.bts -side right
+ }
+ if {$type eq "yesnocancel"} {
+ ttk::button .tlmg.yes -text "yes" -command \
+ {raise $::lms_parent; destroy .tlmg; set::lms_var "yes"}
+ ppack .tlmg.yes -in .tlmg.bts -side right
+ ttk::button .tlmg.no -text "no" -command \
+ {raise $::lms_parent; destroy .tlmg; set ::lms_var "no"}
+ ppack .tlmg.no -in .tlmg.bts -side right
+ }
+ if {$type eq "yesnocancel" || $type eq "okcancel"} {
+ ttk::button .tlmg.cancel -text "cancel" -command \
+ {raise $::lms_parent; destroy .tlmg; set ::lms_var "cancel"}
+ ppack .tlmg.cancel -in .tlmg.bts -side right
+ }
+
+ place_dlg .tlmg $::lms_parent
+ tkwait variable ::lms_var
+ return $::lms_var
+} ; # long_message
+
+proc any_message {str type {p "."}} {
+ if {[string length $str] < 400} {
+ if {$type ne "ok"} {
+ return [tk_messageBox -message $str -type $type -parent $p \
+ -icon question]
+ } else {
+ return [tk_messageBox -message $str -type $type -parent $p]
+ }
+ } else {
+ # just hope that tcl will do the right thing with multibyte characters
+ if {[string length $str] > 500000} {
+ set str [string range $str 0 500000]
+ append str "\n....."
+ }
+ return [long_message $str $type $p]
+ }
+} ; # any_message
+
+### enabling and disabling user interaction
+
+proc enable_menu_controls {yesno} {
+ if {! $yesno} {
+ . configure -menu .mn_empty
+ return
+ }
+ . configure -menu .mn
+ if {! $::n_updates} {
+ .mn.pkg entryconfigure $::inx_upd_all -state disabled
+ .mn.pkg entryconfigure $::inx_upd_tlmgr -state disabled
+ } elseif $::need_update_tlmgr {
+ .mn.pkg entryconfigure $::inx_upd_all -state disabled
+ .mn.pkg entryconfigure $::inx_upd_tlmgr -state normal
+ } else {
+ .mn.pkg entryconfigure $::inx_upd_all -state normal
+ .mn.pkg entryconfigure $::inx_upd_tlmgr -state disabled
+ }
+ if {$::tcl_platform(platform) ne "windows"} {
+ if $::have_remote {
+ .mn.opt entryconfigure $::inx_platforms -state normal
+ } else {
+ .mn.opt entryconfigure $::inx_platforms -state disabled
+ }
+ }
+}; # enable_menu_controls
+
+proc enable_widgets {yesno} {
+ # This proc should cover all active interface elements of the main window.
+ # But if actions are initiated via a dialog, the main window can be
+ # deactivated simply by a grab and focus on the dialog.
+ enable_menu_controls $yesno
+
+ if $yesno {
+ set st !disabled
+ set ::busy "IDLE"
+ } else {
+ set st disabled
+ set ::busy "BUSY"
+ }
+
+ # command entry
+ .ent.b configure -state $st
+ .ent.e configure -state $st
+
+ # filter options
+ # status
+ .pkfilter.inst configure -state $st
+ .pkfilter.alls configure -state $st
+ .pkfilter.upd configure -state $st
+ # detail
+ .pkfilter.alld configure -state $st
+ .pkfilter.coll configure -state $st
+ .pkfilter.schm configure -state $st
+
+ # mark commands
+ .mrk_all configure -state $st
+ .mrk_none configure -state $st
+
+ # search
+ .pksearch.e configure -state $st
+ .pksearch.d configure -state $st
+
+ # packages
+ #.pkglist configure -state $st
+ .pkglist state $st
+
+ # final buttons
+ .q configure -state $st
+ .r configure -state $st
+ .t configure -state $st
+ .showlogs configure -state $st
+} ; # enable_widgets
+
+##### tl global data ##################################################
+
+set last_cmd ""
+
+set progname [info script]
+regexp {^.*[\\/]([^\\/\.]*)(?:\....)?$} $progname dummy progname
+set procid [pid]
+
+# package repository (no suport for a one-off repository switch)
+set repo ""
+# while selecting another repo:
+set new_repo ""
+
+# mirrors: dict of dicts of lists of urls per country per continent
+set mirrors {}
+
+# dict of (local and global) package dicts
+set pkgs [dict create]
+
+set have_remote 0 ; # remote packages info not loaded
+set need_update_tlmgr 0
+set n_updates 0
+set tlshell_updatable 0
+
+## data to be displayed ##
+
+# sorted display data for packages; package data stored as lists
+set filtered [dict create]
+
+# selecting packages for display: status and detail
+set stat_opt "inst"
+set dtl_opt "all"
+# searching packages for display; also search short descriptions?
+set search_desc 0
+
+##### handling tlmgr via pipe and stderr tempfile #####################
+
+set prmpt "tlmgr>"
+set busy "BUSY"
+
+# about [chan] gets:
+# if a second parameter, in this case l, is supplied
+# then this variable receives the result, with EOL stripped,
+# and the return value is the string length, possibly 0
+# EOF is indicated by a return value of -1.
+
+proc read_err_tempfile {} {
+ set len 0
+ while 1 {
+ set len [chan gets $::err l]
+ if {$len >= 0} {
+ lappend ::err_log $l
+ } else {
+ break
+ }
+ }
+} ; # read_err_tempfile
+
+proc err_exit {} {
+ do_debug "error exit"
+ read_err_tempfile
+ any_message [join $::err_log "\n"] "ok"
+ exit
+} ; # err_exit
+
+# Capture stdout of tlmgr into a pipe $::tlshl,
+# stderr into a temp file file $::err_file which is set at initialization.
+
+proc start_tlmgr {{args ""}} {
+ # Start the TeX Live Manager shell interface.
+ # Below, vwait ::done_waiting forces tlshell
+ # to process initial tlmgr output before continuing.
+ unset -nocomplain ::done_waiting
+ do_debug "opening tlmgr"
+ if [catch \
+ {open "|tlmgr $args --machine-readable shell 2>>$::err_file" w+} \
+ ::tlshl] {
+ tk_messageBox -message [get_stacktrace]
+ exit
+ }
+ do_debug "done opening tlmgr"
+ set ::err [open $::err_file r]
+ chan configure $::tlshl -buffering line -blocking 0
+ chan event $::tlshl readable read_line
+ vwait ::done_waiting
+} ; # start_tlmgr
+
+proc close_tlmgr {} {
+ catch {chan close $::tlshl}
+ catch {chan close $::err}
+}; # close_tlmgr
+
+# read a line of tlmgr output
+proc read_line {} {
+ # a caller of run_cmd needs to explicitly invoke 'vwait ::done_waiting'
+ # if it wants to wait for the command to finish
+ set l "" ; # will contain the line to be read
+ if {([catch {chan gets $::tlshl l} len] || [chan eof $::tlshl])} {
+ #do_debug "read_line: failing to read "
+ puts stderr "Read failure; tlmgr command was $::last_cmd"
+ catch {chan close $::tlshl}
+ # note. the right way to terminate is terminating the GUI shell.
+ # This closes stdin of tlmgr shell.
+ err_exit
+ } elseif {$len >= 0} {
+ # do_debug "read: $l"
+ if $::ddebug {puts $::flid $l}
+ if {[string first $::prmpt $l] == 0} {
+ # prompt line: we are done with the current command
+ enable_widgets 1 ; # this may have to be redone later
+ # catch up with stderr
+ read_err_tempfile
+ if {$::pipe_cb ne ""} {
+ do_debug "prompt found, $l"
+ $::pipe_cb "finish"
+ }
+ # for vwait:
+ set ::done_waiting 1
+ } else {
+ # regular output
+ lappend ::out_log $l
+ if {$::pipe_cb ne ""} {$::pipe_cb "line" "$l"}
+ }
+ }
+} ; # read_line
+
+# copy error strings to error page in logs toplevel .tllg and send it to top.
+# This by itself does not map the logs toplevel .tllg
+
+proc show_err_log {} {
+ #do_debug "show_err_log"
+ .tllg.err.tx configure -state normal
+ .tllg.err.tx delete 1.0 end
+ if {[llength $::err_log] > 0} {
+ foreach l $::err_log {.tllg.err.tx insert end "$l\n"}
+ .tllg.err.tx yview moveto 1
+ .tllg.logs select .tllg.err
+ }
+ if {$::tcl_platform(os) ne "Darwin"} {
+ # os x: text widget disabled => no selection possible
+ .tllg.err.tx configure -state disabled
+ }
+} ; # show_err_log
+
+##### running tlmgr commands #####
+
+# optional callback for run_cmds/read_line:
+set pipe_cb ""
+
+# run a list of commands
+proc run_cmds {cmds {cb ""}} {
+ set ::pipe_cb $cb
+ do_debug "run_cmds \"$cmds\""
+ if $::ddebug {puts $::flid "\n$cmds"}
+ enable_widgets 0
+ set ::out_log {}
+ set ::err_log {}
+ if {$::pipe_cb ne ""} {$::pipe_cb "init"}
+ set l [llength $cmds]
+ for {set i 0} {$i<$l} {incr i} {
+ set cmd [lindex $cmds $i]
+ set ::last_cmd $cmd
+ unset -nocomplain ::done_waiting
+ chan puts $::tlshl $cmd
+ chan flush $::tlshl
+ if {$i < [expr {$l-1}]} {vwait ::done_waiting}
+ }
+} ; # run_cmds
+
+# run a single command
+proc run_cmd {cmd {cb ""}} {
+ run_cmds [list $cmd] $cb
+} ; # run_cmd
+
+proc run_cmd_waiting {cmd} {
+ run_cmd $cmd
+ vwait ::done_waiting
+} ; # run_cmd_waiting
+
+##### callbacks for file events of tlmgr pipe ::tlshl (names *_cb) ####
+
+# callback for reading tlmgr pipe.
+# but maybe we just want a boolean whether or not to write
+# to the logs notebook.
+# consider writing log to file, always or on demand
+
+# In init mode, it is invoked by run_cmds, otherwise by read_line
+
+## template for pipe callback:
+#proc template_cb {mode {l ""}} {
+# if {$mode eq "line"} {
+# # do something
+# } elseif {$mode eq "init"} {
+# # do something
+# } elseif {$mode eq "finish"} {
+# # do something BUT DO NOT TRIGGER ANOTHER EVENT LOOP
+# } else {
+# lappend ::err_log "Illegal call of whatever_cb"
+# err_exit
+# }
+#}
+
+proc log_widget_cb {mode {l ""}} {
+ if {$mode eq "line"} {
+ .tllg.log.tx configure -state normal
+ .tllg.log.tx insert end "$l\n"
+ if {$::tcl_platform(os) ne "Darwin"} {
+ .tllg.log.tx configure -state disabled
+ }
+ } elseif {$mode eq "init"} {
+ show_logs
+ .tllg.status configure -text "Running"
+ .tllg.close configure -state disabled
+ } elseif {$mode eq "finish"} {
+ .tllg.log.tx yview moveto 1
+ .tllg.logs select .tllg.log
+ # error log on top if it contains anything
+ show_err_log
+ if {$::tcl_platform(os) ne "Darwin"} {
+ .tllg.log.tx configure -state disabled
+ }
+ .tllg.status configure -text "Idle"
+ .tllg.close configure -state !disabled
+ # the caller, read_line, will set ::done_waiting after
+ # this callback returns from finish mode
+ } else {
+ lappend ::err_log "Illegal call of log_widget_cb"
+ err_exit
+ }
+} ; # log_widget_cb
+
+##### Handling package info #####
+
+# what invokes what?
+# The main 'globals' are:
+
+# ::have_remote is initialized to false. It is set to true by
+# get_packages_info_remote, and remains true except temporarily at
+# a change of repository.
+
+# The other globals ones are ::n_updates, ::need_update_tlmgr and
+# ::tlshell_updatable. These are initially set to 0 and re-calculated
+# by update_globals.
+
+# update_globals is invoked by get_packages_info_remote and
+# update_local_revnumbers. It enables and disables buttons as appropriate.
+
+# displayed global status info is updated by update_globals.
+# update button/menu states are set at initialization and updated
+# by update_globals, both via the enable_menu_controls proc
+
+# get_packages_info_local is invoked only once, at initialization. After
+# installations and removals, the collected information is updated by
+# update_local_revnumbers.
+
+# get_packages_info_remote will be invoked by collect_filtered if
+# ::have_remote is false. Afterwards, ::have_remote will be true, and
+# therefore get_packages_info_remote will not be called again.
+# get_packages_info_remote invokes update_globals.
+
+# update_local_revnumbers will be invoked after any updates. It also
+# invokes update_globals.
+
+# collect_filtered does not only filter, but also organize the
+# information to be displayed. If necessary, it invokes
+# get_packages_info_remote and always invokes display_packes_info.
+# It is invoked at initialization, when filtering options change and
+# at the end of install-, remove- and update procs.
+
+# display_packages_info is mostly invoked by collect_filtered, but
+# also when the search term or the search option changes.
+
+proc check_tlmgr_updatable {} {
+ run_cmd_waiting "update --self --list"
+ foreach l $::out_log {
+ if [regexp {^total-bytes[ \t]+([0-9]+)$} $l m b] {
+ do_debug "matches, $b"
+ set ::need_update_tlmgr [expr {$b > 0 ? 1 : 0}]
+ return
+ }
+ }
+ do_debug "check_tlmgr_uptodate: should not get here"
+} ; # check_tlmgr_uptodate
+
+proc is_updatable {nm} {
+ set pk [dict get $::pkgs $nm]
+ set lr [dict get $pk localrev]
+ set rr [dict get $pk remoterev]
+ return [expr {$lr > 0 && $rr > 0 && $rr > $lr}]
+}
+
+proc update_globals {} {
+ if {! $::have_remote} return
+ set ::n_updates 0
+ foreach nm [dict keys $::pkgs] {
+ if [is_updatable $nm] {incr ::n_updates}
+ }
+ check_tlmgr_updatable
+ set ::tlshell_updatable [is_updatable tlshell]
+
+ # also update displayed status info
+ if {$::have_remote && $::need_update_tlmgr} {
+ .topf.luptodate configure -text "Needs updating"
+ } elseif $::have_remote {
+ .topf.luptodate configure -text "Up to date"
+ } else {
+ .topf.luptodate configure -text "Unknown"
+ }
+ # ... and status of update buttons
+ enable_menu_controls 1
+}
+
+# The package display treeview widget in the main window has columns
+# for both local and remote revision numbers.
+# It gets its data from $::filtered rather than directly from $::pkgs.
+# ::pkgs should already be up to date.
+
+# I added a field 'marked' to ::pkgs. It is displayed in the first treeview
+# column. This looks better than the treeview tag facilities.
+# In ::pkgs, 'marked' is represented as a boolean.
+# In ::filtered and .pkglist they are represented as unicode symbols.
+
+# display packages obeying both filter and search string.
+# even on a relatively slow system, regenerating .pkglist from ::filtered
+# at every keystroke is acceptably responsive.
+# with future more advanced search options, this scheme may not suffice.
+
+proc display_packages_info {} {
+ # do_debug [get_stacktrace]
+ set curr [.pksearch.e get]
+ .pkglist delete [.pkglist children {}]
+ dict for {nm pk} $::filtered {
+ set do_show 0
+ if {$curr eq ""} {
+ set do_show 1
+ } elseif {[search_nocase $curr $nm] >= 0} {
+ set do_show 1
+ } elseif {$::search_desc && \
+ [search_nocase $curr [dict get $::pkgs $nm shortdesc]] >= 0} {
+ set do_show 1
+ }
+ if $do_show {
+ .pkglist insert {} end -id $nm -values $pk
+ }
+ }
+} ; # display_packages_info
+
+# (re)create ::filtered dictionary; disregard search string.
+# The value associated with each key/package is a list, not another dict.
+proc collect_filtered {} {
+ do_debug \
+ "collect_filtered for $::stat_opt and $::dtl_opt"
+ if {$::stat_opt ne "inst" && ! $::have_remote} {
+ get_packages_info_remote
+ }
+ foreach nm [dict keys $::filtered] {
+ dict unset ::filtered $nm
+ }
+ foreach nm [lsort [dict keys $::pkgs]] {
+ set pk [dict get $::pkgs $nm]
+ set do_show 1
+ set mrk [mark_sym [dict get $pk marked]]
+ set lr [dict get $pk localrev]
+ set rr [dict get $pk remoterev]
+ set ct [dict get $pk category]
+ if {$::stat_opt eq "inst" && $lr == 0} {
+ set do_show 0
+ } elseif {$::stat_opt eq "upd" && ($lr == 0 || $rr == 0 || $rr <= $lr)} {
+ set do_show 0
+ }
+ if {! $do_show} continue
+ if {$::dtl_opt eq "schm" && $ct ne "Scheme"} {
+ set do_show 0
+ } elseif {$::dtl_opt eq "coll" && \
+ $ct ne "Scheme" && $ct ne "Collection"} {
+ set do_show 0
+ }
+ if {! $do_show} continue
+
+ # collect data to be displayed for $nm
+ dict lappend ::filtered $nm $mrk
+ dict lappend ::filtered $nm $nm
+ set v [dict get $pk localrev]
+ set lv [dict get $pk lcatv]
+ if {$v eq "0" || $v == 0} {
+ set v ""
+ } elseif {$lv != 0 && $lv ne ""} {
+ set v "$v ($lv)"
+ }
+ dict lappend ::filtered $nm $v
+ set v [dict get $pk remoterev]
+ set rv [dict get $pk rcatv]
+ if {$v eq "0" || $v == 0} {
+ set v ""
+ } elseif {$rv != 0 && $rv ne ""} {
+ set v "$v ($rv)"
+ }
+ dict lappend ::filtered $nm $v
+ dict lappend ::filtered $nm [dict get $pk shortdesc]
+ }
+ display_packages_info
+} ; # collect_filtered
+
+# get fresh package list. invoked at program start
+# some local packages may not be available online.
+# to test, create local dual-platform installation from dvd, try to update
+# from more recent linux-only installation
+
+proc get_packages_info_local {} {
+ # start from scratch; see also update_local_revnumbers
+ foreach nm [dict keys $::pkgs] {
+ dict unset ::pkgs $nm
+ }
+ set ::have_remote 0
+ set ::need_update_tlmgr 0
+ set ::updatable 0
+ set ::tlshell_updatable 0
+
+ run_cmd_waiting \
+ "info --only-installed --data name,localrev,cat-version,category,shortdesc"
+ set re {^([^,]+),([0-9]+),([^,]*),([^,]*),(.*)$}
+ foreach l $::out_log {
+ if [regexp $re $l m nm lrev lcatv catg pdescr] {
+ # double-quotes in short description: remove outer, unescape inner
+ if {[string index $pdescr 0] eq "\""} {
+ set pdescr [string range $pdescr 1 end-1]
+ }
+ set pdescr [string map {\\\" \"} $pdescr]
+ dict set ::pkgs $nm \
+ [list "marked" 0 "localrev" $lrev "lcatv" $lcatv "remoterev" 0 \
+ "rcatv" 0 "category" $catg shortdesc $pdescr]
+ }
+ }
+} ; # get_packages_info_local
+
+# remote: preserve information on installed packages
+proc get_packages_info_remote {} {
+ # remove non-local database entries
+ foreach k [dict keys $::pkgs] {
+ if {! [dict get $::pkgs $k localrev]} {
+ dict unset ::pkgs $k
+ }
+ }
+ set ::need_update_tlmgr 0
+ set ::updatable 0
+ set ::tlshell_updatable 0
+
+ if [catch {run_cmd_waiting \
+ "info --data name,localrev,remoterev,cat-version,category,shortdesc"}] {
+ do_debug [get_stacktrace]
+ tk_messageBox -message \
+ "Repository $::repo unavailable. Please choose another one."
+ return 0
+ }
+ set re {^([^,]+),([0-9]+),([0-9]+),([^,]*),([^,]*),(.*)$}
+ foreach l $::out_log {
+ if [regexp $re $l m nm lrev rrev rcatv catg pdescr] {
+ # double-quotes in short description: remove outer, unescape inner
+ if {[string index $pdescr 0] eq "\""} {
+ set pdescr [string range $pdescr 1 end-1]
+ }
+ set pdescr [string map {\\\" \"} $pdescr]
+ if [catch {dict get $::pkgs $nm} pk] {
+ # package entry does not yet exist, create it
+ dict set ::pkgs $nm [list "marked" 0 "localrev" 0 "lcatv" 0]
+ }
+ dict set ::pkgs $nm "remoterev" $rrev
+ dict set ::pkgs $nm "rcatv" $rcatv
+ dict set ::pkgs $nm "category" $catg
+ dict set ::pkgs $nm "shortdesc" $pdescr
+ }
+ }
+ set ::have_remote 1
+ .topf.loaded configure -text "Loaded"
+ update_globals
+ return 1
+} ; # get_packages_info_remote
+
+## update ::pkgs after installing packages without going online again.
+proc update_local_revnumbers {} {
+ do_debug "update_local_revnumbers"
+ run_cmd_waiting "info --only-installed --data name,localrev,cat-version"
+ set re {^([^,]+),([0-9]+),(.*)$}
+ dict for {pk pk_dict} $::pkgs {
+ do_debug "zeroing local data for $pk"
+ dict set pk_dict "localrev" 0
+ dict set pk_dict "lcatv" 0
+ dict set ::pkgs $pk $pk_dict
+ }
+ foreach l $::out_log {
+ if [regexp $re $l m pk lr lv] {
+ set pk_dict [dict get $::pkgs $pk]
+ dict set pk_dict "localrev" $lr
+ dict set pk_dict "lcatv" $lv
+ dict set ::pkgs $pk $pk_dict
+ }
+ }
+ update_globals
+} ; # update_local_revnumbers
+
+##### Dialogs and their supporting procs ##############################
+
+# look at dialog.tcl, part of Tk itself, how to implement dialog-type behavior
+
+# So far:
+# - logs notebook,
+# - maybe a toplevel for restoring packages from backup, and
+# - a toplevel for picking a different local or remote repository.
+
+##### logs notebook #####
+
+# if invoked via log_widget_cb init, it tracks progress of a tlmgr command.
+# log_widget_cb will temporarily disable the close button
+# and set .tllg.status to busy.
+# otherwise, it shows the output of the last completed (list of) command(s).
+
+# Note that run_cmds clears ::out_log and ::err_log, but not ::dbg_log.
+
+proc show_logs {} {
+ toplevel .tllg -class Dialog
+ wm withdraw .tllg
+ set p [winfo toplevel [winfo parent .tllg]]
+ wm transient .tllg $p
+ wm title .tllg Logs
+ if $::plain_unix {wm attributes .tllg -type dialog}
+
+ # wallpaper
+ pack [ttk::frame .tllg.bg] -fill both -expand 1
+
+ ttk::frame .tllg.log
+ pack [ttk::scrollbar .tllg.log.scroll -command ".tllg.log.tx yview"] \
+ -side right -fill y
+ ppack [text .tllg.log.tx -height 10 -wrap word \
+ -yscrollcommand ".tllg.log.scroll set"] \
+ -expand 1 -fill both
+ .tllg.log.tx configure -state normal
+ foreach l $::out_log {
+ .tllg.log.tx insert end "$l\n"
+ }
+ if {$::tcl_platform(os) ne "Darwin"} {.tllg.log.tx configure -state disabled}
+ .tllg.log.tx yview moveto 1
+
+ ttk::frame .tllg.err
+ pack [ttk::scrollbar .tllg.err.scroll -command ".tllg.err.tx yview"] \
+ -side right -fill y
+ ppack [text .tllg.err.tx -height 10 -wrap word \
+ -yscrollcommand ".tllg.err.scroll set"] \
+ -expand 1 -fill both
+ .tllg.err.tx configure -state normal
+ foreach l $::err_log {
+ .tllg.err.tx configure -state normal
+ .tllg.err.tx insert end "$l\n"
+ }
+ if {$::tcl_platform(os) ne "Darwin"} {.tllg.err.tx configure -state disabled}
+ .tllg.err.tx yview moveto 1
+
+ if $::ddebug {
+ ttk::frame .tllg.dbg
+ pack [ttk::scrollbar .tllg.dbg.scroll -command ".tllg.dbg.tx yview"] \
+ -side right -fill y
+ ppack [text .tllg.dbg.tx -height 10 -bd 2 -relief groove -wrap word \
+ -yscrollcommand ".tllg.dbg.scroll set"] \
+ -expand 1 -fill both
+ .tllg.dbg.tx configure -state normal
+ foreach l $::dbg_log {
+ .tllg.dbg.tx insert end "$l\n"
+ }
+ if {$::tcl_platform(os) ne "Darwin"} {.tllg.dbg.tx configure -state disabled}
+ .tllg.dbg.tx yview moveto 1
+ }
+
+ pack [ttk::notebook .tllg.logs] -in .tllg.bg -side top -fill both -expand 1
+ .tllg.logs add .tllg.log -text "Output"
+ .tllg.logs add .tllg.err -text "Errors"
+ if $::ddebug {
+ .tllg.logs add .tllg.dbg -text "Debug"
+ raise .tllg.dbg .tllg.logs
+ }
+ raise .tllg.err .tllg.logs
+ raise .tllg.log .tllg.logs
+
+ pack [ttk::frame .tllg.bottom] -in .tllg.bg -side bottom -fill x
+ ttk::button .tllg.close -text close -command {
+ set p [winfo toplevel [winfo parent .tllg]]
+ if {$p eq ""} {set p "."}
+ raise $p; destroy .tllg}
+ ppack .tllg.close -in .tllg.bottom -side right -anchor e
+ ppack [ttk::label .tllg.status -anchor w] -in .tllg.bottom -side left
+
+ place_dlg .tllg $p
+ wm resizable .tllg 1 1
+} ; # show_logs
+
+##### repositories #####
+
+proc get_repo {} {
+ run_cmd_waiting "option repository"
+ # this returns the configured repository.
+ # for now, do not support a temporary change.
+ set re {repository\t(.*)$}
+ foreach l $::out_log {
+ if [regexp $re $l m ::repo] break
+ }
+} ; # get_repo
+
+proc is_repo_local {r} {
+ set db [file join $r "tlpkg/texlive.tlpdb"]
+ return [file exists $db]
+}
+
+### mirrors
+
+proc edit_name {n} {
+ set n [string tolower $n]
+ set n [string map {" " "_"} $n]
+ return $n
+} ; # edit_name
+
+set mirrors [dict create]
+proc read_mirrors {} {
+ if [catch {open [file join [exec kpsewhich -var-value SELFAUTOPARENT] \
+ "tlpkg/installer/ctan-mirrors.pl"] r} fm] {return 0}
+ set re_geo {^\s*'([^']+)' => \{\s*$}
+ set re_url {^\s*'(.*)' => ([0-9]+)}
+ set re_clo {^\s*\},?\s*$}
+ set starting 1
+ set lnum 0 ; # line number for error messages
+ set ok 1 ; # no errors encountered yet
+ set countries {} ; # aggregate list of countries
+ set urls {} ; # aggregate list of urls
+ set continent ""
+ set country ""
+ set u ""
+ set in_cont 0
+ set in_coun 0
+ while {! [catch {chan gets $fm} line] && ! [chan eof $fm]} {
+ incr lnum
+ if $starting {
+ if {[string first "\$mirrors =" $line] == 0} {
+ set starting 0
+ continue
+ } else {
+ set ok 0
+ set msg "Unexpected line '$line' at start"
+ break
+ }
+ }
+ # starting is now dealt with.
+ if [regexp $re_geo $line dummy c] {
+ if {! $in_cont} {
+ set in_cont 1
+ set continent $c
+ set cont_dict [dict create]
+ if {$continent in [dict keys $::mirrors]} {
+ set ok 0
+ set msg "Duplicate continent $c at line $lnum"
+ break
+ }
+ } elseif {! $in_coun} {
+ set in_coun 1
+ set country $c
+ if {$country in $countries} {
+ set ok 0
+ set msg "Duplicate country $c at line $lnum"
+ break
+ }
+ lappend countries $country
+ dict set cont_dict $country {}
+ } else {
+ set ok 0
+ set msg "Unexpected continent- or country line $line at line $lnum"
+ break
+ }
+ } elseif [regexp $re_url $line dummy u n] {
+ if {! $in_coun} {
+ set ok 0
+ set msg "Unexpected url line $line at line $lnum"
+ break
+ } elseif {$n ne "1"} {
+ continue
+ }
+ append u "systems/texlive/tlnet"
+ if {$u in $urls} {
+ set ok 0
+ set msg "Duplicate url $u at line $lnum"
+ break
+ }
+ dict lappend cont_dict $country $u
+ lappend urls $u
+ set u ""
+ } elseif [regexp $re_clo $line] {
+ if $in_coun {
+ set in_coun 0
+ set country ""
+ } elseif $in_cont {
+ set in_cont 0
+ dict set ::mirrors $continent $cont_dict
+ set continent ""
+ } else {
+ break ; # should close mirror list
+ }
+ } ; # ignore other lines
+ }
+ close $fm
+ if {! $ok} {do_debug $msg}
+} ; # read_mirrors
+
+proc find_local_repo {} {
+ if [is_repo_local $::new_repo] {
+ set inidir $::new_repo
+ } elseif [is_repo_local $::repo] {
+ set inidir $::repo
+ } else {
+ set inidir $::env(HOME) ; # HOME also ok for windows
+ }
+ set ::new_repo ""
+ while 1 {
+ set ::new_repo [tk_chooseDirectory -initialdir $inidir -mustexist 1 \
+ -parent .tlr -title "Local repository..."]
+ if {$::new_repo ne "" && ! [is_repo_local $::new_repo]} {
+ tk_messageBox -message "$::new_repo not a repository" -parent .tlr
+ set inidir $::new_repo
+ set ::new_repo ""
+ continue
+ } else {
+ break
+ }
+ }
+} ; # find_local_repo
+
+proc close_repos {} {
+ raise .
+ destroy .tlr
+ set ::repo $::new_repo
+ if {$::tcl_platform(platform) eq "windows"} {
+ set ::repo [string map {\\ /} $::repo]
+ }
+ set ::new_repo ""
+ run_cmd_waiting "option repository $::repo"
+ close_tlmgr
+ start_tlmgr
+ # reload remote package information
+ set ::have_remote 0
+ get_packages_info_remote
+ collect_filtered
+} ; # close_repos
+
+proc repositories {} {
+
+ set ::new_repo $::repo
+
+ # dialog toplevel with
+ # - popup menu of mirrors (parse tlpkg/installer/ctan-mirrors.pl)
+ # - text entry box
+ # - directory browser button
+ # - ok and cancel buttons
+
+ toplevel .tlr -class Dialog
+ wm withdraw .tlr
+ wm transient .tlr .
+ wm title .tlr "Repositories"
+ if $::plain_unix {wm attributes .tlr -type dialog}
+
+ # wallpaper frame; see make_widgets
+ pack [ttk::frame .tlr.bg] -expand 1 -fill x
+
+ pack [ttk::frame .tlr.info] -in .tlr.bg -fill x
+ grid columnconfigure .tlr.info 1 -weight 1
+ set row -1
+
+ # current repository
+ incr row
+ pgrid [ttk::label .tlr.lcur -text "Current:"] \
+ -in .tlr.info -row $row -column 0 -sticky w
+ pgrid [ttk::label .tlr.cur -textvariable ::repo] \
+ -in .tlr.info -row 0 -column 1 -sticky w
+ # new repository
+ incr row
+ pgrid [ttk::label .tlr.lnew -text "New"] \
+ -in .tlr.info -row $row -column 0 -sticky w
+ pgrid [ttk::entry .tlr.new -textvariable ::new_repo -width 40] \
+ -in .tlr.info -row $row -column 1 -columnspan 2 -sticky w
+
+ ### three ways to specify a repository ###
+ pack [ttk::frame .tlr.mirbuttons] -in .tlr.bg -fill x
+ # default remote repository
+ ttk::button .tlr.ctan -text "Any CTAN mirror" \
+ -command {set ::new_repo "http://mirror.ctan.org/systems/texlive/tlnet"}
+ ppack .tlr.ctan -in .tlr.mirbuttons -side left -fill x
+ # freshly create a cascading mirror dropdown menu
+ destroy .tlr.mir.m
+ if {[dict size $::mirrors] == 0} read_mirrors
+ if {[dict size $::mirrors] > 0} {
+ ttk::menubutton .tlr.mir -text "Specific mirror..." -direction below \
+ -menu .tlr.mir.m
+ ppack .tlr.mir -in .tlr.mirbuttons -side left -fill x
+ menu .tlr.mir.m
+ dict for {cont d_cont} $::mirrors {
+ set c_ed [edit_name $cont]
+ menu .tlr.mir.m.$c_ed
+ .tlr.mir.m add cascade -label $cont -menu .tlr.mir.m.$c_ed
+ dict for {cntr urls} $d_cont {
+ set n_ed [edit_name $cntr]
+ menu .tlr.mir.m.$c_ed.$n_ed
+ .tlr.mir.m.$c_ed add cascade -label $cntr -menu .tlr.mir.m.$c_ed.$n_ed
+ foreach u $urls {
+ .tlr.mir.m.$c_ed.$n_ed add command -label $u \
+ -command "set ::new_repo $u"
+ }
+ }
+ }
+ }
+ # local repository
+ ttk::button .tlr.browse -text "Local directory..." \
+ -command find_local_repo
+ ppack .tlr.browse -in .tlr.mirbuttons -side left -fill x
+
+ spacing .tlr.bg
+
+ # two ways to close the dialog
+ pack [ttk::frame .tlr.closebuttons] -in .tlr.bg -fill x
+ ttk::button .tlr.save -text "Save and Load" -command close_repos
+ ppack .tlr.save -in .tlr.closebuttons -side right
+ ttk::button .tlr.abort -text "Abort"\
+ -command {raise .; destroy .tlr}
+ ppack .tlr.abort -in .tlr.closebuttons -side right
+
+ place_dlg .tlr .
+ wm resizable .tlr 0 0
+} ; # repositories
+
+### platforms
+
+if {$::tcl_platform(platform) ne "windows"} {
+
+ set ::platforms {}
+
+ proc toggle_pl_marked {pl cl} {
+ # toggle_pl_marked is triggered by a mouse click only in column #1.
+ # 'fut' should get updated in ::platforms and in .tlpl.pl.
+
+ if {$cl ne "#1"} return
+ if {$pl eq $::our_platform} {
+ tk_messageBox -message "Cannot remove own platform $::our_platform" \
+ -parent .tlpl
+ return
+ }
+ # $mrk: negation of current value of marked for $pl
+ set m1 [expr {[dict get $::platforms $pl "fut"] ? 0 : 1}]
+ dict set ::platforms $pl "fut" $m1
+ set m0 [dict get $::platforms $pl "cur"]
+ if {$m0 == $m1} {
+ .tlpl.pl set $pl "sup" [mark_sym $m0]
+ } else {
+ .tlpl.pl set $pl "sup" "[mark_sym $m0] \u21d2 [mark_sym $m1]"
+ }
+ .tlpl.do configure -state disabled
+ dict for {p mrks} $::platforms {
+ if {[dict get $mrks "fut"] ne [dict get $mrks "cur"]} {
+ .tlpl.do configure -state !disabled
+ break
+ }
+ }
+ } ; # toggle_pl_marked
+
+ proc platform_do {} {
+ raise .
+ destroy .tlpl
+ set pl_add {}
+ set pl_remove {}
+ dict for {p pd} $::platforms {
+ if {[dict get $pd "cur"] ne [dict get $pd "fut"]} {
+ if {[dict get $pd "fut"]} {
+ lappend pl_add $p
+ } else {
+ lappend pl_remove $p
+ }
+ }
+ }
+ if {[llength $pl_add] == 0 && [llength $pl_remove] == 0} return
+ set cmds {}
+ if {[llength $pl_add] > 0} {
+ set cmd "platform add "
+ append cmd [join $pl_add " "]
+ lappend cmds $cmd
+ }
+ if {[llength $pl_remove] > 0} {
+ set cmd "platform remove "
+ append cmd [join $pl_remove " "]
+ lappend cmds $cmd
+ }
+ run_cmds $cmds log_widget_cb
+ vwait ::done_waiting
+ update_local_revnumbers
+ collect_filtered
+
+ } ; # platform_do
+
+ proc platform_select {} {
+ run_cmd_waiting "platform list"
+ set ::platforms {}
+ foreach l $::out_log {
+ if [regexp {^\s+(\S+)$} $l m p] {
+ dict set ::platforms $p {}
+ dict set ::platforms $p "cur" 0
+ dict set ::platforms $p "fut" 0
+ } elseif [regexp {^\(i\)\s+(\S+)$} $l m p] {
+ dict set ::platforms $p {}
+ dict set ::platforms $p "cur" 1
+ dict set ::platforms $p "fut" 1
+ }
+ }
+ destroy .tlpl
+ toplevel .tlpl -class Dialog
+ wm withdraw .tlpl
+ wm transient .tlpl .
+ wm title .tlpl "Platforms"
+ if $::plain_unix {wm attributes .tlpl -type dialog}
+
+ # wallpaper frame
+ pack [ttk::frame .tlpl.bg] -expand 1 -fill both
+
+ # platforms treeview
+ pack [ttk::frame .tlpl.fpl] -in .tlpl.bg -fill both -expand 1
+ ttk::treeview .tlpl.pl -columns {sup plat} -show headings \
+ -height [dict size $::platforms] ; # -yscrollcommand {.tlpl.plsb set}
+ ppack .tlpl.pl -in .tlpl.fpl -side left -fill both -expand 1
+ #ttk::scrollbar .tlpl.plsb -orient vertical \
+ # -command {.tlpl.pl yview}
+ #ppack .tlpl.plsb -in .tlpl.fpl -side right -fill y -expand 1
+ foreach col {sup plat} nm {"" "Platform"} {
+ .tlpl.pl heading $col -text $nm -anchor w
+ }
+ .tlpl.pl column sup -width [expr {$::cw * 6}]
+ .tlpl.pl column plat -width [expr {$::cw * 20}]
+ dict for {p mks} $::platforms {
+ .tlpl.pl insert {} end -id $p -values \
+ [list [mark_sym [dict get $mks "cur"]] $p]
+ }
+
+ # "#2" refers to the second column, with editable mark symbols
+ bind .tlpl.pl <space> {toggle_pl_marked [.tlpl.pl focus] "#1"}
+ bind .tlpl.pl <Return> {toggle_pl_marked [.tlpl.pl focus] "#1"}
+ # only toggle when column is "sup" i.e. #1
+ bind .tlpl.pl <ButtonRelease-1> \
+ {toggle_pl_marked \
+ [.tlpl.pl identify item %x %y] \
+ [.tlpl.pl identify column %x %y]}
+
+ # buttons
+ pack [ttk::frame .tlpl.but] -in .tlpl.bg -fill x
+ ttk::button .tlpl.do -text "Apply and close" -command platform_do
+ ttk::button .tlpl.dont -text "Close" -command \
+ {raise .; destroy .tlpl}
+ ppack .tlpl.do -in .tlpl.but -side right
+ .tlpl.do configure -state disabled
+ ppack .tlpl.dont -in .tlpl.but -side right
+
+ place_dlg .tlpl .
+ wm resizable .tlpl 0 0
+ } ; # platform_select
+
+} ; # $::tcl_platform(platform) ne "windows"
+
+##### restore from backup #####
+
+# This is currently rather dangerous.
+# ::do_restore is set to 0 or 1 near the top of this source.
+
+if $::do_restore {
+# dictionary of backups, with mapping to list of available revisions
+set bks {}
+
+proc enable_restore {yesno} {
+ set st [expr {$yesno ? !disabled : disabled}]
+ .tlbk.bklist state $st
+ .tlbk.all configure -state $st
+ .tlbk.done configure -state $st
+} ; # enable_restore
+
+proc finish_restore {} {
+ vwait ::done_waiting
+ # now log_widget_cb should have done finish mode
+ # and re-enabled its close button.
+ # We won't wait for the log toplevel to close, but we will
+ # update the packages display in the main window.
+ update_local_revnumbers
+ collect_filtered
+} ; # finish_restore
+
+proc restore_all {} {
+ run_cmd "restore --force --all" log_widget_cb
+ finish_restore
+ raise .
+ destroy .tlbk
+} ; # restore_all
+
+proc restore_this {} {
+ set id [.tlbk.bklist focus]
+ if {$id eq {}} return
+ set r [.tlbk.bklist set $id rev]
+ if {$r eq {}} return
+ set p [.tlbk.bklist set $id pkg]
+ if {$p eq {}} {
+ set id [.tlbk.bklist parent $id]
+ if {$id ne {}} {set p [.tlbk.bklist set $id pkg]}
+ }
+ if {$p eq {}} return
+ set ans [tk_messageBox -message "Restore $p to revision $r?" \
+ -type okcancel -parent .tlbk]
+ if {$ans ne {ok}} return
+ run_cmd "restore --force $p $r" log_widget_cb
+ finish_restore
+ # tkwait window .tllg
+} ; # restore_this
+
+proc bklist_callback_click {x y} {
+ set cl [.tlbk.bklist identify column $x $y]
+ if {$cl eq "#0"} return
+ set id [.tlbk.bklist identify item $x $y]
+ .tlbk.bklist focus $id
+ restore_this
+} ; # bklist_callback_click
+
+proc restore_backups_dialog {} {
+ run_cmd_waiting "option autobackup"
+ set re {autobackup\t(.*)$}
+ set abk 0
+ foreach l $::out_log {
+ if [regexp $re $l m abk] break
+ }
+ if {$abk == 0} {
+ tk_messageBox -message "No backups configured"
+ return
+ }
+ run_cmd_waiting "option backupdir"
+ set re {backupdir\t(.*)$}
+ set bdir ""
+ foreach l $::out_log {
+ if [regexp $re $l m bdir] break
+ }
+ if {$bdir eq ""} {
+ tk_messageBox -message "No backup directory defined"
+ return
+ }
+ set bdir [file join [exec kpsewhich -var-value SELFAUTOPARENT] $bdir]
+ if {! [file isdirectory $bdir]} {
+ tk_messageBox -message "Backup directory $bdir does not exist"
+ return
+ }
+ set pwd0 [pwd]
+ cd $bdir
+ set backups [lsort [glob *.tar.xz]]
+ if {[llength $backups] == 0} {
+ tk_messageBox -message "No backups found in $bdir"
+ return
+ }
+ # dictionary of backups; package => list of available revisions
+ set ::bks [dict create]
+ set re {^(.*)\.r(\d+)\.tar\.xz$}
+ foreach b $backups {
+ if [regexp $re $b m pk r] {
+ if {$pk in [dict keys $::bks]} {
+ dict lappend ::bks $pk $r
+ } else {
+ dict set ::bks $pk [list $r]
+ }
+ }
+ }
+ if {[llength [dict keys $::bks]] == 0} {
+ tk_messageBox -message "No packages in backup directory $bdir"
+ return
+ }
+ # invert sort order of revisions for each package
+ foreach pk [dict keys $::bks] {
+ dict set ::bks $pk [lsort -decreasing [dict get $::bks $pk]]
+ }
+ toplevel .tlbk -class Dialog
+ wm withdraw .tlbk
+ wm transient .tlbk .
+ wm title .tlbk "Restore from backup"
+ if $::plain_unix {wm attributes .tlbk -type dialog}
+
+ # wallpaper frame; see make_widgets
+ pack [ttk::frame .tlbk.bg] -expand 1 -fill x
+
+ # the displayed list of backed-up packages
+ pack [ttk::frame .tlbk.fbk] -in .tlbk.bg -side top
+ # package names not in #0, because we want to trigger actions
+ # without automatically opening a parent.
+ pack [ttk::treeview .tlbk.bklist -columns {"pkg" "rev"} \
+ -show {tree headings} -height 8 -selectmode browse \
+ -yscrollcommand {.tlbk.bkvsb set}] -in .tlbk.fbk -side left
+ pack [ttk::scrollbar .tlbk.bkvsb -orient vertical -command \
+ {.tlbk.bklist yview}] -in .tlbk.fbk -side right -fill y
+
+ foreach col {"pkg" "rev"} nm {"Package" "Revision"} {
+ .tlbk.bklist heading $col -text $nm -anchor w
+ }
+ .tlbk.bklist column "#0" -width [expr {$::cw * 2}]
+ .tlbk.bklist column "pkg" -width [expr {$::cw * 25}]
+ .tlbk.bklist column "rev" -width [expr {$::cw * 12}]
+
+ # fill .tlbk.bklist. Use the last available revision.
+ # Remember that $::bks is sorted and revisions inversely sorted
+ # id must be unique in the entire list: rev does not qualify
+ # must as well use $id for package items too
+ set id 0
+ dict for {pk rlist} $::bks {
+ # package
+ .tlbk.bklist insert {} end -id [incr id] \
+ -values [list $pk [lindex $rlist 0]] -open 0
+ set l [llength $rlist]
+ # additional revisions
+ if {$l > 1} {
+ set idparent $id
+ for {set i 1} {$i<$l} {incr i} {
+ .tlbk.bklist insert $idparent end -id [incr id] \
+ -values [list "" [lindex $rlist $i]]
+ }
+ }
+ }
+
+ # since we can only restore one non-last revision at a time, it is better
+ # to only show one non-last revision at a time too.
+ bind .tlbk.bklist <<TreeviewOpen>> {
+ foreach p [.tlbk.bklist children {}] {
+ if {$p ne [.tlbk.bklist focus]} {
+ .tlbk.bklist item $p -open 0
+ }
+ }
+ }
+ # restoring a single package
+ bind .tlbk.bklist <<RightClick>> {bklist_callback_click %x %y}
+ bind .tlbk.bklist <space> restore_this
+
+ # frame with buttons
+ pack [ttk::frame .tlbk.fbut] -in .tlbk.bg -side bottom -fill x
+ ppack [ttk::button .tlbk.all -text "Restore all" -command restore_all] \
+ -in .tlbk.fbut -side right
+ ppack [ttk::button .tlbk.done -text "Close" \
+ -command {raise .; destroy .tlbk}] -in .tlbk.fbut -side right
+
+ place_dlg .tlbk .
+ wm resizable .tlbk 0 0
+} ; # restore_backups_dialog
+
+} ; # if $::do_restore
+
+##### Main window and supporting procs and callbacks ##################
+
+##### package-related #####
+
+proc update_tlmgr {} {
+ if {! $::need_update_tlmgr} {
+ tk_messageBox -message "Nothing to do!"
+ return
+ }
+ run_cmd "update --self" log_widget_cb
+ vwait ::done_waiting
+ # tlmgr restarts itself automatically
+ update_local_revnumbers
+ collect_filtered
+} ; # update_tlmgr
+
+proc update_all {} {
+ if $::need_update_tlmgr {
+ tk_messageBox -message "Update self first!"
+ return
+ } elseif {! $::n_updates} {
+ tk_messageBox -message "Nothing to do!"
+ return
+ }
+ run_cmd "update --all" log_widget_cb
+ vwait ::done_waiting
+ update_local_revnumbers
+ collect_filtered
+} ; # update_all
+
+### doing something with some packages
+
+proc pkglist_from_option {opt {pk ""}} {
+ if {$opt eq "marked"} {
+ set pks {}
+ dict for {p props} $::pkgs {
+ if [dict get $props "marked"] {lappend pks $p}
+ }
+ } elseif {$opt eq "focus"} {
+ set p [.pkglist focus]
+ if {$p ne {}} {lappend pks $p}
+ } elseif {$opt eq "name"} {
+ lappend pks $pk
+ }
+ return $pks
+} ; # pkglist_from_option
+
+proc install_pkgs {sel_opt {pk ""}} {
+ set pks [pkglist_from_option $sel_opt $pk]
+ # check whether packages are installed
+ set pre_installed {}
+ set todo {}
+ foreach p $pks {
+ if {[dict get $::pkgs $p localrev] > 0} {
+ lappend pre_installed $p
+ } else {
+ lappend todo $p
+ }
+ }
+ if {[llength $todo] == 0} {
+ tk_messageBox -message "Nothing to do!" -type ok -icon info
+ return
+ }
+ run_cmd_waiting "install --dry-run $todo"
+ # check whether dependencies are going to be installed
+ set r {^(\S+)\s+i\s}
+ set deps {}
+ foreach l $::out_log {
+ if {[regexp $r $l d p] && $p ni $pks} {
+ lappend deps $p
+ }
+ }
+ if {[llength $deps] > 0} {
+ set ans [any_message \
+ "Also installing dependencies\n\n$deps.\n\nContinue?" "okcancel"]
+ if {$ans eq "cancel"} return
+ }
+ run_cmd "install $todo" log_widget_cb
+ vwait ::done_waiting
+ if {[llength $pre_installed] > 0} {
+ lappend ::err_log "Already installed: $pre_installed"
+ show_err_log
+ }
+ update_local_revnumbers
+ collect_filtered
+} ; # install_pkgs
+
+proc update_pkgs {sel_opt {pk ""}} {
+ set pks [pkglist_from_option $sel_opt $pk]
+ # check whether packages are installed
+ set not_inst {}
+ set uptodate {}
+ set todo {}
+ foreach p $pks {
+ set lv [dict get $::pkgs $p localrev]
+ if {[dict get $::pkgs $p localrev] == 0} {
+ lappend not_inst $p
+ } else {
+ set rv [dict get $::pkgs $p remoterev]
+ if {$lv >= $rv} {
+ lappend uptodate $p
+ } else {
+ lappend todo $p
+ }
+ }
+ }
+ if {[llength $todo] == 0} {
+ tk_messageBox -message "Nothing to do!" -type ok -icon info
+ return
+ }
+ run_cmd_waiting "update --dry-run $todo"
+ # check whether dependencies are going to be updated
+ set r {^(\S+)\s+u\s}
+ set deps {}
+ foreach l $::out_log {
+ if {[regexp $r $l d p] && $p ni $pks} {
+ lappend deps $p
+ }
+ }
+ if {[llength $deps] > 0} {
+ set ans [any_message "Also updating dependencies\n\n$deps?" \
+ "yesnocancel"]
+ switch $ans {
+ "cancel" return
+ "yes" {run_cmd "update $todo" log_widget_cb}
+ "no" {
+ set deps {}
+ run_cmd_waiting "update --dry-run --no-depends $todo"
+ foreach l $::out_log {
+ if {[regexp $r $l u p] && $p ni $pks} {
+ lappend deps $p
+ }
+ }
+ if {[llength $deps] > 0} {
+ set ans [any_message \
+ "Updating hard dependencies $deps anyway. Continue?" \
+ "okcancel"]
+ if {$ans eq "cancel"} return
+ }
+ run_cmd "update --no-depends $todo" log_widget_cb
+ }
+ }
+ } else {
+ run_cmd "update $todo" log_widget_cb
+ }
+ vwait ::done_waiting
+ if {[llength $not_inst] > 0} {
+ lappend ::err_log "Skipped because not installed: $not_inst"
+ }
+ if {[llength $uptodate] > 0} {
+ lappend ::err_log "Skipped because already up to date: $uptodate"
+ }
+ if {[llength $not_inst] > 0 || [llength $uptodate] > 0} {
+ show_err_log
+ }
+ update_local_revnumbers
+ collect_filtered
+} ; # update_pkgs
+
+proc remove_pkgs {sel_opt {pk ""}} {
+ set pks [pkglist_from_option $sel_opt $pk]
+ # check whether packages are installed
+ set not_inst {}
+ set todo {}
+ foreach p $pks {
+ if {[dict get $::pkgs $p localrev] > 0} {
+ lappend todo $p
+ } else {
+ lappend not_inst $p
+ }
+ }
+ run_cmd_waiting "remove --dry-run $todo"
+ # check whether dependencies are going to be removed
+ set r {^(\S+)\s+d\s}
+ set deps {}
+ foreach l $::out_log {
+ if {[regexp $r $l d p] && $p ni $pks} {
+ lappend deps $p
+ }
+ }
+ if {[llength $todo] == 0} {
+ tk_messageBox -message "Nothing to do!" -type ok -icon info
+ return
+ }
+ if {[llength $deps] > 0} {
+ set ans [any_message "Also remove dependencies\n\n$deps?" \
+ "yesnocancel"]
+ switch $ans {
+ "cancel" return
+ "yes" {run_cmd "remove $todo" log_widget_cb}
+ "no" {
+ set deps {}
+ run_cmd_waiting "remove --dry-run --no-depends $todo"
+ foreach l $::out_log {
+ if {[regexp $r $l d p] && $p ni $pks} {
+ lappend deps $p
+ }
+ }
+ if {[llength $deps] > 0} {
+ set ans [any_message \
+ "Removing hard dependencies $deps anyway. Continue?" \
+ "okcancel"]
+ if {$ans eq "cancel"} return
+ }
+ run_cmd "remove --no-depends $todo" log_widget_cb
+ }
+ }
+ } else {
+ run_cmd "remove $todo" log_widget_cb
+ }
+ vwait ::done_waiting
+ if {[llength $not_inst] > 0} {
+ lappend ::err_log "Skipped because not installed: $not_inst"
+ show_err_log
+ }
+ update_local_revnumbers
+ collect_filtered
+} ; # remove_pkgs
+
+# restoring packages is a rather different story, controlled by the
+# contents of the backup directory. see further up.
+
+##### varous callbacks #####
+
+proc run_entry {} {
+ # TODO: some validation of $cmd
+ do_debug "run_entry"
+ set cmd [.ent.e get]
+ if {$cmd eq ""} return
+ do_debug $cmd
+ .ent.e delete 0 end
+ run_cmd $cmd log_widget_cb
+}
+
+proc restart_self {} {
+ do_debug "trying to restart"
+ if {$::progname eq ""} {
+ tk_messageBox -message "progname not found; not restarting"
+ return
+ }
+ close_tlmgr
+ exec $::progname &
+ # on windows, it may take several seconds before
+ # the old tlshell disappears.
+ # oh well, windows is still windows....
+ destroy .
+} ; # restart_self
+
+proc toggle_marked {itm cl} {
+ # toggle_marked is triggered by a mouse click only in column #1.
+ # 'marked' should get updated in ::pkgs, ::filtered and in .pkglist.
+
+ if {$cl ne "#1"} return
+ # $mrk: negation of current value of marked for $itm
+ set mrk [expr {[dict get $::pkgs $itm "marked"] ? 0 : 1}]
+ dict set ::pkgs $itm "marked" $mrk
+ set m [mark_sym $mrk]
+ dict set ::filtered $itm [lreplace [dict get $::filtered $itm] 0 0 $m]
+ .pkglist set $itm mk $m
+} ; # toggle_marked
+
+proc mark_all {mrk} {
+ foreach nm [dict keys $::pkgs] {
+ dict set ::pkgs $nm "marked" $mrk
+ }
+ set m [mark_sym $mrk]
+ foreach nm [dict keys $::filtered] {
+ dict set ::filtered $nm [lreplace [dict get $::filtered $nm] 0 0 $m]
+ }
+ foreach nm [.pkglist children {}] {
+ .pkglist set $nm mk $m
+ }
+ # alternatively: regenerate ::filtered and .pkglist from ::pkgs
+} ; # mark_all
+
+proc toggle_search_desc {} {
+ # when this proc is called, ::search_desc is not yet toggled
+ # so we temporarily pre-toggle and post-untoggle it
+ set ::search_desc [expr {$::search_desc ? 0 : 1}]
+ display_packages_info
+ set ::search_desc [expr {$::search_desc ? 0 : 1}]
+}
+
+##### package popup #####
+
+proc do_package_popup_menu {x y X Y} {
+ # as focused item, the identity of the clicked item will be
+ # globally available:
+ .pkglist focus [.pkglist identify item $x $y]
+ # recreate menu with only applicable items
+ set lr [dict get $::pkgs [.pkglist focus] "localrev"]
+ set rr [dict get $::pkgs [.pkglist focus] "remoterev"]
+ .pkg_popup delete 0 end
+ .pkg_popup add command -label "Info" -command \
+ {run_cmd "info [.pkglist focus]" log_widget_cb; \
+ vwait ::done_waiting}
+ if {$::have_remote && ! $::need_update_tlmgr && $rr > 0 && $lr == 0} {
+ .pkg_popup add command -label "Install" -command \
+ {install_pkgs "focus"}
+ }
+ if {$::have_remote && ! $::need_update_tlmgr && $lr > 0 && $rr > $lr} {
+ .pkg_popup add command -label "Update" -command \
+ {update_pkgs "focus"}
+ }
+ if {$lr > 0} {
+ .pkg_popup add command -label "Remove" -command \
+ {remove_pkgs "focus"}
+ }
+ .pkg_popup post [expr {$X - 2}] [expr {$Y - 2}]
+ focus .pkg_popup
+} ; # do_package_popup_menu
+
+proc set_paper {p} {
+ run_cmd "paper paper $p" log_widget_cb
+}
+
+##### running external commands #####
+
+# For capturing an external command, we need a separate output channel,
+# but we reuse ::out_log.
+# stderr is bundled with stdout so ::err_log should stay empty.
+proc read_capt {} {
+ set l "" ; # will contain the line to be read
+ if {([catch {chan gets $::capt l} len] || [chan eof $::capt])} {
+ catch {chan close $::capt}
+ log_widget_cb "finish"
+ set ::done_waiting 1
+ } elseif {$len >= 0} {
+ lappend ::out_log $l
+ log_widget_cb "line" $l
+ }
+}; # read_capt
+
+proc run_external {cmd mess} {
+ set ::out_log {}
+ set ::err_log {}
+ lappend ::out_log $mess
+ unset -nocomplain ::done_waiting
+ # dont understand why, on windows, start_tlmgr does not trigger
+ # a console window but this proc does
+ if [catch {open "|$cmd 2>&1" "r"} ::capt] {
+ tk_messageBox -message "Failure to launch $cmd"
+ }
+ chan configure $::capt -buffering line -blocking 0
+ chan event $::capt readable read_capt
+ log_widget_cb "init"
+}
+
+##### main window #####
+
+proc make_widgets {} {
+
+ wm title . "$::progname $::procid"
+
+ # width of '0', as a rough estimate of average character width
+ set ::cw [font measure TkTextFont "0"]
+
+ # dummy empty menu to replace the real menu .mn in disabled states.
+ # the "File" cascade should ensure that the dummy menu
+ # occupies the same vertical space as the real menu.
+ menu .mn_empty
+ .mn_empty add cascade -label "File" -menu .mn_empty.file -underline 0
+ if $::plain_unix {
+ .mn_empty configure -borderwidth 1
+ .mn_empty configure -background $::default_bg
+ menu .mn_empty.file
+ }
+ # real menu
+ menu .mn
+ . configure -menu .mn
+ if $::plain_unix {
+ .mn configure -borderwidth 1
+ .mn configure -background $::default_bg
+
+ # plain_unix: avoid a RenderBadPicture error on quitting.
+ # 'send' changes the shutdown sequence,
+ # which avoids triggering the bug.
+ # 'tk appname <something>' restores 'send' and avoids the bug
+ bind . <Destroy> {
+ catch {tk appname appname}
+ }
+ }
+
+ .mn add cascade -label "File" -menu .mn.file -underline 0
+ menu .mn.file
+ .mn.file add command -label "Load default repository" \
+ -command {get_packages_info_remote; collect_filtered}
+ .mn.file add command -command {destroy .} -label "Exit" -underline 1
+
+ # inx: keeping count where needed, i.e. when an entry needs to be referenced
+ .mn add cascade -label "Packages" -menu .mn.pkg
+ menu .mn.pkg
+ set inx 0
+ set ::inx_upd_tlmgr $inx
+ .mn.pkg add command -label "Update tlmgr" -command update_tlmgr
+ incr inx
+ set ::inx_upd_all $inx
+ .mn.pkg add command -label "Update all" -command update_all
+ incr inx
+ .mn.pkg add command -label "Install marked" \
+ -command {install_pkgs "marked"}
+ incr inx
+ .mn.pkg add command -label "Update marked" \
+ -command {update_pkgs "marked"}
+ incr inx
+ .mn.pkg add command -label "Remove marked" \
+ -command {remove_pkgs "marked"}
+ if $::do_restore {
+ incr inx
+ .mn.pkg add command -label "Restore from backup..." \
+ -command restore_backups_dialog
+ }
+
+ .mn add cascade -label "Actions" -menu .mn.act -underline 0
+ menu .mn.act
+ .mn.act add command -label "Regenerate filename database" -command \
+ {run_external "mktexlsr" "Regenerating filename database..."}
+ .mn.act add command -label "Regenerate formats" -command \
+ {run_external "fmtutil-sys --all" "Rebuilding formats..."}
+ .mn.act add command -label "Regenerate fontmaps" -command \
+ {run_external "updmap-sys" "Rebuilding fontmap files..."}
+
+ .mn add cascade -label "Options" -menu .mn.opt -underline 0
+ menu .mn.opt
+ set inx 0
+ .mn.opt add command -label "Change repository..." \
+ -command repositories
+ incr inx
+ .mn.opt add cascade -label "Paper" -menu .mn.opt.paper
+ menu .mn.opt.paper
+ foreach p [list a4 letter] {
+ .mn.opt.paper add command -label $p -command "set_paper $p"
+ }
+ if {$::tcl_platform(platform) ne "windows"} {
+ incr inx
+ set ::inx_platforms $inx
+ .mn.opt add command -label "Platforms..." -command platform_select
+ }
+
+ .mn add cascade -label "Help" -menu .mn.help -underline 0
+ menu .mn.help
+ .mn.help add command -command {tk_messageBox -message "Helpless"} \
+ -label "About"
+
+ # wallpaper frame
+ # it is possible to set a background color for a toplevel, but on
+ # MacOS I did not find a way to determine the right $::default_bg
+ # color. Instead, all toplevels are given a wallpaper ttk::frame
+ # with the default ttk::frame color, which seems to work
+ # everywhere.
+ pack [ttk::frame .bg] -expand 1 -fill both
+
+ # various info
+ ttk::frame .topf
+ pack .topf -in .bg -side top -anchor w
+
+ pgrid [ttk::label .topf.llrepo -text "Default repository" -anchor w] \
+ -row 0 -column 0 -sticky w
+ pgrid [ttk::label .topf.lrepo -textvariable ::repo] \
+ -row 0 -column 1 -sticky w
+ pgrid [ttk::label .topf.loaded -text "Not loaded"] \
+ -row 1 -column 1 -sticky w
+
+ ttk::label .topf.lluptodate -text "TL Manager up to date?" -anchor w
+ pgrid .topf.lluptodate -row 2 -column 0 -sticky w
+ ttk::label .topf.luptodate -text "Unknown" -anchor w
+ pgrid .topf.luptodate -row 2 -column 1 -sticky w
+
+ pgrid [ttk::label .topf.llcmd -anchor w -text "Last tlmgr command: "] \
+ -row 3 -column 0 -sticky w
+ pgrid [ttk::label .topf.lcmd -anchor w -textvariable ::last_cmd] \
+ -row 3 -column 1 -sticky w
+
+ # command entry widget
+ spacing .bg
+ ttk::frame .ent
+ ppack [ttk::label .ent.l -text "Type command:"] -side left
+ ppack [ttk::entry .ent.e -width 40] -side left -padx 3
+ ppack [ttk::button .ent.b -text Go -command run_entry] -side left
+ bind .ent.e <Return> run_entry
+ pack .ent -in .bg -fill x -side top
+
+ spacing .bg
+
+ # package list
+ ttk::label .lpack -text "Package list" -font TkHeadingFont -anchor w
+ ppack .lpack -in .bg -side top -fill x
+
+ # controlling package list
+ ttk::frame .pkfilter
+ # filter on status: inst, all, upd
+ ttk::label .pkfilter.lstat -font TkHeadingFont -text "Status"
+ ttk::radiobutton .pkfilter.inst -text Installed -value inst \
+ -variable ::stat_opt -command collect_filtered
+ ttk::radiobutton .pkfilter.alls -text All -value all \
+ -variable ::stat_opt -command collect_filtered
+ ttk::radiobutton .pkfilter.upd -text Updatable -value upd \
+ -variable ::stat_opt -command collect_filtered
+ grid .pkfilter.lstat -column 0 -row 0 -sticky w -padx {3 50}
+ pgrid .pkfilter.inst -column 0 -row 1 -sticky w
+ pgrid .pkfilter.alls -column 0 -row 2 -sticky w
+ pgrid .pkfilter.upd -column 0 -row 3 -sticky w
+
+ # filter on detail level: all, coll, schm
+ ttk::label .pkfilter.ldtl -font TkHeadingFont -text "Detail >> Global"
+ ttk::radiobutton .pkfilter.alld -text All -value all \
+ -variable ::dtl_opt -command collect_filtered
+ ttk::radiobutton .pkfilter.coll -text "Collections and schemes" -value coll \
+ -variable ::dtl_opt -command collect_filtered
+ ttk::radiobutton .pkfilter.schm -text "Only schemes" -value schm \
+ -variable ::dtl_opt -command collect_filtered
+ pgrid .pkfilter.ldtl -column 1 -row 0 -sticky w
+ pgrid .pkfilter.alld -column 1 -row 1 -sticky w
+ pgrid .pkfilter.coll -column 1 -row 2 -sticky w
+ pgrid .pkfilter.schm -column 1 -row 3 -sticky w
+
+ # marks
+ grid [ttk::button .mrk_all -text "Mark all" -command {mark_all 1}] \
+ -in .pkfilter -column 2 -row 1 -sticky w -padx {50 3} -pady 3
+ grid [ttk::button .mrk_none -text "Mark none" -command {mark_all 0}] \
+ -in .pkfilter -column 2 -row 2 -sticky w -padx {50 3} -pady 3
+
+ pack .pkfilter -in .bg -side top -fill x
+
+ # search interface
+ pack [ttk::frame .pksearch] -in .bg -side top -fill x
+ ppack [ttk::label .pksearch.l \
+ -text "Search package names"] \
+ -side left
+ pack [ttk::entry .pksearch.e -width 30] -side left -padx {3 0} -pady 3
+ ppack [ttk::checkbutton .pksearch.d -variable ::search_desc \
+ -text "Also search short descriptions"] -side left
+ bind .pksearch.e <KeyRelease> display_packages_info
+ bind .pksearch.d <ButtonRelease> toggle_search_desc
+
+ # packages list
+ pack [ttk::frame .fpkg] -in .bg -side top -fill both -expand 1
+ ttk::treeview .pkglist -columns \
+ {mk name localrev remoterev shortdesc} \
+ -show headings -height 8 -selectmode extended \
+ -xscrollcommand {.pkhsb set} -yscrollcommand {.pkvsb set}
+ foreach \
+ col {mk name localrev remoterev shortdesc} \
+ nm {"" Name "Local Rev. (ver.)" "Remote Rev. (ver.)" Description} {
+ .pkglist heading $col -text $nm -anchor w
+ }
+ .pkglist column mk -width [expr {$::cw * 3}]
+ .pkglist column name -width [expr {$::cw * 25}]
+ .pkglist column localrev -width [expr {$::cw * 18}]
+ .pkglist column remoterev -width [expr {$::cw * 18}]
+ .pkglist column shortdesc -width [expr {$::cw * 50}]
+
+ ttk::scrollbar .pkhsb -orient horizontal -command {.pkglist xview}
+ ttk::scrollbar .pkvsb -orient vertical -command {.pkglist yview}
+ pgrid .pkglist -in .fpkg -row 0 -column 0 -sticky news
+ grid .pkvsb -in .fpkg -row 0 -column 1 -sticky ns
+ grid .pkhsb -in .fpkg -row 1 -column 0 -sticky ew
+ grid columnconfigure .fpkg 0 -weight 1
+ grid rowconfigure .fpkg 0 -weight 1
+
+ # "#1" refers to the first column (with mark symbols)
+ bind .pkglist <space> {toggle_marked [.pkglist focus] "#1"}
+ bind .pkglist <Return> {toggle_marked [.pkglist focus] "#1"}
+ # only toggle when column is "mk" i.e. #1
+ bind .pkglist <ButtonRelease-1> {toggle_marked \
+ [.pkglist identify item %x %y] [.pkglist identify column %x %y]}
+
+ menu .pkg_popup ; # entries added on-the-fly
+ bind .pkglist <<RightClick>> {do_package_popup_menu %x %y %X %Y}
+ if $::plain_unix {
+ bind .pkg_popup <Leave> {.pkg_popup unpost}
+ }
+
+ # bottom of main window
+ pack [ttk::frame .endbuttons] -in .bg -side bottom -fill x
+ ttk::label .busy -textvariable ::busy -font TkHeadingFont -anchor w
+ ppack .busy -in .endbuttons -side left
+ ppack [ttk::button .q -text Quit -command {destroy .}] \
+ -in .endbuttons -side right
+ ppack [ttk::button .r -text "Restart self" -command restart_self] \
+ -in .endbuttons -side right
+ ppack [ttk::button .t -text "Restart tlmgr" \
+ -command {close_tlmgr; start_tlmgr}] \
+ -in .endbuttons -side right
+ ttk::button .showlogs -text "Show logs" -command show_logs
+ ppack .showlogs -in .endbuttons -side right
+} ; # make_widgets
+
+##### initialize ######################################################
+
+proc initialize {} {
+ # seed random numbers
+ expr {srand([clock seconds])}
+ # prepend TL to process searchpath (not needed on windows)
+ if {$::tcl_platform(platform) ne "windows"} {
+ set texbin [file dirname [info script]]
+ set savedir [pwd]
+ cd $texbin
+ set texbin [pwd]
+ cd $savedir
+ # prepend texbin to PATH, unless it is already the _first_
+ # path component
+ if {$::tcl_platform(platform) eq "unix"} {
+ set pathsep ":"
+ } else {
+ set pathsep ";"
+ }
+ set dirs [split $::env(PATH) $pathsep]
+ if {[lindex $dirs 0] ne $texbin} {
+ set ::env(PATH) "$texbin$pathsep$::env(PATH)"
+ }
+ # now is a good time to ask tlmgr for the tl name of our platform
+ set ::our_platform [exec tlmgr print-platform]
+ }
+ # directory for temp files
+ set attemptdirs {}
+ foreach tmp {TMPDIR TEMP TMP} {
+ if {$tmp in [array names ::env]} {
+ lappend attemptdirs $::env($tmp)
+ }
+ }
+ if {$::tcl_platform(platform) eq "unix"} {
+ lappend attemptdirs "/tmp"
+ }
+ lappend attemptdirs [pwd]
+ set ::tempsub ""
+ foreach tmp $attemptdirs {
+ if {$::tcl_platform(platform) eq "windows"} {
+ regsub -all {\\} $tmp {/} tmp
+ }
+ if {[file isdirectory $tmp]} {
+ # no real point in randomizing directory name itself
+ if {$::tcl_platform(platform) eq "unix"} {
+ set ::tempsub [file join $tmp $::env(USER)]
+ } else {
+ set ::tempsub [file join $tmp $::env(USERNAME)]
+ }
+ append ::tempsub "-tlshell"
+ if {! [catch {file mkdir $::tempsub}]} {break} ;# success
+ }
+ }
+
+ if {$::tempsub eq "" || [file isdirectory $::tempsub] == 0} {
+ error "Cannot create directory for temporary files"
+ }
+ # temp file for stderr
+ set ::err_file [maketemp ".err_tlshl"]
+
+ # logfile
+ if $::ddebug {
+ set fname [file join $::tempsub \
+ [clock format [clock seconds] -format {%H:%M}]]
+ set ::flid [open $fname w]
+ }
+
+ # add json subdirectory to auto_path, but at low priority
+ # since the tcl/tk installation may already have a better implementation.
+ # Use kpsewhich to find out own directory and bypass symlinks.
+ #set tlsdir [file dirname [exec kpsewhich -format texmfscripts tlshell.tcl]]
+ #lappend ::auto_path [file join $tlsdir "json"]
+
+ make_widgets
+
+ start_tlmgr
+ get_repo
+ get_packages_info_local
+ collect_filtered ; # invokes display_packages_info
+ enable_menu_controls 1
+}; # initialize
+
+initialize
diff --git a/Master/.mkisofsrc b/Master/.mkisofsrc
index de508e95a89..f4d24bcb4dc 100644
--- a/Master/.mkisofsrc
+++ b/Master/.mkisofsrc
@@ -1,4 +1,4 @@
APPI=Complete TeX system
COPY=LICENSE.TL
PUBL=TeX Live <tex-live@tug.org>
-VOLI=TeXLive2017
+VOLI=TeXLive2018
diff --git a/Master/bin/aarch64-linux/tlcockpit b/Master/bin/aarch64-linux/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/aarch64-linux/tlcockpit
+++ b/Master/bin/aarch64-linux/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/amd64-freebsd/tlcockpit b/Master/bin/amd64-freebsd/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/amd64-freebsd/tlcockpit
+++ b/Master/bin/amd64-freebsd/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/amd64-netbsd/tlcockpit b/Master/bin/amd64-netbsd/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/amd64-netbsd/tlcockpit
+++ b/Master/bin/amd64-netbsd/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/armel-linux/tlcockpit b/Master/bin/armel-linux/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/armel-linux/tlcockpit
+++ b/Master/bin/armel-linux/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/armhf-linux/tlcockpit b/Master/bin/armhf-linux/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/armhf-linux/tlcockpit
+++ b/Master/bin/armhf-linux/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/i386-cygwin/tlcockpit b/Master/bin/i386-cygwin/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/i386-cygwin/tlcockpit
+++ b/Master/bin/i386-cygwin/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/i386-darwin/tlcockpit b/Master/bin/i386-darwin/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/i386-darwin/tlcockpit
+++ b/Master/bin/i386-darwin/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/i386-freebsd/tlcockpit b/Master/bin/i386-freebsd/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/i386-freebsd/tlcockpit
+++ b/Master/bin/i386-freebsd/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/i386-linux/tlcockpit b/Master/bin/i386-linux/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/i386-linux/tlcockpit
+++ b/Master/bin/i386-linux/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/i386-netbsd/tlcockpit b/Master/bin/i386-netbsd/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/i386-netbsd/tlcockpit
+++ b/Master/bin/i386-netbsd/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/i386-solaris/tlcockpit b/Master/bin/i386-solaris/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/i386-solaris/tlcockpit
+++ b/Master/bin/i386-solaris/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/powerpc-darwin/tlcockpit b/Master/bin/powerpc-darwin/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/powerpc-darwin/tlcockpit
+++ b/Master/bin/powerpc-darwin/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/powerpc-linux/tlcockpit b/Master/bin/powerpc-linux/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/powerpc-linux/tlcockpit
+++ b/Master/bin/powerpc-linux/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/sparc-solaris/tlcockpit b/Master/bin/sparc-solaris/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/sparc-solaris/tlcockpit
+++ b/Master/bin/sparc-solaris/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/x86_64-cygwin/tlcockpit b/Master/bin/x86_64-cygwin/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/x86_64-cygwin/tlcockpit
+++ b/Master/bin/x86_64-cygwin/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/x86_64-darwin/tlcockpit b/Master/bin/x86_64-darwin/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/x86_64-darwin/tlcockpit
+++ b/Master/bin/x86_64-darwin/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/x86_64-darwinlegacy/tlcockpit b/Master/bin/x86_64-darwinlegacy/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/x86_64-darwinlegacy/tlcockpit
+++ b/Master/bin/x86_64-darwinlegacy/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/x86_64-linux/afm2pl b/Master/bin/x86_64-linux/afm2pl
index e4d5dea9eab..65122b11d7b 100755
--- a/Master/bin/x86_64-linux/afm2pl
+++ b/Master/bin/x86_64-linux/afm2pl
Binary files differ
diff --git a/Master/bin/x86_64-linux/afm2tfm b/Master/bin/x86_64-linux/afm2tfm
index 9c946c179f7..c508a479e08 100755
--- a/Master/bin/x86_64-linux/afm2tfm
+++ b/Master/bin/x86_64-linux/afm2tfm
Binary files differ
diff --git a/Master/bin/x86_64-linux/aleph b/Master/bin/x86_64-linux/aleph
index dfe957d3189..495c7580cb3 100755
--- a/Master/bin/x86_64-linux/aleph
+++ b/Master/bin/x86_64-linux/aleph
Binary files differ
diff --git a/Master/bin/x86_64-linux/asy b/Master/bin/x86_64-linux/asy
index b704001f3ee..38240b944fc 100755
--- a/Master/bin/x86_64-linux/asy
+++ b/Master/bin/x86_64-linux/asy
Binary files differ
diff --git a/Master/bin/x86_64-linux/autosp b/Master/bin/x86_64-linux/autosp
index 941e4e14993..50b2cff7a24 100755
--- a/Master/bin/x86_64-linux/autosp
+++ b/Master/bin/x86_64-linux/autosp
Binary files differ
diff --git a/Master/bin/x86_64-linux/axohelp b/Master/bin/x86_64-linux/axohelp
new file mode 100755
index 00000000000..81e65451a99
--- /dev/null
+++ b/Master/bin/x86_64-linux/axohelp
Binary files differ
diff --git a/Master/bin/x86_64-linux/bbox b/Master/bin/x86_64-linux/bbox
index 448a1a50558..3e0a673759d 100755
--- a/Master/bin/x86_64-linux/bbox
+++ b/Master/bin/x86_64-linux/bbox
Binary files differ
diff --git a/Master/bin/x86_64-linux/bg5conv b/Master/bin/x86_64-linux/bg5conv
index b8f78f7562d..ef96bde23d2 100755
--- a/Master/bin/x86_64-linux/bg5conv
+++ b/Master/bin/x86_64-linux/bg5conv
Binary files differ
diff --git a/Master/bin/x86_64-linux/bibtex b/Master/bin/x86_64-linux/bibtex
index e3856954e95..eea554c94fc 100755
--- a/Master/bin/x86_64-linux/bibtex
+++ b/Master/bin/x86_64-linux/bibtex
Binary files differ
diff --git a/Master/bin/x86_64-linux/bibtex8 b/Master/bin/x86_64-linux/bibtex8
index 307add48e41..12f0a3177f1 100755
--- a/Master/bin/x86_64-linux/bibtex8
+++ b/Master/bin/x86_64-linux/bibtex8
Binary files differ
diff --git a/Master/bin/x86_64-linux/bibtexu b/Master/bin/x86_64-linux/bibtexu
index 5a254e2b066..e02e1da5360 100755
--- a/Master/bin/x86_64-linux/bibtexu
+++ b/Master/bin/x86_64-linux/bibtexu
Binary files differ
diff --git a/Master/bin/x86_64-linux/cef5conv b/Master/bin/x86_64-linux/cef5conv
index e15bcdc8b4f..c8de2f95f02 100755
--- a/Master/bin/x86_64-linux/cef5conv
+++ b/Master/bin/x86_64-linux/cef5conv
Binary files differ
diff --git a/Master/bin/x86_64-linux/cefconv b/Master/bin/x86_64-linux/cefconv
index 9d851402837..29b92925fec 100755
--- a/Master/bin/x86_64-linux/cefconv
+++ b/Master/bin/x86_64-linux/cefconv
Binary files differ
diff --git a/Master/bin/x86_64-linux/cefsconv b/Master/bin/x86_64-linux/cefsconv
index 2372bc4ebae..27ddf9efd45 100755
--- a/Master/bin/x86_64-linux/cefsconv
+++ b/Master/bin/x86_64-linux/cefsconv
Binary files differ
diff --git a/Master/bin/x86_64-linux/cfftot1 b/Master/bin/x86_64-linux/cfftot1
index ab9e13e7fd9..bb478509380 100755
--- a/Master/bin/x86_64-linux/cfftot1
+++ b/Master/bin/x86_64-linux/cfftot1
Binary files differ
diff --git a/Master/bin/x86_64-linux/chktex b/Master/bin/x86_64-linux/chktex
index 13f9fb3a098..524368b65ee 100755
--- a/Master/bin/x86_64-linux/chktex
+++ b/Master/bin/x86_64-linux/chktex
Binary files differ
diff --git a/Master/bin/x86_64-linux/ctangle b/Master/bin/x86_64-linux/ctangle
index 5408ea753d6..b7559441027 100755
--- a/Master/bin/x86_64-linux/ctangle
+++ b/Master/bin/x86_64-linux/ctangle
Binary files differ
diff --git a/Master/bin/x86_64-linux/ctie b/Master/bin/x86_64-linux/ctie
index 681a518f369..4dc91ec704c 100755
--- a/Master/bin/x86_64-linux/ctie
+++ b/Master/bin/x86_64-linux/ctie
Binary files differ
diff --git a/Master/bin/x86_64-linux/cweave b/Master/bin/x86_64-linux/cweave
index 5509d9366aa..31b78e263ed 100755
--- a/Master/bin/x86_64-linux/cweave
+++ b/Master/bin/x86_64-linux/cweave
Binary files differ
diff --git a/Master/bin/x86_64-linux/detex b/Master/bin/x86_64-linux/detex
index 57bf236a804..29f669f8521 100755
--- a/Master/bin/x86_64-linux/detex
+++ b/Master/bin/x86_64-linux/detex
Binary files differ
diff --git a/Master/bin/x86_64-linux/devnag b/Master/bin/x86_64-linux/devnag
index b56f035388b..fbf0f7f370e 100755
--- a/Master/bin/x86_64-linux/devnag
+++ b/Master/bin/x86_64-linux/devnag
Binary files differ
diff --git a/Master/bin/x86_64-linux/disdvi b/Master/bin/x86_64-linux/disdvi
index 2eb36fe4af1..deb7e87c862 100755
--- a/Master/bin/x86_64-linux/disdvi
+++ b/Master/bin/x86_64-linux/disdvi
Binary files differ
diff --git a/Master/bin/x86_64-linux/dt2dv b/Master/bin/x86_64-linux/dt2dv
index 92b9fb4f137..42c8842a883 100755
--- a/Master/bin/x86_64-linux/dt2dv
+++ b/Master/bin/x86_64-linux/dt2dv
Binary files differ
diff --git a/Master/bin/x86_64-linux/dv2dt b/Master/bin/x86_64-linux/dv2dt
index 371f0647b2a..e5a019c960b 100755
--- a/Master/bin/x86_64-linux/dv2dt
+++ b/Master/bin/x86_64-linux/dv2dt
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvi2tty b/Master/bin/x86_64-linux/dvi2tty
index 93b61334414..231b97c73bd 100755
--- a/Master/bin/x86_64-linux/dvi2tty
+++ b/Master/bin/x86_64-linux/dvi2tty
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvibook b/Master/bin/x86_64-linux/dvibook
index 9f33e3d70bf..0744641d27d 100755
--- a/Master/bin/x86_64-linux/dvibook
+++ b/Master/bin/x86_64-linux/dvibook
Binary files differ
diff --git a/Master/bin/x86_64-linux/dviconcat b/Master/bin/x86_64-linux/dviconcat
index 521b4c89042..239db7e8bf3 100755
--- a/Master/bin/x86_64-linux/dviconcat
+++ b/Master/bin/x86_64-linux/dviconcat
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvicopy b/Master/bin/x86_64-linux/dvicopy
index 4e8c470c960..303e14587ac 100755
--- a/Master/bin/x86_64-linux/dvicopy
+++ b/Master/bin/x86_64-linux/dvicopy
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvidvi b/Master/bin/x86_64-linux/dvidvi
index 7b048ef783f..15adf2502e4 100755
--- a/Master/bin/x86_64-linux/dvidvi
+++ b/Master/bin/x86_64-linux/dvidvi
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvihp b/Master/bin/x86_64-linux/dvihp
index fdaf3fb87bf..03a2dbe9605 100755
--- a/Master/bin/x86_64-linux/dvihp
+++ b/Master/bin/x86_64-linux/dvihp
@@ -6,14 +6,11 @@
: ${DVILJ=dvilj4} # the dvilj variant to run
: ${SPOOL=lpr} # used to print an LJ file
-: ${TMPDIR=${TEMP-${TMP-/tmp}}} # for the dvicopy output
-tmpdir="${TMPDIR}"/dvihp$$
-(umask 077; mkdir "$tmpdir") \
+tmpdir=`mktemp -d` \
|| { echo "cannot create directory \`$tmpdir'."; exit 1; }
trap '
- cd "${TMPDIR}"
test -d "$tmpdir" && { rm -f "$tmpdir"/*; rmdir "$tmpdir"; }
exit 0
' 0 1 2 3 6 7 13 15
diff --git a/Master/bin/x86_64-linux/dvilj b/Master/bin/x86_64-linux/dvilj
index 0091084c3d7..621d60dcb0b 100755
--- a/Master/bin/x86_64-linux/dvilj
+++ b/Master/bin/x86_64-linux/dvilj
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvilj2p b/Master/bin/x86_64-linux/dvilj2p
index 644600eb1d7..28661c4d4d2 100755
--- a/Master/bin/x86_64-linux/dvilj2p
+++ b/Master/bin/x86_64-linux/dvilj2p
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvilj4 b/Master/bin/x86_64-linux/dvilj4
index bb83c95b755..23e562d50dc 100755
--- a/Master/bin/x86_64-linux/dvilj4
+++ b/Master/bin/x86_64-linux/dvilj4
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvilj4l b/Master/bin/x86_64-linux/dvilj4l
index 6d5c86f1ff3..38067df366f 100755
--- a/Master/bin/x86_64-linux/dvilj4l
+++ b/Master/bin/x86_64-linux/dvilj4l
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvipng b/Master/bin/x86_64-linux/dvipng
index 278eb85933d..b73ad91548d 100755
--- a/Master/bin/x86_64-linux/dvipng
+++ b/Master/bin/x86_64-linux/dvipng
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvipos b/Master/bin/x86_64-linux/dvipos
index 971fe3260ff..9d80b8dfb05 100755
--- a/Master/bin/x86_64-linux/dvipos
+++ b/Master/bin/x86_64-linux/dvipos
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvips b/Master/bin/x86_64-linux/dvips
index 8a3bf0c1cbe..2db1beb5a9a 100755
--- a/Master/bin/x86_64-linux/dvips
+++ b/Master/bin/x86_64-linux/dvips
Binary files differ
diff --git a/Master/bin/x86_64-linux/dviselect b/Master/bin/x86_64-linux/dviselect
index d15dbb26c18..20b486e84e5 100755
--- a/Master/bin/x86_64-linux/dviselect
+++ b/Master/bin/x86_64-linux/dviselect
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvisvgm b/Master/bin/x86_64-linux/dvisvgm
index 343d946327d..fafd1c74440 100755
--- a/Master/bin/x86_64-linux/dvisvgm
+++ b/Master/bin/x86_64-linux/dvisvgm
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvitodvi b/Master/bin/x86_64-linux/dvitodvi
index 3d531f191a7..e155b98b93f 100755
--- a/Master/bin/x86_64-linux/dvitodvi
+++ b/Master/bin/x86_64-linux/dvitodvi
Binary files differ
diff --git a/Master/bin/x86_64-linux/dvitype b/Master/bin/x86_64-linux/dvitype
index 83c156c8897..db8f5f0d685 100755
--- a/Master/bin/x86_64-linux/dvitype
+++ b/Master/bin/x86_64-linux/dvitype
Binary files differ
diff --git a/Master/bin/x86_64-linux/epsffit b/Master/bin/x86_64-linux/epsffit
index 51f3678e953..186a34175fd 100755
--- a/Master/bin/x86_64-linux/epsffit
+++ b/Master/bin/x86_64-linux/epsffit
Binary files differ
diff --git a/Master/bin/x86_64-linux/eptex b/Master/bin/x86_64-linux/eptex
index 4591fbcdaa1..faa9e152a56 100755
--- a/Master/bin/x86_64-linux/eptex
+++ b/Master/bin/x86_64-linux/eptex
Binary files differ
diff --git a/Master/bin/x86_64-linux/euptex b/Master/bin/x86_64-linux/euptex
index 597e2038796..454bafd9afd 100755
--- a/Master/bin/x86_64-linux/euptex
+++ b/Master/bin/x86_64-linux/euptex
Binary files differ
diff --git a/Master/bin/x86_64-linux/extconv b/Master/bin/x86_64-linux/extconv
index 0f8dad5b171..dc6bb80255c 100755
--- a/Master/bin/x86_64-linux/extconv
+++ b/Master/bin/x86_64-linux/extconv
Binary files differ
diff --git a/Master/bin/x86_64-linux/gftodvi b/Master/bin/x86_64-linux/gftodvi
index dc82bc88713..5cc60cabc4c 100755
--- a/Master/bin/x86_64-linux/gftodvi
+++ b/Master/bin/x86_64-linux/gftodvi
Binary files differ
diff --git a/Master/bin/x86_64-linux/gftopk b/Master/bin/x86_64-linux/gftopk
index c5c9d86a9d7..80a6fd4fab8 100755
--- a/Master/bin/x86_64-linux/gftopk
+++ b/Master/bin/x86_64-linux/gftopk
Binary files differ
diff --git a/Master/bin/x86_64-linux/gftype b/Master/bin/x86_64-linux/gftype
index 168373e97d7..82895b451ba 100755
--- a/Master/bin/x86_64-linux/gftype
+++ b/Master/bin/x86_64-linux/gftype
Binary files differ
diff --git a/Master/bin/x86_64-linux/gregorio b/Master/bin/x86_64-linux/gregorio
index 56cf48364cd..25d173a8fd3 100755
--- a/Master/bin/x86_64-linux/gregorio
+++ b/Master/bin/x86_64-linux/gregorio
Binary files differ
diff --git a/Master/bin/x86_64-linux/gsftopk b/Master/bin/x86_64-linux/gsftopk
index 7440063f3bd..c468198abe8 100755
--- a/Master/bin/x86_64-linux/gsftopk
+++ b/Master/bin/x86_64-linux/gsftopk
Binary files differ
diff --git a/Master/bin/x86_64-linux/hbf2gf b/Master/bin/x86_64-linux/hbf2gf
index b2e96111e86..79c62ba17d1 100755
--- a/Master/bin/x86_64-linux/hbf2gf
+++ b/Master/bin/x86_64-linux/hbf2gf
Binary files differ
diff --git a/Master/bin/x86_64-linux/kpseaccess b/Master/bin/x86_64-linux/kpseaccess
index da19901ab5e..216c5653578 100755
--- a/Master/bin/x86_64-linux/kpseaccess
+++ b/Master/bin/x86_64-linux/kpseaccess
Binary files differ
diff --git a/Master/bin/x86_64-linux/kpsereadlink b/Master/bin/x86_64-linux/kpsereadlink
index 7a725a72c90..87ce320164c 100755
--- a/Master/bin/x86_64-linux/kpsereadlink
+++ b/Master/bin/x86_64-linux/kpsereadlink
Binary files differ
diff --git a/Master/bin/x86_64-linux/kpsestat b/Master/bin/x86_64-linux/kpsestat
index 473da3d8f76..2b15d998555 100755
--- a/Master/bin/x86_64-linux/kpsestat
+++ b/Master/bin/x86_64-linux/kpsestat
Binary files differ
diff --git a/Master/bin/x86_64-linux/kpsewhich b/Master/bin/x86_64-linux/kpsewhich
index a1ecd0c0ed0..905b64fafdb 100755
--- a/Master/bin/x86_64-linux/kpsewhich
+++ b/Master/bin/x86_64-linux/kpsewhich
Binary files differ
diff --git a/Master/bin/x86_64-linux/lacheck b/Master/bin/x86_64-linux/lacheck
index 289d6fc3012..ddc95219895 100755
--- a/Master/bin/x86_64-linux/lacheck
+++ b/Master/bin/x86_64-linux/lacheck
Binary files differ
diff --git a/Master/bin/x86_64-linux/luajittex b/Master/bin/x86_64-linux/luajittex
index 5fe637ecb4c..bc226140b8a 100755
--- a/Master/bin/x86_64-linux/luajittex
+++ b/Master/bin/x86_64-linux/luajittex
Binary files differ
diff --git a/Master/bin/x86_64-linux/luatex b/Master/bin/x86_64-linux/luatex
index 049e5e61613..09075b0eec0 100755
--- a/Master/bin/x86_64-linux/luatex
+++ b/Master/bin/x86_64-linux/luatex
Binary files differ
diff --git a/Master/bin/x86_64-linux/luatex53 b/Master/bin/x86_64-linux/luatex53
new file mode 100755
index 00000000000..197f1752534
--- /dev/null
+++ b/Master/bin/x86_64-linux/luatex53
Binary files differ
diff --git a/Master/bin/x86_64-linux/mag b/Master/bin/x86_64-linux/mag
index 2d0bd984fca..84cf5def131 100755
--- a/Master/bin/x86_64-linux/mag
+++ b/Master/bin/x86_64-linux/mag
Binary files differ
diff --git a/Master/bin/x86_64-linux/makeindex b/Master/bin/x86_64-linux/makeindex
index fcd21dbc9ee..d678724afa3 100755
--- a/Master/bin/x86_64-linux/makeindex
+++ b/Master/bin/x86_64-linux/makeindex
Binary files differ
diff --git a/Master/bin/x86_64-linux/makejvf b/Master/bin/x86_64-linux/makejvf
index 61717d15167..883136a9d9b 100755
--- a/Master/bin/x86_64-linux/makejvf
+++ b/Master/bin/x86_64-linux/makejvf
Binary files differ
diff --git a/Master/bin/x86_64-linux/mendex b/Master/bin/x86_64-linux/mendex
index 22aa10c0028..b470f3ddee3 100755
--- a/Master/bin/x86_64-linux/mendex
+++ b/Master/bin/x86_64-linux/mendex
Binary files differ
diff --git a/Master/bin/x86_64-linux/mf b/Master/bin/x86_64-linux/mf
index 9128104d5a5..ac9a0d920ba 100755
--- a/Master/bin/x86_64-linux/mf
+++ b/Master/bin/x86_64-linux/mf
Binary files differ
diff --git a/Master/bin/x86_64-linux/mf-nowin b/Master/bin/x86_64-linux/mf-nowin
index b3a2e8d9f88..9b89ad7ed7a 100755
--- a/Master/bin/x86_64-linux/mf-nowin
+++ b/Master/bin/x86_64-linux/mf-nowin
Binary files differ
diff --git a/Master/bin/x86_64-linux/mflua b/Master/bin/x86_64-linux/mflua
index aff0235a223..ceea3d6d163 100755
--- a/Master/bin/x86_64-linux/mflua
+++ b/Master/bin/x86_64-linux/mflua
Binary files differ
diff --git a/Master/bin/x86_64-linux/mfluajit b/Master/bin/x86_64-linux/mfluajit
index 3472bf50a06..044ad0322c2 100755
--- a/Master/bin/x86_64-linux/mfluajit
+++ b/Master/bin/x86_64-linux/mfluajit
Binary files differ
diff --git a/Master/bin/x86_64-linux/mft b/Master/bin/x86_64-linux/mft
index f26bce30e7f..ff5eea96e6a 100755
--- a/Master/bin/x86_64-linux/mft
+++ b/Master/bin/x86_64-linux/mft
Binary files differ
diff --git a/Master/bin/x86_64-linux/mktexlsr b/Master/bin/x86_64-linux/mktexlsr
index 8d4a38018f9..bd3eb50d6e4 100755
--- a/Master/bin/x86_64-linux/mktexlsr
+++ b/Master/bin/x86_64-linux/mktexlsr
@@ -73,7 +73,18 @@ if tty -s; then verbose=true; else verbose=false; fi
dry_run=false
trees=
-treefile="${TMPDIR-/tmp}/mktexlsrtrees$$.tmp"
+# initialize treefile by either mktemp or some random name
+# code taken from pdfjam and adjusted
+{
+ treefile=`
+ (umask 077 && mktemp "${TMPDIR-/tmp}/mktexlsrtrees.XXXXXXXXXX") 2>/dev/null
+ ` && test -n "$treefile" && test -f "$treefile"
+} || {
+ ## We'll use awk to make random number, for portability
+ random=`awk 'END { srand(); printf ("%d\n", rand()*1000000); }' /dev/null`
+ treefile="${TMPDIR-/tmp}/mktexlsrtrees$$.$random"
+} || exit $?
+
trap 'cd /; rm -f $treefile; test -z "$db_dir_tmp" || rm -rf "$db_dir_tmp";
exit' 0 1 2 3 7 13 15
diff --git a/Master/bin/x86_64-linux/mmafm b/Master/bin/x86_64-linux/mmafm
index 669de9fdf58..97b72076f49 100755
--- a/Master/bin/x86_64-linux/mmafm
+++ b/Master/bin/x86_64-linux/mmafm
Binary files differ
diff --git a/Master/bin/x86_64-linux/mmpfb b/Master/bin/x86_64-linux/mmpfb
index 5d7446538be..2bfcfc8ef46 100755
--- a/Master/bin/x86_64-linux/mmpfb
+++ b/Master/bin/x86_64-linux/mmpfb
Binary files differ
diff --git a/Master/bin/x86_64-linux/mpost b/Master/bin/x86_64-linux/mpost
index 9a1e32754fa..642b47b7929 100755
--- a/Master/bin/x86_64-linux/mpost
+++ b/Master/bin/x86_64-linux/mpost
Binary files differ
diff --git a/Master/bin/x86_64-linux/msxlint b/Master/bin/x86_64-linux/msxlint
index 7cc9549d659..6533a40bef3 100755
--- a/Master/bin/x86_64-linux/msxlint
+++ b/Master/bin/x86_64-linux/msxlint
Binary files differ
diff --git a/Master/bin/x86_64-linux/odvicopy b/Master/bin/x86_64-linux/odvicopy
index 9b953b9c514..77ff36f9eb9 100755
--- a/Master/bin/x86_64-linux/odvicopy
+++ b/Master/bin/x86_64-linux/odvicopy
Binary files differ
diff --git a/Master/bin/x86_64-linux/odvitype b/Master/bin/x86_64-linux/odvitype
index 9dac428dd67..0edf91a7158 100755
--- a/Master/bin/x86_64-linux/odvitype
+++ b/Master/bin/x86_64-linux/odvitype
Binary files differ
diff --git a/Master/bin/x86_64-linux/omfonts b/Master/bin/x86_64-linux/omfonts
index ac5eb8437ab..b53a912f2ef 100755
--- a/Master/bin/x86_64-linux/omfonts
+++ b/Master/bin/x86_64-linux/omfonts
Binary files differ
diff --git a/Master/bin/x86_64-linux/otangle b/Master/bin/x86_64-linux/otangle
index e71ae61e80c..10e0ca63f8c 100755
--- a/Master/bin/x86_64-linux/otangle
+++ b/Master/bin/x86_64-linux/otangle
Binary files differ
diff --git a/Master/bin/x86_64-linux/otfinfo b/Master/bin/x86_64-linux/otfinfo
index 4e7ce583956..986e8aa70d4 100755
--- a/Master/bin/x86_64-linux/otfinfo
+++ b/Master/bin/x86_64-linux/otfinfo
Binary files differ
diff --git a/Master/bin/x86_64-linux/otftotfm b/Master/bin/x86_64-linux/otftotfm
index a3aaa685091..0a0e35d987d 100755
--- a/Master/bin/x86_64-linux/otftotfm
+++ b/Master/bin/x86_64-linux/otftotfm
Binary files differ
diff --git a/Master/bin/x86_64-linux/otp2ocp b/Master/bin/x86_64-linux/otp2ocp
index 37b5b08f4c4..61ae5eea5b0 100755
--- a/Master/bin/x86_64-linux/otp2ocp
+++ b/Master/bin/x86_64-linux/otp2ocp
Binary files differ
diff --git a/Master/bin/x86_64-linux/outocp b/Master/bin/x86_64-linux/outocp
index ee9e0e54b97..1c25433da05 100755
--- a/Master/bin/x86_64-linux/outocp
+++ b/Master/bin/x86_64-linux/outocp
Binary files differ
diff --git a/Master/bin/x86_64-linux/patgen b/Master/bin/x86_64-linux/patgen
index 0c1d3e66185..41044c369c6 100755
--- a/Master/bin/x86_64-linux/patgen
+++ b/Master/bin/x86_64-linux/patgen
Binary files differ
diff --git a/Master/bin/x86_64-linux/pbibtex b/Master/bin/x86_64-linux/pbibtex
index 9ee5317217c..ac51523efc2 100755
--- a/Master/bin/x86_64-linux/pbibtex
+++ b/Master/bin/x86_64-linux/pbibtex
Binary files differ
diff --git a/Master/bin/x86_64-linux/pdfclose b/Master/bin/x86_64-linux/pdfclose
index 4b32df09e3d..8fc9acf80e4 100755
--- a/Master/bin/x86_64-linux/pdfclose
+++ b/Master/bin/x86_64-linux/pdfclose
Binary files differ
diff --git a/Master/bin/x86_64-linux/pdfopen b/Master/bin/x86_64-linux/pdfopen
index cc31bdfc943..d3b60811c61 100755
--- a/Master/bin/x86_64-linux/pdfopen
+++ b/Master/bin/x86_64-linux/pdfopen
Binary files differ
diff --git a/Master/bin/x86_64-linux/pdftex b/Master/bin/x86_64-linux/pdftex
index 539fa89235b..24465a60dc8 100755
--- a/Master/bin/x86_64-linux/pdftex
+++ b/Master/bin/x86_64-linux/pdftex
Binary files differ
diff --git a/Master/bin/x86_64-linux/pdftosrc b/Master/bin/x86_64-linux/pdftosrc
index 71712034d33..3737f301393 100755
--- a/Master/bin/x86_64-linux/pdftosrc
+++ b/Master/bin/x86_64-linux/pdftosrc
Binary files differ
diff --git a/Master/bin/x86_64-linux/pdvitype b/Master/bin/x86_64-linux/pdvitype
index d3f15fb5ab1..c926431d027 100755
--- a/Master/bin/x86_64-linux/pdvitype
+++ b/Master/bin/x86_64-linux/pdvitype
Binary files differ
diff --git a/Master/bin/x86_64-linux/pfb2pfa b/Master/bin/x86_64-linux/pfb2pfa
index 0956aedc075..37f128ccef8 100755
--- a/Master/bin/x86_64-linux/pfb2pfa
+++ b/Master/bin/x86_64-linux/pfb2pfa
Binary files differ
diff --git a/Master/bin/x86_64-linux/pk2bm b/Master/bin/x86_64-linux/pk2bm
index a94d7c6501c..923c68a2743 100755
--- a/Master/bin/x86_64-linux/pk2bm
+++ b/Master/bin/x86_64-linux/pk2bm
Binary files differ
diff --git a/Master/bin/x86_64-linux/pktogf b/Master/bin/x86_64-linux/pktogf
index b037d17bf8b..ae48301c525 100755
--- a/Master/bin/x86_64-linux/pktogf
+++ b/Master/bin/x86_64-linux/pktogf
Binary files differ
diff --git a/Master/bin/x86_64-linux/pktype b/Master/bin/x86_64-linux/pktype
index 0b3b3879352..b3e733a01b1 100755
--- a/Master/bin/x86_64-linux/pktype
+++ b/Master/bin/x86_64-linux/pktype
Binary files differ
diff --git a/Master/bin/x86_64-linux/pltotf b/Master/bin/x86_64-linux/pltotf
index 7c2a59b0ca1..5b1e042cad2 100755
--- a/Master/bin/x86_64-linux/pltotf
+++ b/Master/bin/x86_64-linux/pltotf
Binary files differ
diff --git a/Master/bin/x86_64-linux/pmpost b/Master/bin/x86_64-linux/pmpost
index 85602d3fb97..ff53f9e8bb5 100755
--- a/Master/bin/x86_64-linux/pmpost
+++ b/Master/bin/x86_64-linux/pmpost
Binary files differ
diff --git a/Master/bin/x86_64-linux/pmxab b/Master/bin/x86_64-linux/pmxab
index 7a7c04ad773..c81a6052cf7 100755
--- a/Master/bin/x86_64-linux/pmxab
+++ b/Master/bin/x86_64-linux/pmxab
Binary files differ
diff --git a/Master/bin/x86_64-linux/pooltype b/Master/bin/x86_64-linux/pooltype
index 390df3f63fe..3de0e86a660 100755
--- a/Master/bin/x86_64-linux/pooltype
+++ b/Master/bin/x86_64-linux/pooltype
Binary files differ
diff --git a/Master/bin/x86_64-linux/ppltotf b/Master/bin/x86_64-linux/ppltotf
index 7cdc979e843..606257934e4 100755
--- a/Master/bin/x86_64-linux/ppltotf
+++ b/Master/bin/x86_64-linux/ppltotf
Binary files differ
diff --git a/Master/bin/x86_64-linux/prepmx b/Master/bin/x86_64-linux/prepmx
index 0c157d254de..547f65c94f7 100755
--- a/Master/bin/x86_64-linux/prepmx
+++ b/Master/bin/x86_64-linux/prepmx
Binary files differ
diff --git a/Master/bin/x86_64-linux/ps2pk b/Master/bin/x86_64-linux/ps2pk
index cfc6a304b80..f167878a145 100755
--- a/Master/bin/x86_64-linux/ps2pk
+++ b/Master/bin/x86_64-linux/ps2pk
Binary files differ
diff --git a/Master/bin/x86_64-linux/psbook b/Master/bin/x86_64-linux/psbook
index ef103bbb630..3de9698e684 100755
--- a/Master/bin/x86_64-linux/psbook
+++ b/Master/bin/x86_64-linux/psbook
Binary files differ
diff --git a/Master/bin/x86_64-linux/psnup b/Master/bin/x86_64-linux/psnup
index e2871607d18..1adc8154a3e 100755
--- a/Master/bin/x86_64-linux/psnup
+++ b/Master/bin/x86_64-linux/psnup
Binary files differ
diff --git a/Master/bin/x86_64-linux/psresize b/Master/bin/x86_64-linux/psresize
index 054b41a67e3..f6bf7d6ea7a 100755
--- a/Master/bin/x86_64-linux/psresize
+++ b/Master/bin/x86_64-linux/psresize
Binary files differ
diff --git a/Master/bin/x86_64-linux/psselect b/Master/bin/x86_64-linux/psselect
index 7ff9925efe8..ad7a1c807ab 100755
--- a/Master/bin/x86_64-linux/psselect
+++ b/Master/bin/x86_64-linux/psselect
Binary files differ
diff --git a/Master/bin/x86_64-linux/pstops b/Master/bin/x86_64-linux/pstops
index 0eedad8cc24..701dd0af5e4 100755
--- a/Master/bin/x86_64-linux/pstops
+++ b/Master/bin/x86_64-linux/pstops
Binary files differ
diff --git a/Master/bin/x86_64-linux/ptex b/Master/bin/x86_64-linux/ptex
index f2d4135a5d1..7defed21b62 100755
--- a/Master/bin/x86_64-linux/ptex
+++ b/Master/bin/x86_64-linux/ptex
Binary files differ
diff --git a/Master/bin/x86_64-linux/ptftopl b/Master/bin/x86_64-linux/ptftopl
index d3f8e30a6bc..d244db161f9 100755
--- a/Master/bin/x86_64-linux/ptftopl
+++ b/Master/bin/x86_64-linux/ptftopl
Binary files differ
diff --git a/Master/bin/x86_64-linux/scor2prt b/Master/bin/x86_64-linux/scor2prt
index da38d87fa9f..61929f640ee 100755
--- a/Master/bin/x86_64-linux/scor2prt
+++ b/Master/bin/x86_64-linux/scor2prt
Binary files differ
diff --git a/Master/bin/x86_64-linux/sjisconv b/Master/bin/x86_64-linux/sjisconv
index c0d1403a177..17ccb96d410 100755
--- a/Master/bin/x86_64-linux/sjisconv
+++ b/Master/bin/x86_64-linux/sjisconv
Binary files differ
diff --git a/Master/bin/x86_64-linux/synctex b/Master/bin/x86_64-linux/synctex
index c6b3d32a57d..612cb1c0d13 100755
--- a/Master/bin/x86_64-linux/synctex
+++ b/Master/bin/x86_64-linux/synctex
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1ascii b/Master/bin/x86_64-linux/t1ascii
index 50552b2f809..193a08a9a18 100755
--- a/Master/bin/x86_64-linux/t1ascii
+++ b/Master/bin/x86_64-linux/t1ascii
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1asm b/Master/bin/x86_64-linux/t1asm
index bfc09ec1f72..604913c5d1b 100755
--- a/Master/bin/x86_64-linux/t1asm
+++ b/Master/bin/x86_64-linux/t1asm
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1binary b/Master/bin/x86_64-linux/t1binary
index 800b4db0940..33cc7e41d60 100755
--- a/Master/bin/x86_64-linux/t1binary
+++ b/Master/bin/x86_64-linux/t1binary
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1disasm b/Master/bin/x86_64-linux/t1disasm
index a993d8aeae2..39794acad95 100755
--- a/Master/bin/x86_64-linux/t1disasm
+++ b/Master/bin/x86_64-linux/t1disasm
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1dotlessj b/Master/bin/x86_64-linux/t1dotlessj
index c895204233a..d2d9abd71f2 100755
--- a/Master/bin/x86_64-linux/t1dotlessj
+++ b/Master/bin/x86_64-linux/t1dotlessj
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1lint b/Master/bin/x86_64-linux/t1lint
index 3a4ca8e2895..4ea6fecaa67 100755
--- a/Master/bin/x86_64-linux/t1lint
+++ b/Master/bin/x86_64-linux/t1lint
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1mac b/Master/bin/x86_64-linux/t1mac
index d6d8e152df3..08a5b323adb 100755
--- a/Master/bin/x86_64-linux/t1mac
+++ b/Master/bin/x86_64-linux/t1mac
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1rawafm b/Master/bin/x86_64-linux/t1rawafm
index 4f43e02bda6..b80dcd78442 100755
--- a/Master/bin/x86_64-linux/t1rawafm
+++ b/Master/bin/x86_64-linux/t1rawafm
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1reencode b/Master/bin/x86_64-linux/t1reencode
index 25bcdd30bee..469aeccf390 100755
--- a/Master/bin/x86_64-linux/t1reencode
+++ b/Master/bin/x86_64-linux/t1reencode
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1testpage b/Master/bin/x86_64-linux/t1testpage
index 4120c4fda7a..d7d91d08c0b 100755
--- a/Master/bin/x86_64-linux/t1testpage
+++ b/Master/bin/x86_64-linux/t1testpage
Binary files differ
diff --git a/Master/bin/x86_64-linux/t1unmac b/Master/bin/x86_64-linux/t1unmac
index e16f835f375..d9ca9badb5d 100755
--- a/Master/bin/x86_64-linux/t1unmac
+++ b/Master/bin/x86_64-linux/t1unmac
Binary files differ
diff --git a/Master/bin/x86_64-linux/t4ht b/Master/bin/x86_64-linux/t4ht
index 2b756a73b7f..ff7e477797d 100755
--- a/Master/bin/x86_64-linux/t4ht
+++ b/Master/bin/x86_64-linux/t4ht
Binary files differ
diff --git a/Master/bin/x86_64-linux/tangle b/Master/bin/x86_64-linux/tangle
index 1cad3897108..5e77c600642 100755
--- a/Master/bin/x86_64-linux/tangle
+++ b/Master/bin/x86_64-linux/tangle
Binary files differ
diff --git a/Master/bin/x86_64-linux/teckit_compile b/Master/bin/x86_64-linux/teckit_compile
index e9ee28af8f0..fd34f36da10 100755
--- a/Master/bin/x86_64-linux/teckit_compile
+++ b/Master/bin/x86_64-linux/teckit_compile
Binary files differ
diff --git a/Master/bin/x86_64-linux/tex b/Master/bin/x86_64-linux/tex
index 5143c9c9671..b1b49ffd32e 100755
--- a/Master/bin/x86_64-linux/tex
+++ b/Master/bin/x86_64-linux/tex
Binary files differ
diff --git a/Master/bin/x86_64-linux/tex2aspc b/Master/bin/x86_64-linux/tex2aspc
new file mode 100755
index 00000000000..972019ff328
--- /dev/null
+++ b/Master/bin/x86_64-linux/tex2aspc
Binary files differ
diff --git a/Master/bin/x86_64-linux/tex4ht b/Master/bin/x86_64-linux/tex4ht
index 6fa60806972..ee1d7e26deb 100755
--- a/Master/bin/x86_64-linux/tex4ht
+++ b/Master/bin/x86_64-linux/tex4ht
Binary files differ
diff --git a/Master/bin/x86_64-linux/texlua53 b/Master/bin/x86_64-linux/texlua53
new file mode 120000
index 00000000000..f0f9550b720
--- /dev/null
+++ b/Master/bin/x86_64-linux/texlua53
@@ -0,0 +1 @@
+luatex53 \ No newline at end of file
diff --git a/Master/bin/x86_64-linux/texlua53c b/Master/bin/x86_64-linux/texlua53c
new file mode 120000
index 00000000000..f0f9550b720
--- /dev/null
+++ b/Master/bin/x86_64-linux/texlua53c
@@ -0,0 +1 @@
+luatex53 \ No newline at end of file
diff --git a/Master/bin/x86_64-linux/tftopl b/Master/bin/x86_64-linux/tftopl
index 0310abc6ce7..a9a4d122b86 100755
--- a/Master/bin/x86_64-linux/tftopl
+++ b/Master/bin/x86_64-linux/tftopl
Binary files differ
diff --git a/Master/bin/x86_64-linux/tie b/Master/bin/x86_64-linux/tie
index 748adbd3e3c..55f8eaa6a37 100755
--- a/Master/bin/x86_64-linux/tie
+++ b/Master/bin/x86_64-linux/tie
Binary files differ
diff --git a/Master/bin/x86_64-linux/tlcockpit b/Master/bin/x86_64-linux/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/x86_64-linux/tlcockpit
+++ b/Master/bin/x86_64-linux/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/bin/x86_64-linux/ttf2afm b/Master/bin/x86_64-linux/ttf2afm
index d4f7cb9a16e..1d78e84c9a3 100755
--- a/Master/bin/x86_64-linux/ttf2afm
+++ b/Master/bin/x86_64-linux/ttf2afm
Binary files differ
diff --git a/Master/bin/x86_64-linux/ttf2pk b/Master/bin/x86_64-linux/ttf2pk
index 0d3ff80abae..5739fd140b3 100755
--- a/Master/bin/x86_64-linux/ttf2pk
+++ b/Master/bin/x86_64-linux/ttf2pk
Binary files differ
diff --git a/Master/bin/x86_64-linux/ttf2tfm b/Master/bin/x86_64-linux/ttf2tfm
index 324be170b43..69292a8199c 100755
--- a/Master/bin/x86_64-linux/ttf2tfm
+++ b/Master/bin/x86_64-linux/ttf2tfm
Binary files differ
diff --git a/Master/bin/x86_64-linux/ttfdump b/Master/bin/x86_64-linux/ttfdump
index f68507576e7..6a42f8b7130 100755
--- a/Master/bin/x86_64-linux/ttfdump
+++ b/Master/bin/x86_64-linux/ttfdump
Binary files differ
diff --git a/Master/bin/x86_64-linux/ttftotype42 b/Master/bin/x86_64-linux/ttftotype42
index 410b0f0536e..2de90d3eabd 100755
--- a/Master/bin/x86_64-linux/ttftotype42
+++ b/Master/bin/x86_64-linux/ttftotype42
Binary files differ
diff --git a/Master/bin/x86_64-linux/upbibtex b/Master/bin/x86_64-linux/upbibtex
index b0a14e3477a..79f1afbbd0e 100755
--- a/Master/bin/x86_64-linux/upbibtex
+++ b/Master/bin/x86_64-linux/upbibtex
Binary files differ
diff --git a/Master/bin/x86_64-linux/updvitype b/Master/bin/x86_64-linux/updvitype
index ad2d3450eb8..0b3a9b9b267 100755
--- a/Master/bin/x86_64-linux/updvitype
+++ b/Master/bin/x86_64-linux/updvitype
Binary files differ
diff --git a/Master/bin/x86_64-linux/upmendex b/Master/bin/x86_64-linux/upmendex
index 14491643cdb..6a914d60c13 100755
--- a/Master/bin/x86_64-linux/upmendex
+++ b/Master/bin/x86_64-linux/upmendex
Binary files differ
diff --git a/Master/bin/x86_64-linux/upmpost b/Master/bin/x86_64-linux/upmpost
index d97f4479c8a..cc2b512eba9 100755
--- a/Master/bin/x86_64-linux/upmpost
+++ b/Master/bin/x86_64-linux/upmpost
Binary files differ
diff --git a/Master/bin/x86_64-linux/uppltotf b/Master/bin/x86_64-linux/uppltotf
index 35b2f29aa2f..7ca5fc2b1f3 100755
--- a/Master/bin/x86_64-linux/uppltotf
+++ b/Master/bin/x86_64-linux/uppltotf
Binary files differ
diff --git a/Master/bin/x86_64-linux/uptex b/Master/bin/x86_64-linux/uptex
index ace873cc456..5d01a07fd2b 100755
--- a/Master/bin/x86_64-linux/uptex
+++ b/Master/bin/x86_64-linux/uptex
Binary files differ
diff --git a/Master/bin/x86_64-linux/uptftopl b/Master/bin/x86_64-linux/uptftopl
index b5b922de08c..4478bc7eb4e 100755
--- a/Master/bin/x86_64-linux/uptftopl
+++ b/Master/bin/x86_64-linux/uptftopl
Binary files differ
diff --git a/Master/bin/x86_64-linux/vftovp b/Master/bin/x86_64-linux/vftovp
index cb9bd8e0fbd..8e73d8e6024 100755
--- a/Master/bin/x86_64-linux/vftovp
+++ b/Master/bin/x86_64-linux/vftovp
Binary files differ
diff --git a/Master/bin/x86_64-linux/vlna b/Master/bin/x86_64-linux/vlna
index 0c1e527b2b7..77a2142b7d2 100755
--- a/Master/bin/x86_64-linux/vlna
+++ b/Master/bin/x86_64-linux/vlna
Binary files differ
diff --git a/Master/bin/x86_64-linux/vptovf b/Master/bin/x86_64-linux/vptovf
index eed672a6d42..c4944934e75 100755
--- a/Master/bin/x86_64-linux/vptovf
+++ b/Master/bin/x86_64-linux/vptovf
Binary files differ
diff --git a/Master/bin/x86_64-linux/weave b/Master/bin/x86_64-linux/weave
index cf35b50df5a..d33f887ccb0 100755
--- a/Master/bin/x86_64-linux/weave
+++ b/Master/bin/x86_64-linux/weave
Binary files differ
diff --git a/Master/bin/x86_64-linux/wofm2opl b/Master/bin/x86_64-linux/wofm2opl
index fa3d3328c3a..3331548fb14 100755
--- a/Master/bin/x86_64-linux/wofm2opl
+++ b/Master/bin/x86_64-linux/wofm2opl
Binary files differ
diff --git a/Master/bin/x86_64-linux/wopl2ofm b/Master/bin/x86_64-linux/wopl2ofm
index 8d4d6090713..56ce12e678e 100755
--- a/Master/bin/x86_64-linux/wopl2ofm
+++ b/Master/bin/x86_64-linux/wopl2ofm
Binary files differ
diff --git a/Master/bin/x86_64-linux/wovf2ovp b/Master/bin/x86_64-linux/wovf2ovp
index 7bb17cf2202..61cbdb29095 100755
--- a/Master/bin/x86_64-linux/wovf2ovp
+++ b/Master/bin/x86_64-linux/wovf2ovp
Binary files differ
diff --git a/Master/bin/x86_64-linux/wovp2ovf b/Master/bin/x86_64-linux/wovp2ovf
index 88812f293f8..6c36cbf6a63 100755
--- a/Master/bin/x86_64-linux/wovp2ovf
+++ b/Master/bin/x86_64-linux/wovp2ovf
Binary files differ
diff --git a/Master/bin/x86_64-linux/xdvi-xaw b/Master/bin/x86_64-linux/xdvi-xaw
index 9377840950b..44ec2599b89 100755
--- a/Master/bin/x86_64-linux/xdvi-xaw
+++ b/Master/bin/x86_64-linux/xdvi-xaw
Binary files differ
diff --git a/Master/bin/x86_64-linux/xdvipdfmx b/Master/bin/x86_64-linux/xdvipdfmx
index 874c0c6a58a..99a35bd33ff 100755
--- a/Master/bin/x86_64-linux/xdvipdfmx
+++ b/Master/bin/x86_64-linux/xdvipdfmx
Binary files differ
diff --git a/Master/bin/x86_64-linux/xetex b/Master/bin/x86_64-linux/xetex
index 63612424257..d9be7292924 100755
--- a/Master/bin/x86_64-linux/xetex
+++ b/Master/bin/x86_64-linux/xetex
Binary files differ
diff --git a/Master/bin/x86_64-solaris/tlcockpit b/Master/bin/x86_64-solaris/tlcockpit
index e021db717cc..2e45105f84c 120000
--- a/Master/bin/x86_64-solaris/tlcockpit
+++ b/Master/bin/x86_64-solaris/tlcockpit
@@ -1 +1 @@
-../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh \ No newline at end of file
+../../texmf-dist/scripts/tlcockpit/tlcockpit.sh \ No newline at end of file
diff --git a/Master/release-texlive.txt b/Master/release-texlive.txt
index 9c1f3158dc7..59dc563c686 100644
--- a/Master/release-texlive.txt
+++ b/Master/release-texlive.txt
@@ -1,4 +1,4 @@
-TeX Live (http://tug.org/texlive) version 2017
+TeX Live (http://tug.org/texlive) version 2018
This file is public domain. It is read by install-tl --version,
tlmgr --version, and texconfig conf, and a final line appended with
diff --git a/Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh b/Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh
new file mode 100755
index 00000000000..734ffe54c3c
--- /dev/null
+++ b/Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+kernel=`uname -s`
+if test "${kernel#*CYGWIN}" != "$kernel"
+then
+ jarpath=`cygpath -w $(kpsewhich --progname=tlcockpit --format=texmfscripts tlcockpit.jar)`
+else
+ jarpath=`kpsewhich --progname=tlcockpit --format=texmfscripts tlcockpit.jar`
+fi
+exec java -jar "$jarpath" "$@"
diff --git a/Master/texmf-dist/web2c/texmf.cnf b/Master/texmf-dist/web2c/texmf.cnf
index eae5cb0fb31..83cbc5d3f8f 100644
--- a/Master/texmf-dist/web2c/texmf.cnf
+++ b/Master/texmf-dist/web2c/texmf.cnf
@@ -4,8 +4,8 @@
% If you modify this original file, YOUR CHANGES WILL BE LOST when it is
% updated. Instead, put your changes -- and only your changes, not an
% entire copy! -- in ../../texmf.cnf. That is, if this file is
-% installed in /some/path/to/texlive/2017/texmf-dist/web2c/texmf.cnf,
-% add your custom settings to /some/path/to/texlive/2017/texmf.cnf.
+% installed in /some/path/to/texlive/2018/texmf-dist/web2c/texmf.cnf,
+% add your custom settings to /some/path/to/texlive/2018/texmf.cnf.
%
% What follows is a super-summary of what this .cnf file can
% contain. Please read the Kpathsea manual for more information.
@@ -83,10 +83,10 @@ TEXMFSYSCONFIG = $TEXMFROOT/texmf-config
TEXMFHOME = ~/texmf
% TEXMFVAR, where texconfig/updmap/fmtutil store cached runtime data.
-TEXMFVAR = ~/.texlive2017/texmf-var
+TEXMFVAR = ~/.texlive2018/texmf-var
% TEXMFCONFIG, where texconfig/updmap/fmtutil store configuration data.
-TEXMFCONFIG = ~/.texlive2017/texmf-config
+TEXMFCONFIG = ~/.texlive2018/texmf-config
% This is the value manipulated by tlmgr's auxtrees subcommand in the
% root texmf.cnf. Kpathsea warns about a literally empty string for a
@@ -689,6 +689,13 @@ TEX.pmpost = eptex
% given as command line option or environment variable.
BIBTEX_CSFILE = 88591lat.csf
+% This variable is specific to Unix, to fall back to case-insensitive
+% search in non-system directories if there is no exact match. It is
+% enabled by default in texmf.cnf, but not enabled by default at
+% compile-time.
+%
+texmf_casefold_search = 1
+
% This variable is specific to Windows. It must be set to 0 or 1. The
% default is 0. Setting it to 1 tells the Windows script wrappers to
% use an already installed Perl interpreter if one is found on the
diff --git a/Master/texmf-dist/web2c/texmfcnf.lua b/Master/texmf-dist/web2c/texmfcnf.lua
index c8744aa90fc..95bb2bc86d6 100644
--- a/Master/texmf-dist/web2c/texmfcnf.lua
+++ b/Master/texmf-dist/web2c/texmfcnf.lua
@@ -45,13 +45,13 @@ return {
-- only used for FONTCONFIG_PATH & TEXMFCACHE in TeX Live
TEXMFSYSVAR = "selfautoparent:texmf-var",
- TEXMFVAR = "home:.texlive2017/texmf-var",
+ TEXMFVAR = "home:.texlive2018/texmf-var",
-- We have only one cache path but there can be more. The first writable one
-- will be chosen but there can be more readable paths.
TEXMFCACHE = "$TEXMFSYSVAR;$TEXMFVAR",
- TEXMFCONFIG = "home:.texlive2017/texmf-config",
+ TEXMFCONFIG = "home:.texlive2018/texmf-config",
-- I don't like this texmf under home and texmf-home would make more
-- sense. One never knows what installers put under texmf anywhere and
diff --git a/Master/tlpkg/TeXLive/TLConfig.pm b/Master/tlpkg/TeXLive/TLConfig.pm
index c8873ede054..f5efd41178c 100644
--- a/Master/tlpkg/TeXLive/TLConfig.pm
+++ b/Master/tlpkg/TeXLive/TLConfig.pm
@@ -52,7 +52,7 @@ BEGIN {
# the year of our release, will be used in the location of the
# network packages, and in menu names, and other places.
-$ReleaseYear = 2017;
+$ReleaseYear = 2018;
# users can upgrade from this year to the current year; might be the
# same as the release year, or any number of releases earlier.
diff --git a/Master/tlpkg/bin/tl-update-bindir b/Master/tlpkg/bin/tl-update-bindir
index 061c384f768..cf72d798fd8 100755
--- a/Master/tlpkg/bin/tl-update-bindir
+++ b/Master/tlpkg/bin/tl-update-bindir
@@ -184,7 +184,9 @@ for tlplat in $tlplats; do
$grab http://dl.contextgarden.net/build/texlive/$tlplat.tar.xz;;
x86_64-linux)
# local: default_bin_loc=/home/texlive/karl/Build/source/inst/bin/x86_64-pc-linux-gnu;;
- ;; # updated by Norbert.
+ default_bin_loc=$download_loc
+ $grab http://www.preining.info/x86_64-linux-svn46780.tar.gz
+ ;;
x86_64-solaris)
default_bin_loc=$download_loc
$grab http://dl.contextgarden.net/build/texlive/$tlplat.tar.xz;;
diff --git a/Master/tlpkg/bin/tl-update-tlnet b/Master/tlpkg/bin/tl-update-tlnet
index 160c0cc19f7..4727b108cb3 100755
--- a/Master/tlpkg/bin/tl-update-tlnet
+++ b/Master/tlpkg/bin/tl-update-tlnet
@@ -1,5 +1,5 @@
#!/bin/sh -e
-# Copyright 2008-2017 Norbert Preining
+# Copyright 2008-2018 Norbert Preining
# This file is licensed under the GNU General Public License version 2
# or any later version.
#
@@ -9,7 +9,7 @@ vc_id='$Id$'
unset CDPATH
unset LS_COLORS
-yyyy=2017
+yyyy=2018
check_consistency=true
chicken=false
@@ -133,7 +133,7 @@ tlpdbopt_install_srcfiles 1
tlpdbopt_create_formats 1
instopt_letter 0
instopt_adjustpath 0
-instopt_adjustrepo 1
+instopt_adjustrepo 0
" >texlive.profile
# silence envvar warnings and the welcome message.
diff --git a/Master/tlpkg/doc/releng.txt b/Master/tlpkg/doc/releng.txt
index 087028a8969..36315796367 100644
--- a/Master/tlpkg/doc/releng.txt
+++ b/Master/tlpkg/doc/releng.txt
@@ -56,36 +56,35 @@ To stop updating of certain packages before the general freeze:
II. Building pretest instead of regular release.
0. On the day of the last tlnet update,
- Set frozen/1 in TLConfig.pm.
+ Set frozen=>1 in TLConfig.pm.
Freeze should happen at that night's rebuild.
1. Then, the next day, start building tlpretest:
- Reset frozen to 0 in TLConfig.pm.`;
+ Reset frozen=>0 in TLConfig.pm.
-1a. And preserve final tlnet of current release:
+1a. Then preserve final tlnet of current release YYYY:
cd /home/ftp/texlive/tlnet
cp -ar ../tlnet /home/ftp/historic/systems/texlive/YYYY/tlnet-final
1b. Set up tlpretest:
Update /home/ftp/texlive/tlpretest/README.
-Empty tlpretest otherwise and then touch texlive.tlpdb;
-then --recreate in cron.tl should suffice.
+Empty tlpretest except for that README and 00_TIME.txt (used for mirmon).
-2. Then switch to pretest in cron.tl:
+2. Prepare for pretest in cron.tl:
critical=--critical # push tlcritical
pretest=--pretest # update tlpretest, not tlnet (if not frozen)
net_frozen=false # update tlnet|tlpretest (per $pretest)
(tlcritical will remain getting updated daily, even though it doesn't
work with tlnet any more. That's ok. Or disable if you prefer.)
-First build happens below.
+First build happens below, after many more changes; don't start it yet.
-3. option adjustrepo 0 in tl-update-tlnet, since pretest shouldn't go
+3. option adjustrepo 0 in tl-update-tlnet, since pretest users shouldn't go
to CTAN for updates.
4. After setting up for pretest (not before), basic updates for release year:
Master/.mkisofsrc
Master/release-texlive.txt
-Master/tlpkg/TeXLive/TLConfig.pm (including MinRelease)
+Master/tlpkg/TeXLive/TLConfig.pm -- $ReleaseYear and think about $MinRelease
Master/tlpkg/bin/tl-update-tlnet
Master/tlpkg/bin/tl-update-images
Master/tlpkg/installer/texlive.png (tlpkg/doc/texlive-installer-graphic.xcf)
@@ -93,31 +92,42 @@ Master/texmf-dist/web2c/texmfcnf.lua
Master/texmf-dist/web2c/texmf.cnf # from Build/.../kpathsea
5. Ensure version numbers in sources are updated; see list above.
-Then commit new binaries with tl-update-bindir.
+Then install new binaries with tl-update-bindir.
+Add new executables to appropriate .tlpsrc files (likewise removals).
+Add new scripts to linked_scripts if not already handled.
-6. After committing, run tex \\end to check that mktexfmt works.
+6. Run tex \\end to check that mktexfmt works.
Also run fmtutil --all to check that all formats build, no config file
-problems. Then, so things will get redone later as another check:
+problems. Ensure that web2c/texmf.cnf is updated for the current year
+(per above). Then, so things will get redone later as another check:
rm -rf ~/.texlive`date +%Y` # the new one
7. Check for Build-maintained updates to config files, etc.
(and might have to merge back if Master was mistakenly updated):
diff -ru0 --exclude=man --exclude=info \
Build/source/inst/texmf-dist Master/texmf-dist
-for p in *conv hbf2gf; do cp /home/ftp/tex-archive/language/chinese/CJK/cjk-4.8.4/doc/pdf/$p.pdf $p; done
-8. Now, try a first update of tlpretest:
+7a. If new cjk release:
+cd Master/texmf-dist/doc
+for p in *conv hbf2gf; do cp /home/ftp/tex-archive/language/chinese/CJK/cjk-X.Y.Z/doc/pdf/$p.pdf $p; done
+
+8. Now, finally, try a first update of tlpretest:
force_rebuild=true cron.tl
This will fail because pretest is not set up, but that's ok; the idea is
to check the output and ensure all is as basically ok.
-9. After that trial build, set
+8a. svn commit all the above.
+
+9. After that trial build looks ok, set in cron.tl:
recreate=--recreate # just once! to get catalogue updates, and again:
- mkdir /home/ftp/texlive/tlpretest/tlpkg
- touch !$/texlive.tlpdb
- force_rebuild=true cron.tl
+ And do:
+mkdir /home/ftp/texlive/tlpretest/tlpkg
+touch !$/texlive.tlpdb
+force_rebuild=true cron.tl
+
+10. After first rebuild success, undo --recreate and proceed normally.
-A. After tlnet freeze:
+A. At some point, after tlnet freeze:
Run tl-update-linked-scripts for consistency.
In Master/tlpkg, update bundled Windows programs as needed:
dviout texworks tlgs tlperl tlpsv
diff --git a/Master/tlpkg/tlpsrc/autosp.tlpsrc b/Master/tlpkg/tlpsrc/autosp.tlpsrc
index dca338c719c..a37430cb26d 100644
--- a/Master/tlpkg/tlpsrc/autosp.tlpsrc
+++ b/Master/tlpkg/tlpsrc/autosp.tlpsrc
@@ -1 +1,2 @@
binpattern f bin/${ARCH}/${PKGNAME}
+binpattern f bin/${ARCH}/tex2aspc
diff --git a/Master/tlpkg/tlpsrc/axodraw2.tlpsrc b/Master/tlpkg/tlpsrc/axodraw2.tlpsrc
index e69de29bb2d..b5a74907444 100644
--- a/Master/tlpkg/tlpsrc/axodraw2.tlpsrc
+++ b/Master/tlpkg/tlpsrc/axodraw2.tlpsrc
@@ -0,0 +1 @@
+binpattern f bin/${ARCH}/axohelp
diff --git a/Master/tlpkg/tlpsrc/luatex.tlpsrc b/Master/tlpkg/tlpsrc/luatex.tlpsrc
index 71fc396881a..d28a45a7867 100644
--- a/Master/tlpkg/tlpsrc/luatex.tlpsrc
+++ b/Master/tlpkg/tlpsrc/luatex.tlpsrc
@@ -30,6 +30,11 @@ binpattern f bin/${ARCH}/luatex
binpattern f bin/${ARCH}/texlua
binpattern f bin/${ARCH}/texluac
#
+# temp for tl2017, to make binaries available for manual installation.
+binpattern f bin/${ARCH}/luatex53
+binpattern f bin/${ARCH}/texlua53
+binpattern f bin/${ARCH}/texlua53c
+#
binpattern f/i386-cygwin bin/i386-cygwin/cygtexlua*.dll
binpattern f/x86_64-cygwin bin/x86_64-cygwin/cygtexlua*.dll
#