From be3df25db62116ef060b36ae89fd2c3d41da4d7d Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 3 Mar 2018 18:29:03 +0000 Subject: tl18 pretest initial setup git-svn-id: svn://tug.org/texlive/trunk@46798 c570f23f-e606-0410-a88d-b1316a301751 --- .../source/texk/texlive/linked_scripts/Makefile.am | 6 +- .../source/texk/texlive/linked_scripts/Makefile.in | 6 +- .../texlive/linked_scripts/tlcockpit/tlcockpit.sh | 10 + .../texlive/linked_scripts/tlshell/tlshell.tcl | 2136 ++++++++++++++++++++ Master/.mkisofsrc | 2 +- Master/bin/aarch64-linux/tlcockpit | 2 +- Master/bin/amd64-freebsd/tlcockpit | 2 +- Master/bin/amd64-netbsd/tlcockpit | 2 +- Master/bin/armel-linux/tlcockpit | 2 +- Master/bin/armhf-linux/tlcockpit | 2 +- Master/bin/i386-cygwin/tlcockpit | 2 +- Master/bin/i386-darwin/tlcockpit | 2 +- Master/bin/i386-freebsd/tlcockpit | 2 +- Master/bin/i386-linux/tlcockpit | 2 +- Master/bin/i386-netbsd/tlcockpit | 2 +- Master/bin/i386-solaris/tlcockpit | 2 +- Master/bin/powerpc-darwin/tlcockpit | 2 +- Master/bin/powerpc-linux/tlcockpit | 2 +- Master/bin/sparc-solaris/tlcockpit | 2 +- Master/bin/x86_64-cygwin/tlcockpit | 2 +- Master/bin/x86_64-darwin/tlcockpit | 2 +- Master/bin/x86_64-darwinlegacy/tlcockpit | 2 +- Master/bin/x86_64-linux/afm2pl | Bin 93728 -> 97928 bytes Master/bin/x86_64-linux/afm2tfm | Bin 98368 -> 104520 bytes Master/bin/x86_64-linux/aleph | Bin 554816 -> 558008 bytes Master/bin/x86_64-linux/asy | Bin 4199560 -> 3986040 bytes Master/bin/x86_64-linux/autosp | Bin 39888 -> 36288 bytes Master/bin/x86_64-linux/axohelp | Bin 0 -> 62368 bytes Master/bin/x86_64-linux/bbox | Bin 9240 -> 9064 bytes Master/bin/x86_64-linux/bg5conv | Bin 5016 -> 5064 bytes Master/bin/x86_64-linux/bibtex | Bin 163104 -> 167304 bytes Master/bin/x86_64-linux/bibtex8 | Bin 192320 -> 193640 bytes Master/bin/x86_64-linux/bibtexu | Bin 19521704 -> 19932384 bytes Master/bin/x86_64-linux/cef5conv | Bin 6800 -> 6816 bytes Master/bin/x86_64-linux/cefconv | Bin 6800 -> 6816 bytes Master/bin/x86_64-linux/cefsconv | Bin 6800 -> 6816 bytes Master/bin/x86_64-linux/cfftot1 | Bin 422560 -> 425840 bytes Master/bin/x86_64-linux/chktex | Bin 137760 -> 135480 bytes Master/bin/x86_64-linux/ctangle | Bin 101904 -> 105976 bytes Master/bin/x86_64-linux/ctie | Bin 81152 -> 85320 bytes Master/bin/x86_64-linux/cweave | Bin 138800 -> 143032 bytes Master/bin/x86_64-linux/detex | Bin 105824 -> 113832 bytes Master/bin/x86_64-linux/devnag | Bin 30944 -> 31256 bytes Master/bin/x86_64-linux/disdvi | Bin 16088 -> 15992 bytes Master/bin/x86_64-linux/dt2dv | Bin 45272 -> 42856 bytes Master/bin/x86_64-linux/dv2dt | Bin 23120 -> 23648 bytes Master/bin/x86_64-linux/dvi2tty | Bin 143360 -> 155816 bytes Master/bin/x86_64-linux/dvibook | Bin 24728 -> 25304 bytes Master/bin/x86_64-linux/dviconcat | Bin 22040 -> 22424 bytes Master/bin/x86_64-linux/dvicopy | Bin 115856 -> 122200 bytes Master/bin/x86_64-linux/dvidvi | Bin 19832 -> 20000 bytes Master/bin/x86_64-linux/dvihp | 5 +- Master/bin/x86_64-linux/dvilj | Bin 114712 -> 119296 bytes Master/bin/x86_64-linux/dvilj2p | Bin 114712 -> 119680 bytes Master/bin/x86_64-linux/dvilj4 | Bin 120856 -> 127136 bytes Master/bin/x86_64-linux/dvilj4l | Bin 120888 -> 127136 bytes Master/bin/x86_64-linux/dvipng | Bin 1083600 -> 1067480 bytes Master/bin/x86_64-linux/dvipos | Bin 106176 -> 114424 bytes Master/bin/x86_64-linux/dvips | Bin 259304 -> 266944 bytes Master/bin/x86_64-linux/dviselect | Bin 24248 -> 24216 bytes Master/bin/x86_64-linux/dvisvgm | Bin 4765976 -> 5488992 bytes Master/bin/x86_64-linux/dvitodvi | Bin 28504 -> 28376 bytes Master/bin/x86_64-linux/dvitype | Bin 101696 -> 109928 bytes Master/bin/x86_64-linux/epsffit | Bin 24336 -> 27616 bytes Master/bin/x86_64-linux/eptex | Bin 588096 -> 607880 bytes Master/bin/x86_64-linux/euptex | Bin 597888 -> 614856 bytes Master/bin/x86_64-linux/extconv | Bin 5016 -> 5064 bytes Master/bin/x86_64-linux/gftodvi | Bin 105728 -> 109896 bytes Master/bin/x86_64-linux/gftopk | Bin 89344 -> 93512 bytes Master/bin/x86_64-linux/gftype | Bin 87904 -> 92488 bytes Master/bin/x86_64-linux/gregorio | Bin 683760 -> 687896 bytes Master/bin/x86_64-linux/gsftopk | Bin 89488 -> 93608 bytes Master/bin/x86_64-linux/hbf2gf | Bin 97920 -> 101912 bytes Master/bin/x86_64-linux/kpseaccess | Bin 5800 -> 5824 bytes Master/bin/x86_64-linux/kpsereadlink | Bin 5680 -> 5728 bytes Master/bin/x86_64-linux/kpsestat | Bin 6784 -> 6800 bytes Master/bin/x86_64-linux/kpsewhich | Bin 82024 -> 86784 bytes Master/bin/x86_64-linux/lacheck | Bin 60152 -> 62312 bytes Master/bin/x86_64-linux/luajittex | Bin 8437208 -> 8955112 bytes Master/bin/x86_64-linux/luatex | Bin 8260360 -> 8760096 bytes Master/bin/x86_64-linux/luatex53 | Bin 0 -> 8787232 bytes Master/bin/x86_64-linux/mag | Bin 6824 -> 6840 bytes Master/bin/x86_64-linux/makeindex | Bin 142784 -> 145064 bytes Master/bin/x86_64-linux/makejvf | Bin 126448 -> 138808 bytes Master/bin/x86_64-linux/mendex | Bin 213808 -> 203320 bytes Master/bin/x86_64-linux/mf | Bin 336616 -> 345552 bytes Master/bin/x86_64-linux/mf-nowin | Bin 332480 -> 342216 bytes Master/bin/x86_64-linux/mflua | Bin 587336 -> 592624 bytes Master/bin/x86_64-linux/mfluajit | Bin 870016 -> 894408 bytes Master/bin/x86_64-linux/mft | Bin 112128 -> 118120 bytes Master/bin/x86_64-linux/mktexlsr | 13 +- Master/bin/x86_64-linux/mmafm | Bin 302280 -> 311072 bytes Master/bin/x86_64-linux/mmpfb | Bin 364544 -> 372568 bytes Master/bin/x86_64-linux/mpost | Bin 4505312 -> 2396744 bytes Master/bin/x86_64-linux/msxlint | Bin 15096 -> 15104 bytes Master/bin/x86_64-linux/odvicopy | Bin 119536 -> 126296 bytes Master/bin/x86_64-linux/odvitype | Bin 102880 -> 108264 bytes Master/bin/x86_64-linux/omfonts | Bin 170320 -> 178248 bytes Master/bin/x86_64-linux/otangle | Bin 101632 -> 106120 bytes Master/bin/x86_64-linux/otfinfo | Bin 533856 -> 509088 bytes Master/bin/x86_64-linux/otftotfm | Bin 885984 -> 867768 bytes Master/bin/x86_64-linux/otp2ocp | Bin 93504 -> 97624 bytes Master/bin/x86_64-linux/outocp | Bin 73136 -> 77720 bytes Master/bin/x86_64-linux/patgen | Bin 37320 -> 37904 bytes Master/bin/x86_64-linux/pbibtex | Bin 196224 -> 200392 bytes Master/bin/x86_64-linux/pdfclose | Bin 11056 -> 11072 bytes Master/bin/x86_64-linux/pdfopen | Bin 19288 -> 19304 bytes Master/bin/x86_64-linux/pdftex | Bin 2214600 -> 2175872 bytes Master/bin/x86_64-linux/pdftosrc | Bin 1165112 -> 1163104 bytes Master/bin/x86_64-linux/pdvitype | Bin 138912 -> 147208 bytes Master/bin/x86_64-linux/pfb2pfa | Bin 9416 -> 9576 bytes Master/bin/x86_64-linux/pk2bm | Bin 12752 -> 12656 bytes Master/bin/x86_64-linux/pktogf | Bin 85248 -> 88584 bytes Master/bin/x86_64-linux/pktype | Bin 81136 -> 85272 bytes Master/bin/x86_64-linux/pltotf | Bin 56336 -> 56408 bytes Master/bin/x86_64-linux/pmpost | Bin 4541632 -> 2435016 bytes Master/bin/x86_64-linux/pmxab | Bin 516904 -> 535272 bytes Master/bin/x86_64-linux/pooltype | Bin 23552 -> 23560 bytes Master/bin/x86_64-linux/ppltotf | Bin 149344 -> 155272 bytes Master/bin/x86_64-linux/prepmx | Bin 124368 -> 127288 bytes Master/bin/x86_64-linux/ps2pk | Bin 185680 -> 192184 bytes Master/bin/x86_64-linux/psbook | Bin 23480 -> 23512 bytes Master/bin/x86_64-linux/psnup | Bin 88944 -> 93144 bytes Master/bin/x86_64-linux/psresize | Bin 87120 -> 91288 bytes Master/bin/x86_64-linux/psselect | Bin 24224 -> 24480 bytes Master/bin/x86_64-linux/pstops | Bin 88016 -> 92504 bytes Master/bin/x86_64-linux/ptex | Bin 515264 -> 530504 bytes Master/bin/x86_64-linux/ptftopl | Bin 138880 -> 142984 bytes Master/bin/x86_64-linux/scor2prt | Bin 82192 -> 83696 bytes Master/bin/x86_64-linux/sjisconv | Bin 5032 -> 5080 bytes Master/bin/x86_64-linux/synctex | Bin 144952 -> 186256 bytes Master/bin/x86_64-linux/t1ascii | Bin 34136 -> 36784 bytes Master/bin/x86_64-linux/t1asm | Bin 41056 -> 45240 bytes Master/bin/x86_64-linux/t1binary | Bin 33672 -> 36208 bytes Master/bin/x86_64-linux/t1disasm | Bin 39952 -> 42376 bytes Master/bin/x86_64-linux/t1dotlessj | Bin 352720 -> 360968 bytes Master/bin/x86_64-linux/t1lint | Bin 314584 -> 327472 bytes Master/bin/x86_64-linux/t1mac | Bin 44176 -> 48400 bytes Master/bin/x86_64-linux/t1rawafm | Bin 314616 -> 324752 bytes Master/bin/x86_64-linux/t1reencode | Bin 347392 -> 356184 bytes Master/bin/x86_64-linux/t1testpage | Bin 331016 -> 339816 bytes Master/bin/x86_64-linux/t1unmac | Bin 40152 -> 41624 bytes Master/bin/x86_64-linux/t4ht | Bin 91232 -> 96136 bytes Master/bin/x86_64-linux/tangle | Bin 105808 -> 109976 bytes Master/bin/x86_64-linux/teckit_compile | Bin 1920816 -> 2104224 bytes Master/bin/x86_64-linux/tex | Bin 369920 -> 379800 bytes Master/bin/x86_64-linux/tex2aspc | Bin 0 -> 11160 bytes Master/bin/x86_64-linux/tex4ht | Bin 156976 -> 158952 bytes Master/bin/x86_64-linux/texlua53 | 1 + Master/bin/x86_64-linux/texlua53c | 1 + Master/bin/x86_64-linux/tftopl | Bin 101648 -> 105816 bytes Master/bin/x86_64-linux/tie | Bin 76928 -> 81064 bytes Master/bin/x86_64-linux/tlcockpit | 2 +- Master/bin/x86_64-linux/ttf2afm | Bin 93024 -> 96520 bytes Master/bin/x86_64-linux/ttf2pk | Bin 700272 -> 737464 bytes Master/bin/x86_64-linux/ttf2tfm | Bin 719072 -> 756776 bytes Master/bin/x86_64-linux/ttfdump | Bin 162032 -> 167352 bytes Master/bin/x86_64-linux/ttftotype42 | Bin 365504 -> 372528 bytes Master/bin/x86_64-linux/upbibtex | Bin 202784 -> 206984 bytes Master/bin/x86_64-linux/updvitype | Bin 142016 -> 149640 bytes Master/bin/x86_64-linux/upmendex | Bin 19816840 -> 20059952 bytes Master/bin/x86_64-linux/upmpost | Bin 4542304 -> 2435016 bytes Master/bin/x86_64-linux/uppltotf | Bin 153600 -> 157960 bytes Master/bin/x86_64-linux/uptex | Bin 522624 -> 537544 bytes Master/bin/x86_64-linux/uptftopl | Bin 141312 -> 144200 bytes Master/bin/x86_64-linux/vftovp | Bin 110752 -> 114984 bytes Master/bin/x86_64-linux/vlna | Bin 15176 -> 15168 bytes Master/bin/x86_64-linux/vptovf | Bin 68632 -> 68704 bytes Master/bin/x86_64-linux/weave | Bin 130304 -> 134472 bytes Master/bin/x86_64-linux/wofm2opl | Bin 118832 -> 115608 bytes Master/bin/x86_64-linux/wopl2ofm | Bin 119152 -> 118808 bytes Master/bin/x86_64-linux/wovf2ovp | Bin 132608 -> 130408 bytes Master/bin/x86_64-linux/wovp2ovf | Bin 136536 -> 136608 bytes Master/bin/x86_64-linux/xdvi-xaw | Bin 1234504 -> 1276560 bytes Master/bin/x86_64-linux/xdvipdfmx | Bin 1018960 -> 979096 bytes Master/bin/x86_64-linux/xetex | Bin 23823984 -> 24034848 bytes Master/bin/x86_64-solaris/tlcockpit | 2 +- Master/release-texlive.txt | 2 +- .../scripts/tlcockpit/tlcockpit-runner.sh | 10 - Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh | 10 + Master/texmf-dist/web2c/texmf.cnf | 15 +- Master/texmf-dist/web2c/texmfcnf.lua | 4 +- Master/tlpkg/TeXLive/TLConfig.pm | 2 +- Master/tlpkg/bin/tl-update-bindir | 4 +- Master/tlpkg/bin/tl-update-tlnet | 6 +- Master/tlpkg/doc/releng.txt | 48 +- Master/tlpkg/tlpsrc/autosp.tlpsrc | 1 + Master/tlpkg/tlpsrc/axodraw2.tlpsrc | 1 + Master/tlpkg/tlpsrc/luatex.tlpsrc | 5 + 189 files changed, 2256 insertions(+), 70 deletions(-) create mode 100755 Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh create mode 100755 Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl create mode 100755 Master/bin/x86_64-linux/axohelp create mode 100755 Master/bin/x86_64-linux/luatex53 create mode 100755 Master/bin/x86_64-linux/tex2aspc create mode 120000 Master/bin/x86_64-linux/texlua53 create mode 120000 Master/bin/x86_64-linux/texlua53c delete mode 100755 Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh create mode 100755 Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh 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/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh b/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh new file mode 100755 index 00000000000..734ffe54c3c --- /dev/null +++ b/Build/source/texk/texlive/linked_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/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 <> +} else { + event add <> +} + +## 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 {toggle_pl_marked [.tlpl.pl focus] "#1"} + bind .tlpl.pl {toggle_pl_marked [.tlpl.pl focus] "#1"} + # only toggle when column is "sup" i.e. #1 + bind .tlpl.pl \ + {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 <> { + foreach p [.tlbk.bklist children {}] { + if {$p ne [.tlbk.bklist focus]} { + .tlbk.bklist item $p -open 0 + } + } + } + # restoring a single package + bind .tlbk.bklist <> {bklist_callback_click %x %y} + bind .tlbk.bklist 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 ' restores 'send' and avoids the bug + bind . { + 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 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 display_packages_info + bind .pksearch.d 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 {toggle_marked [.pkglist focus] "#1"} + bind .pkglist {toggle_marked [.pkglist focus] "#1"} + # only toggle when column is "mk" i.e. #1 + bind .pkglist {toggle_marked \ + [.pkglist identify item %x %y] [.pkglist identify column %x %y]} + + menu .pkg_popup ; # entries added on-the-fly + bind .pkglist <> {do_package_popup_menu %x %y %X %Y} + if $::plain_unix { + bind .pkg_popup {.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 -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 Binary files a/Master/bin/x86_64-linux/afm2pl and b/Master/bin/x86_64-linux/afm2pl differ diff --git a/Master/bin/x86_64-linux/afm2tfm b/Master/bin/x86_64-linux/afm2tfm index 9c946c179f7..c508a479e08 100755 Binary files a/Master/bin/x86_64-linux/afm2tfm and b/Master/bin/x86_64-linux/afm2tfm differ diff --git a/Master/bin/x86_64-linux/aleph b/Master/bin/x86_64-linux/aleph index dfe957d3189..495c7580cb3 100755 Binary files a/Master/bin/x86_64-linux/aleph and b/Master/bin/x86_64-linux/aleph differ diff --git a/Master/bin/x86_64-linux/asy b/Master/bin/x86_64-linux/asy index b704001f3ee..38240b944fc 100755 Binary files a/Master/bin/x86_64-linux/asy and b/Master/bin/x86_64-linux/asy differ diff --git a/Master/bin/x86_64-linux/autosp b/Master/bin/x86_64-linux/autosp index 941e4e14993..50b2cff7a24 100755 Binary files a/Master/bin/x86_64-linux/autosp and b/Master/bin/x86_64-linux/autosp differ diff --git a/Master/bin/x86_64-linux/axohelp b/Master/bin/x86_64-linux/axohelp new file mode 100755 index 00000000000..81e65451a99 Binary files /dev/null and b/Master/bin/x86_64-linux/axohelp differ diff --git a/Master/bin/x86_64-linux/bbox b/Master/bin/x86_64-linux/bbox index 448a1a50558..3e0a673759d 100755 Binary files a/Master/bin/x86_64-linux/bbox and b/Master/bin/x86_64-linux/bbox differ diff --git a/Master/bin/x86_64-linux/bg5conv b/Master/bin/x86_64-linux/bg5conv index b8f78f7562d..ef96bde23d2 100755 Binary files a/Master/bin/x86_64-linux/bg5conv and b/Master/bin/x86_64-linux/bg5conv differ diff --git a/Master/bin/x86_64-linux/bibtex b/Master/bin/x86_64-linux/bibtex index e3856954e95..eea554c94fc 100755 Binary files a/Master/bin/x86_64-linux/bibtex and b/Master/bin/x86_64-linux/bibtex differ diff --git a/Master/bin/x86_64-linux/bibtex8 b/Master/bin/x86_64-linux/bibtex8 index 307add48e41..12f0a3177f1 100755 Binary files a/Master/bin/x86_64-linux/bibtex8 and b/Master/bin/x86_64-linux/bibtex8 differ diff --git a/Master/bin/x86_64-linux/bibtexu b/Master/bin/x86_64-linux/bibtexu index 5a254e2b066..e02e1da5360 100755 Binary files a/Master/bin/x86_64-linux/bibtexu and b/Master/bin/x86_64-linux/bibtexu differ diff --git a/Master/bin/x86_64-linux/cef5conv b/Master/bin/x86_64-linux/cef5conv index e15bcdc8b4f..c8de2f95f02 100755 Binary files a/Master/bin/x86_64-linux/cef5conv and b/Master/bin/x86_64-linux/cef5conv differ diff --git a/Master/bin/x86_64-linux/cefconv b/Master/bin/x86_64-linux/cefconv index 9d851402837..29b92925fec 100755 Binary files a/Master/bin/x86_64-linux/cefconv and b/Master/bin/x86_64-linux/cefconv differ diff --git a/Master/bin/x86_64-linux/cefsconv b/Master/bin/x86_64-linux/cefsconv index 2372bc4ebae..27ddf9efd45 100755 Binary files a/Master/bin/x86_64-linux/cefsconv and b/Master/bin/x86_64-linux/cefsconv differ diff --git a/Master/bin/x86_64-linux/cfftot1 b/Master/bin/x86_64-linux/cfftot1 index ab9e13e7fd9..bb478509380 100755 Binary files a/Master/bin/x86_64-linux/cfftot1 and b/Master/bin/x86_64-linux/cfftot1 differ diff --git a/Master/bin/x86_64-linux/chktex b/Master/bin/x86_64-linux/chktex index 13f9fb3a098..524368b65ee 100755 Binary files a/Master/bin/x86_64-linux/chktex and b/Master/bin/x86_64-linux/chktex differ diff --git a/Master/bin/x86_64-linux/ctangle b/Master/bin/x86_64-linux/ctangle index 5408ea753d6..b7559441027 100755 Binary files a/Master/bin/x86_64-linux/ctangle and b/Master/bin/x86_64-linux/ctangle differ diff --git a/Master/bin/x86_64-linux/ctie b/Master/bin/x86_64-linux/ctie index 681a518f369..4dc91ec704c 100755 Binary files a/Master/bin/x86_64-linux/ctie and b/Master/bin/x86_64-linux/ctie differ diff --git a/Master/bin/x86_64-linux/cweave b/Master/bin/x86_64-linux/cweave index 5509d9366aa..31b78e263ed 100755 Binary files a/Master/bin/x86_64-linux/cweave and b/Master/bin/x86_64-linux/cweave differ diff --git a/Master/bin/x86_64-linux/detex b/Master/bin/x86_64-linux/detex index 57bf236a804..29f669f8521 100755 Binary files a/Master/bin/x86_64-linux/detex and b/Master/bin/x86_64-linux/detex differ diff --git a/Master/bin/x86_64-linux/devnag b/Master/bin/x86_64-linux/devnag index b56f035388b..fbf0f7f370e 100755 Binary files a/Master/bin/x86_64-linux/devnag and b/Master/bin/x86_64-linux/devnag differ diff --git a/Master/bin/x86_64-linux/disdvi b/Master/bin/x86_64-linux/disdvi index 2eb36fe4af1..deb7e87c862 100755 Binary files a/Master/bin/x86_64-linux/disdvi and b/Master/bin/x86_64-linux/disdvi differ diff --git a/Master/bin/x86_64-linux/dt2dv b/Master/bin/x86_64-linux/dt2dv index 92b9fb4f137..42c8842a883 100755 Binary files a/Master/bin/x86_64-linux/dt2dv and b/Master/bin/x86_64-linux/dt2dv differ diff --git a/Master/bin/x86_64-linux/dv2dt b/Master/bin/x86_64-linux/dv2dt index 371f0647b2a..e5a019c960b 100755 Binary files a/Master/bin/x86_64-linux/dv2dt and b/Master/bin/x86_64-linux/dv2dt differ diff --git a/Master/bin/x86_64-linux/dvi2tty b/Master/bin/x86_64-linux/dvi2tty index 93b61334414..231b97c73bd 100755 Binary files a/Master/bin/x86_64-linux/dvi2tty and b/Master/bin/x86_64-linux/dvi2tty differ diff --git a/Master/bin/x86_64-linux/dvibook b/Master/bin/x86_64-linux/dvibook index 9f33e3d70bf..0744641d27d 100755 Binary files a/Master/bin/x86_64-linux/dvibook and b/Master/bin/x86_64-linux/dvibook differ diff --git a/Master/bin/x86_64-linux/dviconcat b/Master/bin/x86_64-linux/dviconcat index 521b4c89042..239db7e8bf3 100755 Binary files a/Master/bin/x86_64-linux/dviconcat and b/Master/bin/x86_64-linux/dviconcat differ diff --git a/Master/bin/x86_64-linux/dvicopy b/Master/bin/x86_64-linux/dvicopy index 4e8c470c960..303e14587ac 100755 Binary files a/Master/bin/x86_64-linux/dvicopy and b/Master/bin/x86_64-linux/dvicopy differ diff --git a/Master/bin/x86_64-linux/dvidvi b/Master/bin/x86_64-linux/dvidvi index 7b048ef783f..15adf2502e4 100755 Binary files a/Master/bin/x86_64-linux/dvidvi and b/Master/bin/x86_64-linux/dvidvi 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 Binary files a/Master/bin/x86_64-linux/dvilj and b/Master/bin/x86_64-linux/dvilj differ diff --git a/Master/bin/x86_64-linux/dvilj2p b/Master/bin/x86_64-linux/dvilj2p index 644600eb1d7..28661c4d4d2 100755 Binary files a/Master/bin/x86_64-linux/dvilj2p and b/Master/bin/x86_64-linux/dvilj2p differ diff --git a/Master/bin/x86_64-linux/dvilj4 b/Master/bin/x86_64-linux/dvilj4 index bb83c95b755..23e562d50dc 100755 Binary files a/Master/bin/x86_64-linux/dvilj4 and b/Master/bin/x86_64-linux/dvilj4 differ diff --git a/Master/bin/x86_64-linux/dvilj4l b/Master/bin/x86_64-linux/dvilj4l index 6d5c86f1ff3..38067df366f 100755 Binary files a/Master/bin/x86_64-linux/dvilj4l and b/Master/bin/x86_64-linux/dvilj4l differ diff --git a/Master/bin/x86_64-linux/dvipng b/Master/bin/x86_64-linux/dvipng index 278eb85933d..b73ad91548d 100755 Binary files a/Master/bin/x86_64-linux/dvipng and b/Master/bin/x86_64-linux/dvipng differ diff --git a/Master/bin/x86_64-linux/dvipos b/Master/bin/x86_64-linux/dvipos index 971fe3260ff..9d80b8dfb05 100755 Binary files a/Master/bin/x86_64-linux/dvipos and b/Master/bin/x86_64-linux/dvipos differ diff --git a/Master/bin/x86_64-linux/dvips b/Master/bin/x86_64-linux/dvips index 8a3bf0c1cbe..2db1beb5a9a 100755 Binary files a/Master/bin/x86_64-linux/dvips and b/Master/bin/x86_64-linux/dvips differ diff --git a/Master/bin/x86_64-linux/dviselect b/Master/bin/x86_64-linux/dviselect index d15dbb26c18..20b486e84e5 100755 Binary files a/Master/bin/x86_64-linux/dviselect and b/Master/bin/x86_64-linux/dviselect differ diff --git a/Master/bin/x86_64-linux/dvisvgm b/Master/bin/x86_64-linux/dvisvgm index 343d946327d..fafd1c74440 100755 Binary files a/Master/bin/x86_64-linux/dvisvgm and b/Master/bin/x86_64-linux/dvisvgm differ diff --git a/Master/bin/x86_64-linux/dvitodvi b/Master/bin/x86_64-linux/dvitodvi index 3d531f191a7..e155b98b93f 100755 Binary files a/Master/bin/x86_64-linux/dvitodvi and b/Master/bin/x86_64-linux/dvitodvi differ diff --git a/Master/bin/x86_64-linux/dvitype b/Master/bin/x86_64-linux/dvitype index 83c156c8897..db8f5f0d685 100755 Binary files a/Master/bin/x86_64-linux/dvitype and b/Master/bin/x86_64-linux/dvitype differ diff --git a/Master/bin/x86_64-linux/epsffit b/Master/bin/x86_64-linux/epsffit index 51f3678e953..186a34175fd 100755 Binary files a/Master/bin/x86_64-linux/epsffit and b/Master/bin/x86_64-linux/epsffit differ diff --git a/Master/bin/x86_64-linux/eptex b/Master/bin/x86_64-linux/eptex index 4591fbcdaa1..faa9e152a56 100755 Binary files a/Master/bin/x86_64-linux/eptex and b/Master/bin/x86_64-linux/eptex differ diff --git a/Master/bin/x86_64-linux/euptex b/Master/bin/x86_64-linux/euptex index 597e2038796..454bafd9afd 100755 Binary files a/Master/bin/x86_64-linux/euptex and b/Master/bin/x86_64-linux/euptex differ diff --git a/Master/bin/x86_64-linux/extconv b/Master/bin/x86_64-linux/extconv index 0f8dad5b171..dc6bb80255c 100755 Binary files a/Master/bin/x86_64-linux/extconv and b/Master/bin/x86_64-linux/extconv differ diff --git a/Master/bin/x86_64-linux/gftodvi b/Master/bin/x86_64-linux/gftodvi index dc82bc88713..5cc60cabc4c 100755 Binary files a/Master/bin/x86_64-linux/gftodvi and b/Master/bin/x86_64-linux/gftodvi differ diff --git a/Master/bin/x86_64-linux/gftopk b/Master/bin/x86_64-linux/gftopk index c5c9d86a9d7..80a6fd4fab8 100755 Binary files a/Master/bin/x86_64-linux/gftopk and b/Master/bin/x86_64-linux/gftopk differ diff --git a/Master/bin/x86_64-linux/gftype b/Master/bin/x86_64-linux/gftype index 168373e97d7..82895b451ba 100755 Binary files a/Master/bin/x86_64-linux/gftype and b/Master/bin/x86_64-linux/gftype differ diff --git a/Master/bin/x86_64-linux/gregorio b/Master/bin/x86_64-linux/gregorio index 56cf48364cd..25d173a8fd3 100755 Binary files a/Master/bin/x86_64-linux/gregorio and b/Master/bin/x86_64-linux/gregorio differ diff --git a/Master/bin/x86_64-linux/gsftopk b/Master/bin/x86_64-linux/gsftopk index 7440063f3bd..c468198abe8 100755 Binary files a/Master/bin/x86_64-linux/gsftopk and b/Master/bin/x86_64-linux/gsftopk differ diff --git a/Master/bin/x86_64-linux/hbf2gf b/Master/bin/x86_64-linux/hbf2gf index b2e96111e86..79c62ba17d1 100755 Binary files a/Master/bin/x86_64-linux/hbf2gf and b/Master/bin/x86_64-linux/hbf2gf differ diff --git a/Master/bin/x86_64-linux/kpseaccess b/Master/bin/x86_64-linux/kpseaccess index da19901ab5e..216c5653578 100755 Binary files a/Master/bin/x86_64-linux/kpseaccess and b/Master/bin/x86_64-linux/kpseaccess differ diff --git a/Master/bin/x86_64-linux/kpsereadlink b/Master/bin/x86_64-linux/kpsereadlink index 7a725a72c90..87ce320164c 100755 Binary files a/Master/bin/x86_64-linux/kpsereadlink and b/Master/bin/x86_64-linux/kpsereadlink differ diff --git a/Master/bin/x86_64-linux/kpsestat b/Master/bin/x86_64-linux/kpsestat index 473da3d8f76..2b15d998555 100755 Binary files a/Master/bin/x86_64-linux/kpsestat and b/Master/bin/x86_64-linux/kpsestat differ diff --git a/Master/bin/x86_64-linux/kpsewhich b/Master/bin/x86_64-linux/kpsewhich index a1ecd0c0ed0..905b64fafdb 100755 Binary files a/Master/bin/x86_64-linux/kpsewhich and b/Master/bin/x86_64-linux/kpsewhich differ diff --git a/Master/bin/x86_64-linux/lacheck b/Master/bin/x86_64-linux/lacheck index 289d6fc3012..ddc95219895 100755 Binary files a/Master/bin/x86_64-linux/lacheck and b/Master/bin/x86_64-linux/lacheck differ diff --git a/Master/bin/x86_64-linux/luajittex b/Master/bin/x86_64-linux/luajittex index 5fe637ecb4c..bc226140b8a 100755 Binary files a/Master/bin/x86_64-linux/luajittex and b/Master/bin/x86_64-linux/luajittex differ diff --git a/Master/bin/x86_64-linux/luatex b/Master/bin/x86_64-linux/luatex index 049e5e61613..09075b0eec0 100755 Binary files a/Master/bin/x86_64-linux/luatex and b/Master/bin/x86_64-linux/luatex differ diff --git a/Master/bin/x86_64-linux/luatex53 b/Master/bin/x86_64-linux/luatex53 new file mode 100755 index 00000000000..197f1752534 Binary files /dev/null and b/Master/bin/x86_64-linux/luatex53 differ diff --git a/Master/bin/x86_64-linux/mag b/Master/bin/x86_64-linux/mag index 2d0bd984fca..84cf5def131 100755 Binary files a/Master/bin/x86_64-linux/mag and b/Master/bin/x86_64-linux/mag differ diff --git a/Master/bin/x86_64-linux/makeindex b/Master/bin/x86_64-linux/makeindex index fcd21dbc9ee..d678724afa3 100755 Binary files a/Master/bin/x86_64-linux/makeindex and b/Master/bin/x86_64-linux/makeindex differ diff --git a/Master/bin/x86_64-linux/makejvf b/Master/bin/x86_64-linux/makejvf index 61717d15167..883136a9d9b 100755 Binary files a/Master/bin/x86_64-linux/makejvf and b/Master/bin/x86_64-linux/makejvf differ diff --git a/Master/bin/x86_64-linux/mendex b/Master/bin/x86_64-linux/mendex index 22aa10c0028..b470f3ddee3 100755 Binary files a/Master/bin/x86_64-linux/mendex and b/Master/bin/x86_64-linux/mendex differ diff --git a/Master/bin/x86_64-linux/mf b/Master/bin/x86_64-linux/mf index 9128104d5a5..ac9a0d920ba 100755 Binary files a/Master/bin/x86_64-linux/mf and b/Master/bin/x86_64-linux/mf differ diff --git a/Master/bin/x86_64-linux/mf-nowin b/Master/bin/x86_64-linux/mf-nowin index b3a2e8d9f88..9b89ad7ed7a 100755 Binary files a/Master/bin/x86_64-linux/mf-nowin and b/Master/bin/x86_64-linux/mf-nowin differ diff --git a/Master/bin/x86_64-linux/mflua b/Master/bin/x86_64-linux/mflua index aff0235a223..ceea3d6d163 100755 Binary files a/Master/bin/x86_64-linux/mflua and b/Master/bin/x86_64-linux/mflua differ diff --git a/Master/bin/x86_64-linux/mfluajit b/Master/bin/x86_64-linux/mfluajit index 3472bf50a06..044ad0322c2 100755 Binary files a/Master/bin/x86_64-linux/mfluajit and b/Master/bin/x86_64-linux/mfluajit differ diff --git a/Master/bin/x86_64-linux/mft b/Master/bin/x86_64-linux/mft index f26bce30e7f..ff5eea96e6a 100755 Binary files a/Master/bin/x86_64-linux/mft and b/Master/bin/x86_64-linux/mft 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 Binary files a/Master/bin/x86_64-linux/mmafm and b/Master/bin/x86_64-linux/mmafm differ diff --git a/Master/bin/x86_64-linux/mmpfb b/Master/bin/x86_64-linux/mmpfb index 5d7446538be..2bfcfc8ef46 100755 Binary files a/Master/bin/x86_64-linux/mmpfb and b/Master/bin/x86_64-linux/mmpfb differ diff --git a/Master/bin/x86_64-linux/mpost b/Master/bin/x86_64-linux/mpost index 9a1e32754fa..642b47b7929 100755 Binary files a/Master/bin/x86_64-linux/mpost and b/Master/bin/x86_64-linux/mpost differ diff --git a/Master/bin/x86_64-linux/msxlint b/Master/bin/x86_64-linux/msxlint index 7cc9549d659..6533a40bef3 100755 Binary files a/Master/bin/x86_64-linux/msxlint and b/Master/bin/x86_64-linux/msxlint differ diff --git a/Master/bin/x86_64-linux/odvicopy b/Master/bin/x86_64-linux/odvicopy index 9b953b9c514..77ff36f9eb9 100755 Binary files a/Master/bin/x86_64-linux/odvicopy and b/Master/bin/x86_64-linux/odvicopy differ diff --git a/Master/bin/x86_64-linux/odvitype b/Master/bin/x86_64-linux/odvitype index 9dac428dd67..0edf91a7158 100755 Binary files a/Master/bin/x86_64-linux/odvitype and b/Master/bin/x86_64-linux/odvitype differ diff --git a/Master/bin/x86_64-linux/omfonts b/Master/bin/x86_64-linux/omfonts index ac5eb8437ab..b53a912f2ef 100755 Binary files a/Master/bin/x86_64-linux/omfonts and b/Master/bin/x86_64-linux/omfonts differ diff --git a/Master/bin/x86_64-linux/otangle b/Master/bin/x86_64-linux/otangle index e71ae61e80c..10e0ca63f8c 100755 Binary files a/Master/bin/x86_64-linux/otangle and b/Master/bin/x86_64-linux/otangle differ diff --git a/Master/bin/x86_64-linux/otfinfo b/Master/bin/x86_64-linux/otfinfo index 4e7ce583956..986e8aa70d4 100755 Binary files a/Master/bin/x86_64-linux/otfinfo and b/Master/bin/x86_64-linux/otfinfo differ diff --git a/Master/bin/x86_64-linux/otftotfm b/Master/bin/x86_64-linux/otftotfm index a3aaa685091..0a0e35d987d 100755 Binary files a/Master/bin/x86_64-linux/otftotfm and b/Master/bin/x86_64-linux/otftotfm differ diff --git a/Master/bin/x86_64-linux/otp2ocp b/Master/bin/x86_64-linux/otp2ocp index 37b5b08f4c4..61ae5eea5b0 100755 Binary files a/Master/bin/x86_64-linux/otp2ocp and b/Master/bin/x86_64-linux/otp2ocp differ diff --git a/Master/bin/x86_64-linux/outocp b/Master/bin/x86_64-linux/outocp index ee9e0e54b97..1c25433da05 100755 Binary files a/Master/bin/x86_64-linux/outocp and b/Master/bin/x86_64-linux/outocp differ diff --git a/Master/bin/x86_64-linux/patgen b/Master/bin/x86_64-linux/patgen index 0c1d3e66185..41044c369c6 100755 Binary files a/Master/bin/x86_64-linux/patgen and b/Master/bin/x86_64-linux/patgen differ diff --git a/Master/bin/x86_64-linux/pbibtex b/Master/bin/x86_64-linux/pbibtex index 9ee5317217c..ac51523efc2 100755 Binary files a/Master/bin/x86_64-linux/pbibtex and b/Master/bin/x86_64-linux/pbibtex differ diff --git a/Master/bin/x86_64-linux/pdfclose b/Master/bin/x86_64-linux/pdfclose index 4b32df09e3d..8fc9acf80e4 100755 Binary files a/Master/bin/x86_64-linux/pdfclose and b/Master/bin/x86_64-linux/pdfclose differ diff --git a/Master/bin/x86_64-linux/pdfopen b/Master/bin/x86_64-linux/pdfopen index cc31bdfc943..d3b60811c61 100755 Binary files a/Master/bin/x86_64-linux/pdfopen and b/Master/bin/x86_64-linux/pdfopen differ diff --git a/Master/bin/x86_64-linux/pdftex b/Master/bin/x86_64-linux/pdftex index 539fa89235b..24465a60dc8 100755 Binary files a/Master/bin/x86_64-linux/pdftex and b/Master/bin/x86_64-linux/pdftex differ diff --git a/Master/bin/x86_64-linux/pdftosrc b/Master/bin/x86_64-linux/pdftosrc index 71712034d33..3737f301393 100755 Binary files a/Master/bin/x86_64-linux/pdftosrc and b/Master/bin/x86_64-linux/pdftosrc differ diff --git a/Master/bin/x86_64-linux/pdvitype b/Master/bin/x86_64-linux/pdvitype index d3f15fb5ab1..c926431d027 100755 Binary files a/Master/bin/x86_64-linux/pdvitype and b/Master/bin/x86_64-linux/pdvitype differ diff --git a/Master/bin/x86_64-linux/pfb2pfa b/Master/bin/x86_64-linux/pfb2pfa index 0956aedc075..37f128ccef8 100755 Binary files a/Master/bin/x86_64-linux/pfb2pfa and b/Master/bin/x86_64-linux/pfb2pfa differ diff --git a/Master/bin/x86_64-linux/pk2bm b/Master/bin/x86_64-linux/pk2bm index a94d7c6501c..923c68a2743 100755 Binary files a/Master/bin/x86_64-linux/pk2bm and b/Master/bin/x86_64-linux/pk2bm differ diff --git a/Master/bin/x86_64-linux/pktogf b/Master/bin/x86_64-linux/pktogf index b037d17bf8b..ae48301c525 100755 Binary files a/Master/bin/x86_64-linux/pktogf and b/Master/bin/x86_64-linux/pktogf differ diff --git a/Master/bin/x86_64-linux/pktype b/Master/bin/x86_64-linux/pktype index 0b3b3879352..b3e733a01b1 100755 Binary files a/Master/bin/x86_64-linux/pktype and b/Master/bin/x86_64-linux/pktype differ diff --git a/Master/bin/x86_64-linux/pltotf b/Master/bin/x86_64-linux/pltotf index 7c2a59b0ca1..5b1e042cad2 100755 Binary files a/Master/bin/x86_64-linux/pltotf and b/Master/bin/x86_64-linux/pltotf differ diff --git a/Master/bin/x86_64-linux/pmpost b/Master/bin/x86_64-linux/pmpost index 85602d3fb97..ff53f9e8bb5 100755 Binary files a/Master/bin/x86_64-linux/pmpost and b/Master/bin/x86_64-linux/pmpost differ diff --git a/Master/bin/x86_64-linux/pmxab b/Master/bin/x86_64-linux/pmxab index 7a7c04ad773..c81a6052cf7 100755 Binary files a/Master/bin/x86_64-linux/pmxab and b/Master/bin/x86_64-linux/pmxab differ diff --git a/Master/bin/x86_64-linux/pooltype b/Master/bin/x86_64-linux/pooltype index 390df3f63fe..3de0e86a660 100755 Binary files a/Master/bin/x86_64-linux/pooltype and b/Master/bin/x86_64-linux/pooltype differ diff --git a/Master/bin/x86_64-linux/ppltotf b/Master/bin/x86_64-linux/ppltotf index 7cdc979e843..606257934e4 100755 Binary files a/Master/bin/x86_64-linux/ppltotf and b/Master/bin/x86_64-linux/ppltotf differ diff --git a/Master/bin/x86_64-linux/prepmx b/Master/bin/x86_64-linux/prepmx index 0c157d254de..547f65c94f7 100755 Binary files a/Master/bin/x86_64-linux/prepmx and b/Master/bin/x86_64-linux/prepmx differ diff --git a/Master/bin/x86_64-linux/ps2pk b/Master/bin/x86_64-linux/ps2pk index cfc6a304b80..f167878a145 100755 Binary files a/Master/bin/x86_64-linux/ps2pk and b/Master/bin/x86_64-linux/ps2pk differ diff --git a/Master/bin/x86_64-linux/psbook b/Master/bin/x86_64-linux/psbook index ef103bbb630..3de9698e684 100755 Binary files a/Master/bin/x86_64-linux/psbook and b/Master/bin/x86_64-linux/psbook differ diff --git a/Master/bin/x86_64-linux/psnup b/Master/bin/x86_64-linux/psnup index e2871607d18..1adc8154a3e 100755 Binary files a/Master/bin/x86_64-linux/psnup and b/Master/bin/x86_64-linux/psnup differ diff --git a/Master/bin/x86_64-linux/psresize b/Master/bin/x86_64-linux/psresize index 054b41a67e3..f6bf7d6ea7a 100755 Binary files a/Master/bin/x86_64-linux/psresize and b/Master/bin/x86_64-linux/psresize differ diff --git a/Master/bin/x86_64-linux/psselect b/Master/bin/x86_64-linux/psselect index 7ff9925efe8..ad7a1c807ab 100755 Binary files a/Master/bin/x86_64-linux/psselect and b/Master/bin/x86_64-linux/psselect differ diff --git a/Master/bin/x86_64-linux/pstops b/Master/bin/x86_64-linux/pstops index 0eedad8cc24..701dd0af5e4 100755 Binary files a/Master/bin/x86_64-linux/pstops and b/Master/bin/x86_64-linux/pstops differ diff --git a/Master/bin/x86_64-linux/ptex b/Master/bin/x86_64-linux/ptex index f2d4135a5d1..7defed21b62 100755 Binary files a/Master/bin/x86_64-linux/ptex and b/Master/bin/x86_64-linux/ptex differ diff --git a/Master/bin/x86_64-linux/ptftopl b/Master/bin/x86_64-linux/ptftopl index d3f8e30a6bc..d244db161f9 100755 Binary files a/Master/bin/x86_64-linux/ptftopl and b/Master/bin/x86_64-linux/ptftopl differ diff --git a/Master/bin/x86_64-linux/scor2prt b/Master/bin/x86_64-linux/scor2prt index da38d87fa9f..61929f640ee 100755 Binary files a/Master/bin/x86_64-linux/scor2prt and b/Master/bin/x86_64-linux/scor2prt differ diff --git a/Master/bin/x86_64-linux/sjisconv b/Master/bin/x86_64-linux/sjisconv index c0d1403a177..17ccb96d410 100755 Binary files a/Master/bin/x86_64-linux/sjisconv and b/Master/bin/x86_64-linux/sjisconv differ diff --git a/Master/bin/x86_64-linux/synctex b/Master/bin/x86_64-linux/synctex index c6b3d32a57d..612cb1c0d13 100755 Binary files a/Master/bin/x86_64-linux/synctex and b/Master/bin/x86_64-linux/synctex differ diff --git a/Master/bin/x86_64-linux/t1ascii b/Master/bin/x86_64-linux/t1ascii index 50552b2f809..193a08a9a18 100755 Binary files a/Master/bin/x86_64-linux/t1ascii and b/Master/bin/x86_64-linux/t1ascii differ diff --git a/Master/bin/x86_64-linux/t1asm b/Master/bin/x86_64-linux/t1asm index bfc09ec1f72..604913c5d1b 100755 Binary files a/Master/bin/x86_64-linux/t1asm and b/Master/bin/x86_64-linux/t1asm differ diff --git a/Master/bin/x86_64-linux/t1binary b/Master/bin/x86_64-linux/t1binary index 800b4db0940..33cc7e41d60 100755 Binary files a/Master/bin/x86_64-linux/t1binary and b/Master/bin/x86_64-linux/t1binary differ diff --git a/Master/bin/x86_64-linux/t1disasm b/Master/bin/x86_64-linux/t1disasm index a993d8aeae2..39794acad95 100755 Binary files a/Master/bin/x86_64-linux/t1disasm and b/Master/bin/x86_64-linux/t1disasm differ diff --git a/Master/bin/x86_64-linux/t1dotlessj b/Master/bin/x86_64-linux/t1dotlessj index c895204233a..d2d9abd71f2 100755 Binary files a/Master/bin/x86_64-linux/t1dotlessj and b/Master/bin/x86_64-linux/t1dotlessj differ diff --git a/Master/bin/x86_64-linux/t1lint b/Master/bin/x86_64-linux/t1lint index 3a4ca8e2895..4ea6fecaa67 100755 Binary files a/Master/bin/x86_64-linux/t1lint and b/Master/bin/x86_64-linux/t1lint differ diff --git a/Master/bin/x86_64-linux/t1mac b/Master/bin/x86_64-linux/t1mac index d6d8e152df3..08a5b323adb 100755 Binary files a/Master/bin/x86_64-linux/t1mac and b/Master/bin/x86_64-linux/t1mac differ diff --git a/Master/bin/x86_64-linux/t1rawafm b/Master/bin/x86_64-linux/t1rawafm index 4f43e02bda6..b80dcd78442 100755 Binary files a/Master/bin/x86_64-linux/t1rawafm and b/Master/bin/x86_64-linux/t1rawafm differ diff --git a/Master/bin/x86_64-linux/t1reencode b/Master/bin/x86_64-linux/t1reencode index 25bcdd30bee..469aeccf390 100755 Binary files a/Master/bin/x86_64-linux/t1reencode and b/Master/bin/x86_64-linux/t1reencode differ diff --git a/Master/bin/x86_64-linux/t1testpage b/Master/bin/x86_64-linux/t1testpage index 4120c4fda7a..d7d91d08c0b 100755 Binary files a/Master/bin/x86_64-linux/t1testpage and b/Master/bin/x86_64-linux/t1testpage differ diff --git a/Master/bin/x86_64-linux/t1unmac b/Master/bin/x86_64-linux/t1unmac index e16f835f375..d9ca9badb5d 100755 Binary files a/Master/bin/x86_64-linux/t1unmac and b/Master/bin/x86_64-linux/t1unmac differ diff --git a/Master/bin/x86_64-linux/t4ht b/Master/bin/x86_64-linux/t4ht index 2b756a73b7f..ff7e477797d 100755 Binary files a/Master/bin/x86_64-linux/t4ht and b/Master/bin/x86_64-linux/t4ht differ diff --git a/Master/bin/x86_64-linux/tangle b/Master/bin/x86_64-linux/tangle index 1cad3897108..5e77c600642 100755 Binary files a/Master/bin/x86_64-linux/tangle and b/Master/bin/x86_64-linux/tangle differ diff --git a/Master/bin/x86_64-linux/teckit_compile b/Master/bin/x86_64-linux/teckit_compile index e9ee28af8f0..fd34f36da10 100755 Binary files a/Master/bin/x86_64-linux/teckit_compile and b/Master/bin/x86_64-linux/teckit_compile differ diff --git a/Master/bin/x86_64-linux/tex b/Master/bin/x86_64-linux/tex index 5143c9c9671..b1b49ffd32e 100755 Binary files a/Master/bin/x86_64-linux/tex and b/Master/bin/x86_64-linux/tex differ diff --git a/Master/bin/x86_64-linux/tex2aspc b/Master/bin/x86_64-linux/tex2aspc new file mode 100755 index 00000000000..972019ff328 Binary files /dev/null and b/Master/bin/x86_64-linux/tex2aspc differ diff --git a/Master/bin/x86_64-linux/tex4ht b/Master/bin/x86_64-linux/tex4ht index 6fa60806972..ee1d7e26deb 100755 Binary files a/Master/bin/x86_64-linux/tex4ht and b/Master/bin/x86_64-linux/tex4ht 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 Binary files a/Master/bin/x86_64-linux/tftopl and b/Master/bin/x86_64-linux/tftopl differ diff --git a/Master/bin/x86_64-linux/tie b/Master/bin/x86_64-linux/tie index 748adbd3e3c..55f8eaa6a37 100755 Binary files a/Master/bin/x86_64-linux/tie and b/Master/bin/x86_64-linux/tie 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 Binary files a/Master/bin/x86_64-linux/ttf2afm and b/Master/bin/x86_64-linux/ttf2afm differ diff --git a/Master/bin/x86_64-linux/ttf2pk b/Master/bin/x86_64-linux/ttf2pk index 0d3ff80abae..5739fd140b3 100755 Binary files a/Master/bin/x86_64-linux/ttf2pk and b/Master/bin/x86_64-linux/ttf2pk differ diff --git a/Master/bin/x86_64-linux/ttf2tfm b/Master/bin/x86_64-linux/ttf2tfm index 324be170b43..69292a8199c 100755 Binary files a/Master/bin/x86_64-linux/ttf2tfm and b/Master/bin/x86_64-linux/ttf2tfm differ diff --git a/Master/bin/x86_64-linux/ttfdump b/Master/bin/x86_64-linux/ttfdump index f68507576e7..6a42f8b7130 100755 Binary files a/Master/bin/x86_64-linux/ttfdump and b/Master/bin/x86_64-linux/ttfdump differ diff --git a/Master/bin/x86_64-linux/ttftotype42 b/Master/bin/x86_64-linux/ttftotype42 index 410b0f0536e..2de90d3eabd 100755 Binary files a/Master/bin/x86_64-linux/ttftotype42 and b/Master/bin/x86_64-linux/ttftotype42 differ diff --git a/Master/bin/x86_64-linux/upbibtex b/Master/bin/x86_64-linux/upbibtex index b0a14e3477a..79f1afbbd0e 100755 Binary files a/Master/bin/x86_64-linux/upbibtex and b/Master/bin/x86_64-linux/upbibtex differ diff --git a/Master/bin/x86_64-linux/updvitype b/Master/bin/x86_64-linux/updvitype index ad2d3450eb8..0b3a9b9b267 100755 Binary files a/Master/bin/x86_64-linux/updvitype and b/Master/bin/x86_64-linux/updvitype differ diff --git a/Master/bin/x86_64-linux/upmendex b/Master/bin/x86_64-linux/upmendex index 14491643cdb..6a914d60c13 100755 Binary files a/Master/bin/x86_64-linux/upmendex and b/Master/bin/x86_64-linux/upmendex differ diff --git a/Master/bin/x86_64-linux/upmpost b/Master/bin/x86_64-linux/upmpost index d97f4479c8a..cc2b512eba9 100755 Binary files a/Master/bin/x86_64-linux/upmpost and b/Master/bin/x86_64-linux/upmpost differ diff --git a/Master/bin/x86_64-linux/uppltotf b/Master/bin/x86_64-linux/uppltotf index 35b2f29aa2f..7ca5fc2b1f3 100755 Binary files a/Master/bin/x86_64-linux/uppltotf and b/Master/bin/x86_64-linux/uppltotf differ diff --git a/Master/bin/x86_64-linux/uptex b/Master/bin/x86_64-linux/uptex index ace873cc456..5d01a07fd2b 100755 Binary files a/Master/bin/x86_64-linux/uptex and b/Master/bin/x86_64-linux/uptex differ diff --git a/Master/bin/x86_64-linux/uptftopl b/Master/bin/x86_64-linux/uptftopl index b5b922de08c..4478bc7eb4e 100755 Binary files a/Master/bin/x86_64-linux/uptftopl and b/Master/bin/x86_64-linux/uptftopl differ diff --git a/Master/bin/x86_64-linux/vftovp b/Master/bin/x86_64-linux/vftovp index cb9bd8e0fbd..8e73d8e6024 100755 Binary files a/Master/bin/x86_64-linux/vftovp and b/Master/bin/x86_64-linux/vftovp differ diff --git a/Master/bin/x86_64-linux/vlna b/Master/bin/x86_64-linux/vlna index 0c1e527b2b7..77a2142b7d2 100755 Binary files a/Master/bin/x86_64-linux/vlna and b/Master/bin/x86_64-linux/vlna differ diff --git a/Master/bin/x86_64-linux/vptovf b/Master/bin/x86_64-linux/vptovf index eed672a6d42..c4944934e75 100755 Binary files a/Master/bin/x86_64-linux/vptovf and b/Master/bin/x86_64-linux/vptovf differ diff --git a/Master/bin/x86_64-linux/weave b/Master/bin/x86_64-linux/weave index cf35b50df5a..d33f887ccb0 100755 Binary files a/Master/bin/x86_64-linux/weave and b/Master/bin/x86_64-linux/weave differ diff --git a/Master/bin/x86_64-linux/wofm2opl b/Master/bin/x86_64-linux/wofm2opl index fa3d3328c3a..3331548fb14 100755 Binary files a/Master/bin/x86_64-linux/wofm2opl and b/Master/bin/x86_64-linux/wofm2opl differ diff --git a/Master/bin/x86_64-linux/wopl2ofm b/Master/bin/x86_64-linux/wopl2ofm index 8d4d6090713..56ce12e678e 100755 Binary files a/Master/bin/x86_64-linux/wopl2ofm and b/Master/bin/x86_64-linux/wopl2ofm differ diff --git a/Master/bin/x86_64-linux/wovf2ovp b/Master/bin/x86_64-linux/wovf2ovp index 7bb17cf2202..61cbdb29095 100755 Binary files a/Master/bin/x86_64-linux/wovf2ovp and b/Master/bin/x86_64-linux/wovf2ovp differ diff --git a/Master/bin/x86_64-linux/wovp2ovf b/Master/bin/x86_64-linux/wovp2ovf index 88812f293f8..6c36cbf6a63 100755 Binary files a/Master/bin/x86_64-linux/wovp2ovf and b/Master/bin/x86_64-linux/wovp2ovf differ diff --git a/Master/bin/x86_64-linux/xdvi-xaw b/Master/bin/x86_64-linux/xdvi-xaw index 9377840950b..44ec2599b89 100755 Binary files a/Master/bin/x86_64-linux/xdvi-xaw and b/Master/bin/x86_64-linux/xdvi-xaw differ diff --git a/Master/bin/x86_64-linux/xdvipdfmx b/Master/bin/x86_64-linux/xdvipdfmx index 874c0c6a58a..99a35bd33ff 100755 Binary files a/Master/bin/x86_64-linux/xdvipdfmx and b/Master/bin/x86_64-linux/xdvipdfmx differ diff --git a/Master/bin/x86_64-linux/xetex b/Master/bin/x86_64-linux/xetex index 63612424257..d9be7292924 100755 Binary files a/Master/bin/x86_64-linux/xetex and b/Master/bin/x86_64-linux/xetex 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-runner.sh b/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh deleted file mode 100755 index 734ffe54c3c..00000000000 --- a/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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/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 # -- cgit v1.2.3