texlive[46798] trunk: tl18 pretest initial setup

commits+karl at tug.org commits+karl at tug.org
Sat Mar 3 19:29:06 CET 2018


Revision: 46798
          http://tug.org/svn/texlive?view=revision&revision=46798
Author:   karl
Date:     2018-03-03 19:29:03 +0100 (Sat, 03 Mar 2018)
Log Message:
-----------
tl18 pretest initial setup

Modified Paths:
--------------
    trunk/Build/source/texk/texlive/linked_scripts/Makefile.am
    trunk/Build/source/texk/texlive/linked_scripts/Makefile.in
    trunk/Master/.mkisofsrc
    trunk/Master/bin/aarch64-linux/tlcockpit
    trunk/Master/bin/amd64-freebsd/tlcockpit
    trunk/Master/bin/amd64-netbsd/tlcockpit
    trunk/Master/bin/armel-linux/tlcockpit
    trunk/Master/bin/armhf-linux/tlcockpit
    trunk/Master/bin/i386-cygwin/tlcockpit
    trunk/Master/bin/i386-darwin/tlcockpit
    trunk/Master/bin/i386-freebsd/tlcockpit
    trunk/Master/bin/i386-linux/tlcockpit
    trunk/Master/bin/i386-netbsd/tlcockpit
    trunk/Master/bin/i386-solaris/tlcockpit
    trunk/Master/bin/powerpc-darwin/tlcockpit
    trunk/Master/bin/powerpc-linux/tlcockpit
    trunk/Master/bin/sparc-solaris/tlcockpit
    trunk/Master/bin/x86_64-cygwin/tlcockpit
    trunk/Master/bin/x86_64-darwin/tlcockpit
    trunk/Master/bin/x86_64-darwinlegacy/tlcockpit
    trunk/Master/bin/x86_64-linux/afm2pl
    trunk/Master/bin/x86_64-linux/afm2tfm
    trunk/Master/bin/x86_64-linux/aleph
    trunk/Master/bin/x86_64-linux/asy
    trunk/Master/bin/x86_64-linux/autosp
    trunk/Master/bin/x86_64-linux/bbox
    trunk/Master/bin/x86_64-linux/bg5conv
    trunk/Master/bin/x86_64-linux/bibtex
    trunk/Master/bin/x86_64-linux/bibtex8
    trunk/Master/bin/x86_64-linux/bibtexu
    trunk/Master/bin/x86_64-linux/cef5conv
    trunk/Master/bin/x86_64-linux/cefconv
    trunk/Master/bin/x86_64-linux/cefsconv
    trunk/Master/bin/x86_64-linux/cfftot1
    trunk/Master/bin/x86_64-linux/chktex
    trunk/Master/bin/x86_64-linux/ctangle
    trunk/Master/bin/x86_64-linux/ctie
    trunk/Master/bin/x86_64-linux/cweave
    trunk/Master/bin/x86_64-linux/detex
    trunk/Master/bin/x86_64-linux/devnag
    trunk/Master/bin/x86_64-linux/disdvi
    trunk/Master/bin/x86_64-linux/dt2dv
    trunk/Master/bin/x86_64-linux/dv2dt
    trunk/Master/bin/x86_64-linux/dvi2tty
    trunk/Master/bin/x86_64-linux/dvibook
    trunk/Master/bin/x86_64-linux/dviconcat
    trunk/Master/bin/x86_64-linux/dvicopy
    trunk/Master/bin/x86_64-linux/dvidvi
    trunk/Master/bin/x86_64-linux/dvihp
    trunk/Master/bin/x86_64-linux/dvilj
    trunk/Master/bin/x86_64-linux/dvilj2p
    trunk/Master/bin/x86_64-linux/dvilj4
    trunk/Master/bin/x86_64-linux/dvilj4l
    trunk/Master/bin/x86_64-linux/dvipng
    trunk/Master/bin/x86_64-linux/dvipos
    trunk/Master/bin/x86_64-linux/dvips
    trunk/Master/bin/x86_64-linux/dviselect
    trunk/Master/bin/x86_64-linux/dvisvgm
    trunk/Master/bin/x86_64-linux/dvitodvi
    trunk/Master/bin/x86_64-linux/dvitype
    trunk/Master/bin/x86_64-linux/epsffit
    trunk/Master/bin/x86_64-linux/eptex
    trunk/Master/bin/x86_64-linux/euptex
    trunk/Master/bin/x86_64-linux/extconv
    trunk/Master/bin/x86_64-linux/gftodvi
    trunk/Master/bin/x86_64-linux/gftopk
    trunk/Master/bin/x86_64-linux/gftype
    trunk/Master/bin/x86_64-linux/gregorio
    trunk/Master/bin/x86_64-linux/gsftopk
    trunk/Master/bin/x86_64-linux/hbf2gf
    trunk/Master/bin/x86_64-linux/kpseaccess
    trunk/Master/bin/x86_64-linux/kpsereadlink
    trunk/Master/bin/x86_64-linux/kpsestat
    trunk/Master/bin/x86_64-linux/kpsewhich
    trunk/Master/bin/x86_64-linux/lacheck
    trunk/Master/bin/x86_64-linux/luajittex
    trunk/Master/bin/x86_64-linux/luatex
    trunk/Master/bin/x86_64-linux/mag
    trunk/Master/bin/x86_64-linux/makeindex
    trunk/Master/bin/x86_64-linux/makejvf
    trunk/Master/bin/x86_64-linux/mendex
    trunk/Master/bin/x86_64-linux/mf
    trunk/Master/bin/x86_64-linux/mf-nowin
    trunk/Master/bin/x86_64-linux/mflua
    trunk/Master/bin/x86_64-linux/mfluajit
    trunk/Master/bin/x86_64-linux/mft
    trunk/Master/bin/x86_64-linux/mktexlsr
    trunk/Master/bin/x86_64-linux/mmafm
    trunk/Master/bin/x86_64-linux/mmpfb
    trunk/Master/bin/x86_64-linux/mpost
    trunk/Master/bin/x86_64-linux/msxlint
    trunk/Master/bin/x86_64-linux/odvicopy
    trunk/Master/bin/x86_64-linux/odvitype
    trunk/Master/bin/x86_64-linux/omfonts
    trunk/Master/bin/x86_64-linux/otangle
    trunk/Master/bin/x86_64-linux/otfinfo
    trunk/Master/bin/x86_64-linux/otftotfm
    trunk/Master/bin/x86_64-linux/otp2ocp
    trunk/Master/bin/x86_64-linux/outocp
    trunk/Master/bin/x86_64-linux/patgen
    trunk/Master/bin/x86_64-linux/pbibtex
    trunk/Master/bin/x86_64-linux/pdfclose
    trunk/Master/bin/x86_64-linux/pdfopen
    trunk/Master/bin/x86_64-linux/pdftex
    trunk/Master/bin/x86_64-linux/pdftosrc
    trunk/Master/bin/x86_64-linux/pdvitype
    trunk/Master/bin/x86_64-linux/pfb2pfa
    trunk/Master/bin/x86_64-linux/pk2bm
    trunk/Master/bin/x86_64-linux/pktogf
    trunk/Master/bin/x86_64-linux/pktype
    trunk/Master/bin/x86_64-linux/pltotf
    trunk/Master/bin/x86_64-linux/pmpost
    trunk/Master/bin/x86_64-linux/pmxab
    trunk/Master/bin/x86_64-linux/pooltype
    trunk/Master/bin/x86_64-linux/ppltotf
    trunk/Master/bin/x86_64-linux/prepmx
    trunk/Master/bin/x86_64-linux/ps2pk
    trunk/Master/bin/x86_64-linux/psbook
    trunk/Master/bin/x86_64-linux/psnup
    trunk/Master/bin/x86_64-linux/psresize
    trunk/Master/bin/x86_64-linux/psselect
    trunk/Master/bin/x86_64-linux/pstops
    trunk/Master/bin/x86_64-linux/ptex
    trunk/Master/bin/x86_64-linux/ptftopl
    trunk/Master/bin/x86_64-linux/scor2prt
    trunk/Master/bin/x86_64-linux/sjisconv
    trunk/Master/bin/x86_64-linux/synctex
    trunk/Master/bin/x86_64-linux/t1ascii
    trunk/Master/bin/x86_64-linux/t1asm
    trunk/Master/bin/x86_64-linux/t1binary
    trunk/Master/bin/x86_64-linux/t1disasm
    trunk/Master/bin/x86_64-linux/t1dotlessj
    trunk/Master/bin/x86_64-linux/t1lint
    trunk/Master/bin/x86_64-linux/t1mac
    trunk/Master/bin/x86_64-linux/t1rawafm
    trunk/Master/bin/x86_64-linux/t1reencode
    trunk/Master/bin/x86_64-linux/t1testpage
    trunk/Master/bin/x86_64-linux/t1unmac
    trunk/Master/bin/x86_64-linux/t4ht
    trunk/Master/bin/x86_64-linux/tangle
    trunk/Master/bin/x86_64-linux/teckit_compile
    trunk/Master/bin/x86_64-linux/tex
    trunk/Master/bin/x86_64-linux/tex4ht
    trunk/Master/bin/x86_64-linux/tftopl
    trunk/Master/bin/x86_64-linux/tie
    trunk/Master/bin/x86_64-linux/tlcockpit
    trunk/Master/bin/x86_64-linux/ttf2afm
    trunk/Master/bin/x86_64-linux/ttf2pk
    trunk/Master/bin/x86_64-linux/ttf2tfm
    trunk/Master/bin/x86_64-linux/ttfdump
    trunk/Master/bin/x86_64-linux/ttftotype42
    trunk/Master/bin/x86_64-linux/upbibtex
    trunk/Master/bin/x86_64-linux/updvitype
    trunk/Master/bin/x86_64-linux/upmendex
    trunk/Master/bin/x86_64-linux/upmpost
    trunk/Master/bin/x86_64-linux/uppltotf
    trunk/Master/bin/x86_64-linux/uptex
    trunk/Master/bin/x86_64-linux/uptftopl
    trunk/Master/bin/x86_64-linux/vftovp
    trunk/Master/bin/x86_64-linux/vlna
    trunk/Master/bin/x86_64-linux/vptovf
    trunk/Master/bin/x86_64-linux/weave
    trunk/Master/bin/x86_64-linux/wofm2opl
    trunk/Master/bin/x86_64-linux/wopl2ofm
    trunk/Master/bin/x86_64-linux/wovf2ovp
    trunk/Master/bin/x86_64-linux/wovp2ovf
    trunk/Master/bin/x86_64-linux/xdvi-xaw
    trunk/Master/bin/x86_64-linux/xdvipdfmx
    trunk/Master/bin/x86_64-linux/xetex
    trunk/Master/bin/x86_64-solaris/tlcockpit
    trunk/Master/release-texlive.txt
    trunk/Master/texmf-dist/web2c/texmf.cnf
    trunk/Master/texmf-dist/web2c/texmfcnf.lua
    trunk/Master/tlpkg/TeXLive/TLConfig.pm
    trunk/Master/tlpkg/bin/tl-update-bindir
    trunk/Master/tlpkg/bin/tl-update-tlnet
    trunk/Master/tlpkg/doc/releng.txt
    trunk/Master/tlpkg/tlpsrc/autosp.tlpsrc
    trunk/Master/tlpkg/tlpsrc/axodraw2.tlpsrc
    trunk/Master/tlpkg/tlpsrc/luatex.tlpsrc

Added Paths:
-----------
    trunk/Build/source/texk/texlive/linked_scripts/tlcockpit/
    trunk/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh
    trunk/Build/source/texk/texlive/linked_scripts/tlshell/
    trunk/Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl
    trunk/Master/bin/x86_64-linux/axohelp
    trunk/Master/bin/x86_64-linux/luatex53
    trunk/Master/bin/x86_64-linux/tex2aspc
    trunk/Master/bin/x86_64-linux/texlua53
    trunk/Master/bin/x86_64-linux/texlua53c
    trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh

Removed Paths:
-------------
    trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh

Modified: trunk/Build/source/texk/texlive/linked_scripts/Makefile.am
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/Makefile.am	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Build/source/texk/texlive/linked_scripts/Makefile.am	2018-03-03 18:29:03 UTC (rev 46798)
@@ -206,6 +206,8 @@
 	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 @@
 
 ## 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,

Modified: trunk/Build/source/texk/texlive/linked_scripts/Makefile.in
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/Makefile.in	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Build/source/texk/texlive/linked_scripts/Makefile.in	2018-03-03 18:29:03 UTC (rev 46798)
@@ -420,6 +420,8 @@
 	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 @@
 	$(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

Added: trunk/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh	                        (rev 0)
+++ trunk/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh	2018-03-03 18:29:03 UTC (rev 46798)
@@ -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" "$@"


Property changes on: trunk/Build/source/texk/texlive/linked_scripts/tlcockpit/tlcockpit.sh
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl
===================================================================
--- trunk/Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl	                        (rev 0)
+++ trunk/Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl	2018-03-03 18:29:03 UTC (rev 46798)
@@ -0,0 +1,2136 @@
+#!/usr/bin/env wish
+
+# Copyright 2017, 2018 Siep Kroonenberg
+
+# This file is licensed under the GNU General Public License version 2
+# or any later version.
+
+package require Tk
+
+# searchpath:
+# windows: most scripts run via [w]runscript, which adjusts the searchpath
+# for the current process.
+# unix/linux: tlshell.tcl should  be run via a symlink in a directory
+# which also contains (a symlink to) kpsewhich.
+# This directory will be prepended to the searchpath.
+# kpsewhich will disentangle symlinks.
+
+# dis/enable restore dialog
+set do_restore 0
+# dis/enable debug output (only for private development purposes)
+set ddebug 0
+
+##### general housekeeping ############################################
+
+# security: disable send
+catch {rename send {}}
+
+# menus: disable tearoff feature
+option add *Menu.tearOff 0
+
+# no bold text for messages
+option add *Dialog.msg.font TkDefaultFont userDefault
+
+## italicized items; not used
+#font create it_font {*}[font configure TkDefaultFont]
+#font configure it_font -slant italic
+
+set plain_unix 0
+if {$::tcl_platform(platform) eq "unix" && \
+        $::tcl_platform(os) ne "Darwin"} {
+  set plain_unix 1
+}
+
+proc search_nocase {needle haystack} {
+  if {$needle eq ""} {return -1}
+  if {$haystack eq ""} {return -1}
+  return [string first [string tolower $needle] [string tolower $haystack]]
+}
+
+# the stderr and stdout of tlmgr are each read into lists of strings
+set err_log {}
+set out_log {}
+
+#### debug output, ATM only for private development purposes ####
+
+if $ddebug {set dbg_log {}}
+
+proc do_debug {s} {
+  if $::ddebug {
+    puts stderr $s
+    # On windows, stderr output goes nowhere.
+    # Therefore also debug output for the log toplevel.
+    lappend ::dbg_log $s
+    # Track debug output in the log toplevel if it is running:
+    if [winfo exists .tllg.dbg.tx] {
+      .tllg.dbg.tx configure -state normal
+      .tllg.dbg.tx insert end "$s\n"
+      if {$::tcl_platform(os) ne "Darwin"} {
+        .tllg.dbg.tx configure -state disabled
+      }
+    }
+  }
+} ; # do_debug
+
+proc get_stacktrace {} {
+  set level [info level]
+  set s ""
+  for {set i 1} {$i < $level} {incr i} {
+    append s [format "Level %u: %s\n" $i [info level $i]]
+  }
+  return $s
+} ; # get_stacktrace
+
+proc maketemp {ext} {
+  set fname ""
+  foreach i {0 1 2 3 4 5 6 7 8 9} { ; # ten tries
+    set fname [file join $::tempsub "[expr {int(10000.0*rand())}]$ext"]
+    if {[file exist $fname]} {set fname ""; continue}
+    # create empty file. although we just want a name,
+    # we must make sure that it can be created.
+    set fid [open $fname w]
+    close $fid
+    if {! [file exists $fname]} {error "Cannot create temporary file"}
+    if {$::tcl_platform(platform) eq "unix"} {
+      file attributes $fname -permissions 0600
+    }
+    break
+  }
+  if {$fname eq ""} {error "Cannot create temporary file"}
+  return $fname
+} ; # maketemp
+
+set tempsub "" ; # subdir for temp files, set during initialization
+
+### GUI utilities #####################################################
+
+# dummy widgets for vertical spacing within $w
+set idummy -1
+proc spacing {w} {
+  incr ::idummy
+  pack [ttk::label $w.$::idummy -text " "]
+}
+
+proc pgrid {wdg args} { ; # grid command with padding
+  grid $wdg {*}$args -padx 3 -pady 3
+}
+
+proc ppack {wdg args} { ; # pack command with padding
+  pack $wdg {*}$args -padx 3 -pady 3
+}
+
+# mouse clicks: deal with MacOS platform differences
+if {[tk windowingsystem] eq "aqua"} {
+  event add <<RightClick>> <ButtonRelease-2> <Control-ButtonRelease-1>
+} else {
+  event add <<RightClick>> <ButtonRelease-3>
+}
+
+## default_bg color, only used for menus under ::plain_unix
+if [catch {ttk::style lookup TFrame -background} ::default_bg] {
+  set ::default_bg white
+}
+
+# unicode symbols as fake checkboxes in ttk::treeview widgets
+proc mark_sym {mrk} {
+  if $mrk {
+    return "\u25A3" ; # 'white square containing black small square'
+  } else {
+    return "\u25A1" ; # 'white square'
+  }
+} ; # mark_sym
+
+# place a toplevel, or at least its upperleft corner, centered wrt its parent
+proc place_dlg {wnd {p ""}} {
+  if {$p eq ""} {
+    set p [winfo toplevel [winfo parent $wnd]]
+    if {$p eq ""} return
+  }
+  set g [wm geometry $p]
+  scan $g "%dx%d+%d+%d" pw ph px py
+  set hcenter [expr {$px + $pw / 2}]
+  set vcenter [expr {$py + $ph / 2}]
+  set g [wm geometry $wnd]
+  set wh [winfo reqheight $wnd]
+  set ww [winfo reqwidth $wnd]
+  set wx [expr {$hcenter - $ww / 2}]
+  if {$wx < 0} { set wx 0}
+  set wy [expr {$vcenter - $wh / 2}]
+  if {$wy < 0} { set wy 0}
+  wm geometry $wnd [format "+%d+%d" $wx $wy]
+  wm attributes $wnd -topmost 1
+  wm attributes $p -topmost 0
+  wm state $wnd normal
+  raise $wnd $p
+  tkwait visibility $wnd
+  if {$::tcl_platform(platform) ne "windows"} {
+    # dont understand why these give trouble in windows
+    focus $wnd
+    grab set $wnd
+  }
+} ; # place_dlg
+
+proc long_message {str type {p "."}} {
+  # alternate messagebox implemented as custom dialog
+  # not all message types are supported
+  if {$type ne "ok" && $type ne "okcancel" && $type ne "yesnocancel"} {
+    err_exit "Illegal type $type for long_message"
+  }
+  set ::lms_parent $p
+  unset -nocomplain ::lms_var
+  do_debug "type $type"
+  catch {destroy .tlmg}
+  toplevel .tlmg -class Dialog
+  wm withdraw .tlmg
+  wm transient .tlmg .
+  if $::plain_unix {wm attributes .tlmg -type dialog}
+
+  # wallpaper frame; see make_widgets
+  pack [ttk::frame .tlmg.bg] -fill both -expand 1
+  ppack [ttk::frame .tlmg.tx] -in .tlmg.bg -side top -fill both -expand 1
+  pack [ttk::scrollbar .tlmg.tx.scroll -command ".tlmg.tx.txt yview"] \
+      -side right -fill y
+  ppack [text .tlmg.tx.txt -height 20 -width 60 -bd 2 -relief groove \
+      -wrap word -yscrollcommand ".tlmg.tx.scroll set"] -expand 1 -fill both
+
+  .tlmg.tx.txt insert end $str
+  .tlmg.tx.txt configure -state disabled
+
+  # buttons
+  pack [ttk::frame .tlmg.bts] -in .tlmg.bg -side bottom -fill x
+  if {$type eq "ok" || $type eq "okcancel"} {
+    ttk::button .tlmg.ok -text "ok" -command \
+        {raise $::lms_parent; destroy .tlmg; set ::lms_var "ok"}
+    ppack .tlmg.ok -in .tlmg.bts -side right
+  }
+  if {$type eq "yesnocancel"} {
+    ttk::button .tlmg.yes -text "yes" -command \
+      {raise $::lms_parent; destroy .tlmg; set::lms_var "yes"}
+    ppack .tlmg.yes -in .tlmg.bts -side right
+    ttk::button .tlmg.no -text "no" -command \
+      {raise $::lms_parent; destroy .tlmg; set ::lms_var "no"}
+    ppack .tlmg.no -in .tlmg.bts -side right
+  }
+  if {$type eq "yesnocancel" || $type eq "okcancel"} {
+    ttk::button .tlmg.cancel -text "cancel" -command \
+        {raise $::lms_parent; destroy .tlmg; set ::lms_var "cancel"}
+    ppack .tlmg.cancel -in .tlmg.bts -side right
+  }
+
+  place_dlg .tlmg $::lms_parent
+  tkwait variable ::lms_var
+  return $::lms_var
+} ; # long_message
+
+proc any_message {str type {p "."}} {
+  if {[string length $str] < 400} {
+    if {$type ne "ok"} {
+      return [tk_messageBox -message $str -type $type -parent $p \
+                 -icon question]
+    } else {
+      return [tk_messageBox -message $str -type $type -parent $p]
+    }
+  } else {
+    # just hope that tcl will do the right thing with multibyte characters
+    if {[string length $str] > 500000} {
+      set str [string range $str 0 500000]
+      append str "\n....."
+    }
+    return [long_message $str $type $p]
+  }
+} ; # any_message
+
+### enabling and disabling user interaction
+
+proc enable_menu_controls {yesno} {
+  if {! $yesno} {
+    . configure -menu .mn_empty
+    return
+  }
+  . configure -menu .mn
+  if {! $::n_updates} {
+    .mn.pkg entryconfigure $::inx_upd_all -state disabled
+    .mn.pkg entryconfigure $::inx_upd_tlmgr -state disabled
+  } elseif $::need_update_tlmgr {
+    .mn.pkg entryconfigure $::inx_upd_all -state disabled
+    .mn.pkg entryconfigure $::inx_upd_tlmgr -state normal
+  } else {
+    .mn.pkg entryconfigure $::inx_upd_all -state normal
+    .mn.pkg entryconfigure $::inx_upd_tlmgr -state disabled
+  }
+  if {$::tcl_platform(platform) ne "windows"} {
+    if $::have_remote {
+      .mn.opt entryconfigure $::inx_platforms -state normal
+    } else {
+      .mn.opt entryconfigure $::inx_platforms -state disabled
+    }
+  }
+}; # enable_menu_controls
+
+proc enable_widgets {yesno} {
+  # This proc should cover all active interface elements of the main window.
+  # But if actions are initiated via a dialog, the main window can be
+  # deactivated simply by a grab and focus on the dialog.
+  enable_menu_controls $yesno
+
+  if $yesno {
+    set st !disabled
+    set ::busy "IDLE"
+  } else {
+    set st disabled
+    set ::busy "BUSY"
+  }
+
+  # command entry
+  .ent.b configure -state $st
+  .ent.e configure -state $st
+
+  # filter options
+  # status
+  .pkfilter.inst configure -state $st
+  .pkfilter.alls configure -state $st
+  .pkfilter.upd configure -state $st
+  # detail
+  .pkfilter.alld configure -state $st
+  .pkfilter.coll configure -state $st
+  .pkfilter.schm configure -state $st
+
+  # mark commands
+  .mrk_all configure -state $st
+  .mrk_none configure -state $st
+
+  # search
+  .pksearch.e configure -state $st
+  .pksearch.d configure -state $st
+
+  # packages
+  #.pkglist configure -state $st
+  .pkglist state $st
+
+  # final buttons
+  .q configure -state $st
+  .r configure -state $st
+  .t configure -state $st
+  .showlogs configure -state $st
+} ; # enable_widgets
+
+##### tl global data ##################################################
+
+set last_cmd ""
+
+set progname [info script]
+regexp {^.*[\\/]([^\\/\.]*)(?:\....)?$} $progname dummy progname
+set procid [pid]
+
+# package repository (no suport for a one-off repository switch)
+set repo ""
+# while selecting another repo:
+set new_repo ""
+
+# mirrors: dict of dicts of lists of urls per country per continent
+set mirrors {}
+
+# dict of (local and global) package dicts
+set pkgs [dict create]
+
+set have_remote 0 ; # remote packages info not loaded
+set need_update_tlmgr 0
+set n_updates 0
+set tlshell_updatable 0
+
+## data to be displayed ##
+
+# sorted display data for packages; package data stored as lists
+set filtered [dict create]
+
+# selecting packages for display: status and detail
+set stat_opt "inst"
+set dtl_opt "all"
+# searching packages for display; also search short descriptions?
+set search_desc 0
+
+##### handling tlmgr via pipe and stderr tempfile #####################
+
+set prmpt "tlmgr>"
+set busy "BUSY"
+
+# about [chan] gets:
+# if a second parameter, in this case l, is supplied
+# then this variable receives the result, with EOL stripped,
+# and the return value is the string length, possibly 0
+# EOF is indicated by a return value of -1.
+
+proc read_err_tempfile {} {
+  set len 0
+  while 1 {
+    set len [chan gets $::err l]
+    if {$len >= 0} {
+      lappend ::err_log $l
+    } else {
+      break
+    }
+  }
+} ; # read_err_tempfile
+
+proc err_exit {} {
+  do_debug "error exit"
+  read_err_tempfile
+  any_message [join $::err_log "\n"] "ok"
+  exit
+} ; # err_exit
+
+# Capture stdout of tlmgr into a pipe $::tlshl,
+# stderr into a temp file file $::err_file which is set at initialization.
+
+proc start_tlmgr {{args ""}} {
+  # Start the TeX Live Manager shell interface.
+  # Below, vwait ::done_waiting forces tlshell
+  # to process initial tlmgr output before continuing.
+  unset -nocomplain ::done_waiting
+  do_debug "opening tlmgr"
+  if [catch \
+          {open "|tlmgr $args --machine-readable shell 2>>$::err_file" w+} \
+          ::tlshl] {
+    tk_messageBox -message [get_stacktrace]
+    exit
+  }
+  do_debug "done opening tlmgr"
+  set ::err [open $::err_file r]
+  chan configure $::tlshl -buffering line -blocking 0
+  chan event $::tlshl readable read_line
+  vwait ::done_waiting
+} ; # start_tlmgr
+
+proc close_tlmgr {} {
+  catch {chan close $::tlshl}
+  catch {chan close $::err}
+}; # close_tlmgr
+
+# read a line of tlmgr output
+proc read_line {} {
+  # a caller of run_cmd needs to explicitly invoke 'vwait ::done_waiting'
+  # if it wants to wait for the command to finish
+  set l "" ; # will contain the line to be read
+  if {([catch {chan gets $::tlshl l} len] || [chan eof $::tlshl])} {
+    #do_debug "read_line: failing to read "
+    puts stderr "Read failure; tlmgr command was $::last_cmd"
+    catch {chan close $::tlshl}
+    # note. the right way to terminate is terminating the GUI shell.
+    # This closes stdin of tlmgr shell.
+    err_exit
+  } elseif {$len >= 0} {
+    # do_debug "read: $l"
+    if $::ddebug {puts $::flid $l}
+    if {[string first $::prmpt $l] == 0} {
+      # prompt line: we are done with the current command
+      enable_widgets 1 ; # this may have to be redone later
+      # catch up with stderr
+      read_err_tempfile
+      if {$::pipe_cb ne ""} {
+        do_debug "prompt found, $l"
+        $::pipe_cb "finish"
+      }
+      # for vwait:
+      set ::done_waiting 1
+    } else {
+      # regular output
+      lappend ::out_log $l
+      if {$::pipe_cb ne ""} {$::pipe_cb "line" "$l"}
+    }
+  }
+} ; # read_line
+
+# copy error strings to error page in logs toplevel .tllg and send it to top.
+# This by itself does not map the logs toplevel .tllg
+
+proc show_err_log {} {
+  #do_debug "show_err_log"
+  .tllg.err.tx configure -state normal
+  .tllg.err.tx delete 1.0 end
+  if {[llength $::err_log] > 0} {
+    foreach l $::err_log {.tllg.err.tx insert end "$l\n"}
+    .tllg.err.tx yview moveto 1
+    .tllg.logs select .tllg.err
+  }
+  if {$::tcl_platform(os) ne "Darwin"} {
+    # os x: text widget disabled => no selection possible
+    .tllg.err.tx configure -state disabled
+  }
+} ; # show_err_log
+
+##### running tlmgr commands #####
+
+# optional callback for run_cmds/read_line:
+set pipe_cb ""
+
+# run a list of commands
+proc run_cmds {cmds {cb ""}} {
+  set ::pipe_cb $cb
+  do_debug "run_cmds \"$cmds\""
+  if $::ddebug {puts $::flid "\n$cmds"}
+  enable_widgets 0
+  set ::out_log {}
+  set ::err_log {}
+  if {$::pipe_cb ne ""} {$::pipe_cb "init"}
+  set l [llength $cmds]
+  for {set i 0} {$i<$l} {incr i} {
+    set cmd [lindex $cmds $i]
+    set ::last_cmd $cmd
+    unset -nocomplain ::done_waiting
+    chan puts $::tlshl $cmd
+    chan flush $::tlshl
+    if {$i < [expr {$l-1}]} {vwait ::done_waiting}
+  }
+} ; # run_cmds
+
+# run a single command
+proc run_cmd {cmd {cb ""}} {
+  run_cmds [list $cmd] $cb
+} ; # run_cmd
+
+proc run_cmd_waiting {cmd} {
+  run_cmd $cmd
+  vwait ::done_waiting
+} ; # run_cmd_waiting
+
+##### callbacks for file events of tlmgr pipe ::tlshl (names *_cb) ####
+
+# callback for reading tlmgr pipe.
+# but maybe we just want a boolean whether or not to write
+# to the logs notebook.
+# consider writing log to file, always or on demand
+
+# In init mode, it is invoked by run_cmds, otherwise by read_line
+
+## template for pipe callback:
+#proc template_cb {mode {l ""}} {
+#  if {$mode eq "line"} {
+#    # do something
+#  } elseif {$mode eq "init"} {
+#    # do something
+#  } elseif {$mode eq "finish"} {
+#    # do something BUT DO NOT TRIGGER ANOTHER EVENT LOOP
+#  } else {
+#    lappend ::err_log "Illegal call of whatever_cb"
+#    err_exit
+#  }
+#}
+
+proc log_widget_cb {mode {l ""}} {
+  if {$mode eq "line"} {
+    .tllg.log.tx configure -state normal
+    .tllg.log.tx insert end "$l\n"
+    if {$::tcl_platform(os) ne "Darwin"} {
+      .tllg.log.tx configure -state disabled
+    }
+  } elseif {$mode eq "init"} {
+    show_logs
+    .tllg.status configure -text "Running"
+    .tllg.close configure -state disabled
+  } elseif {$mode eq "finish"} {
+    .tllg.log.tx yview moveto 1
+    .tllg.logs select .tllg.log
+    # error log on top if it contains anything
+    show_err_log
+    if {$::tcl_platform(os) ne "Darwin"} {
+      .tllg.log.tx configure -state disabled
+    }
+    .tllg.status configure -text "Idle"
+    .tllg.close configure -state !disabled
+    # the caller, read_line, will set ::done_waiting after
+    # this callback returns from finish mode
+  } else {
+    lappend ::err_log "Illegal call of log_widget_cb"
+    err_exit
+  }
+} ; # log_widget_cb
+
+##### Handling package info #####
+
+# what invokes what?
+# The main 'globals' are:
+
+# ::have_remote is initialized to false. It is set to true by
+# get_packages_info_remote, and remains true except temporarily at
+# a change of repository.
+
+# The other globals ones are ::n_updates, ::need_update_tlmgr and
+# ::tlshell_updatable. These are initially set to 0 and re-calculated
+# by update_globals.
+
+# update_globals is invoked by get_packages_info_remote and
+# update_local_revnumbers. It enables and disables buttons as appropriate.
+
+# displayed global status info is updated by update_globals.
+# update button/menu states are set at initialization and updated
+# by update_globals, both via the enable_menu_controls proc
+
+# get_packages_info_local is invoked only once, at initialization.  After
+# installations and removals, the collected information is updated by
+# update_local_revnumbers.
+
+# get_packages_info_remote will be invoked by collect_filtered if
+# ::have_remote is false. Afterwards, ::have_remote will be true, and
+# therefore get_packages_info_remote will not be called again.
+# get_packages_info_remote invokes update_globals.
+
+# update_local_revnumbers will be invoked after any updates. It also
+# invokes update_globals.
+
+# collect_filtered does not only filter, but also organize the
+# information to be displayed.  If necessary, it invokes
+# get_packages_info_remote and always invokes display_packes_info.
+# It is invoked at initialization, when filtering options change and
+# at the end of install-, remove- and update procs.
+
+# display_packages_info is mostly invoked by collect_filtered, but
+# also when the search term or the search option changes.
+
+proc check_tlmgr_updatable {} {
+  run_cmd_waiting "update --self --list"
+  foreach l $::out_log {
+    if [regexp {^total-bytes[ \t]+([0-9]+)$} $l m b] {
+      do_debug "matches, $b"
+      set ::need_update_tlmgr [expr {$b > 0 ? 1 : 0}]
+      return
+    }
+  }
+  do_debug "check_tlmgr_uptodate: should not get here"
+} ; # check_tlmgr_uptodate
+
+proc is_updatable {nm} {
+  set pk [dict get $::pkgs $nm]
+  set lr [dict get $pk localrev]
+  set rr [dict get $pk remoterev]
+  return [expr {$lr > 0 && $rr > 0 && $rr > $lr}]
+}
+
+proc update_globals {} {
+  if {! $::have_remote} return
+  set ::n_updates 0
+  foreach nm [dict keys $::pkgs] {
+    if [is_updatable $nm] {incr ::n_updates}
+  }
+  check_tlmgr_updatable
+  set ::tlshell_updatable [is_updatable tlshell]
+
+  # also update displayed status info
+  if {$::have_remote && $::need_update_tlmgr} {
+    .topf.luptodate configure -text "Needs updating"
+  } elseif $::have_remote {
+    .topf.luptodate configure -text "Up to date"
+  } else {
+    .topf.luptodate configure -text "Unknown"
+  }
+  # ... and status of update buttons
+  enable_menu_controls 1
+}
+
+# The package display treeview widget in the main window has columns
+# for both local and remote revision numbers.
+# It gets its data from $::filtered rather than directly from $::pkgs.
+# ::pkgs should already be up to date.
+
+# I added a field 'marked' to ::pkgs. It is displayed in the first treeview
+# column. This looks better than the treeview tag facilities.
+# In ::pkgs, 'marked' is represented as a boolean.
+# In ::filtered and .pkglist they are represented as unicode symbols.
+
+# display packages obeying both filter and search string.
+# even on a relatively slow system, regenerating .pkglist from ::filtered
+# at every keystroke is acceptably responsive.
+# with future more advanced search options, this scheme may not suffice.
+
+proc display_packages_info {} {
+  # do_debug [get_stacktrace]
+  set curr [.pksearch.e get]
+  .pkglist delete [.pkglist children {}]
+  dict for {nm pk} $::filtered {
+    set do_show 0
+    if {$curr eq ""} {
+      set do_show 1
+    } elseif {[search_nocase $curr $nm] >= 0} {
+      set do_show 1
+    } elseif {$::search_desc && \
+          [search_nocase $curr [dict get $::pkgs $nm shortdesc]] >= 0} {
+      set do_show 1
+    }
+    if $do_show {
+      .pkglist insert {} end -id $nm -values $pk
+    }
+  }
+} ; # display_packages_info
+
+# (re)create ::filtered dictionary; disregard search string.
+# The value associated with each key/package is a list, not another dict.
+proc collect_filtered {} {
+  do_debug \
+      "collect_filtered for $::stat_opt and $::dtl_opt"
+  if {$::stat_opt ne "inst" && ! $::have_remote} {
+    get_packages_info_remote
+  }
+  foreach nm [dict keys $::filtered] {
+    dict unset ::filtered $nm
+  }
+  foreach nm [lsort [dict keys $::pkgs]] {
+    set pk [dict get $::pkgs $nm]
+    set do_show 1
+    set mrk [mark_sym [dict get $pk marked]]
+    set lr [dict get $pk localrev]
+    set rr [dict get $pk remoterev]
+    set ct [dict get $pk category]
+    if {$::stat_opt eq "inst" && $lr == 0} {
+      set do_show 0
+    } elseif {$::stat_opt eq "upd" && ($lr == 0 || $rr == 0 || $rr <= $lr)} {
+      set do_show 0
+    }
+    if {! $do_show} continue
+    if {$::dtl_opt eq "schm" && $ct ne "Scheme"} {
+      set do_show 0
+    } elseif {$::dtl_opt eq "coll" && \
+        $ct ne "Scheme" && $ct ne "Collection"} {
+      set do_show 0
+    }
+    if {! $do_show} continue
+
+    # collect data to be displayed for $nm
+    dict lappend ::filtered $nm $mrk
+    dict lappend ::filtered $nm $nm
+    set v [dict get $pk localrev]
+    set lv [dict get $pk lcatv]
+    if {$v eq "0" || $v == 0} {
+      set v ""
+    } elseif {$lv != 0 && $lv ne ""} {
+      set v "$v ($lv)"
+    }
+    dict lappend ::filtered $nm $v
+    set v [dict get $pk remoterev]
+    set rv [dict get $pk rcatv]
+    if {$v eq "0" || $v == 0} {
+      set v ""
+    } elseif {$rv != 0 && $rv ne ""} {
+      set v "$v ($rv)"
+    }
+    dict lappend ::filtered $nm $v
+    dict lappend ::filtered $nm [dict get $pk shortdesc]
+  }
+  display_packages_info
+} ; # collect_filtered
+
+# get fresh package list. invoked at program start
+# some local packages may not be available online.
+# to test, create local dual-platform installation from dvd, try to update
+# from more recent linux-only installation
+
+proc get_packages_info_local {} {
+  # start from scratch; see also update_local_revnumbers
+  foreach nm [dict keys $::pkgs] {
+    dict unset ::pkgs $nm
+  }
+  set ::have_remote 0
+  set ::need_update_tlmgr 0
+  set ::updatable 0
+  set ::tlshell_updatable 0
+
+  run_cmd_waiting \
+    "info --only-installed --data name,localrev,cat-version,category,shortdesc"
+  set re {^([^,]+),([0-9]+),([^,]*),([^,]*),(.*)$}
+  foreach l $::out_log {
+    if [regexp $re $l m nm lrev lcatv catg pdescr] {
+      # double-quotes in short description: remove outer, unescape inner
+      if {[string index $pdescr 0] eq "\""} {
+        set pdescr [string range $pdescr 1 end-1]
+      }
+      set pdescr [string map {\\\" \"} $pdescr]
+      dict set ::pkgs $nm \
+          [list "marked" 0 "localrev" $lrev "lcatv" $lcatv "remoterev" 0 \
+               "rcatv" 0 "category" $catg shortdesc $pdescr]
+    }
+  }
+} ; # get_packages_info_local
+
+# remote: preserve information on installed packages
+proc get_packages_info_remote {} {
+  # remove non-local database entries
+  foreach k [dict keys $::pkgs] {
+    if {! [dict get $::pkgs $k localrev]} {
+      dict unset ::pkgs $k
+    }
+  }
+  set ::need_update_tlmgr 0
+  set ::updatable 0
+  set ::tlshell_updatable 0
+
+  if [catch {run_cmd_waiting \
+    "info --data name,localrev,remoterev,cat-version,category,shortdesc"}] {
+    do_debug [get_stacktrace]
+    tk_messageBox -message \
+        "Repository $::repo unavailable. Please choose another one."
+    return 0
+  }
+  set re {^([^,]+),([0-9]+),([0-9]+),([^,]*),([^,]*),(.*)$}
+  foreach l $::out_log {
+    if [regexp $re $l m nm lrev rrev rcatv catg pdescr] {
+      # double-quotes in short description: remove outer, unescape inner
+      if {[string index $pdescr 0] eq "\""} {
+        set pdescr [string range $pdescr 1 end-1]
+      }
+      set pdescr [string map {\\\" \"} $pdescr]
+      if [catch {dict get $::pkgs $nm} pk] {
+        # package entry does not yet exist, create it
+        dict set ::pkgs $nm [list "marked" 0 "localrev" 0 "lcatv" 0]
+      }
+      dict set ::pkgs $nm "remoterev" $rrev
+      dict set ::pkgs $nm "rcatv" $rcatv
+      dict set ::pkgs $nm "category" $catg
+      dict set ::pkgs $nm "shortdesc" $pdescr
+    }
+  }
+  set ::have_remote 1
+  .topf.loaded configure -text "Loaded"
+  update_globals
+  return 1
+} ; # get_packages_info_remote
+
+## update ::pkgs after installing packages without going online again.
+proc update_local_revnumbers {} {
+  do_debug "update_local_revnumbers"
+  run_cmd_waiting "info --only-installed --data name,localrev,cat-version"
+  set re {^([^,]+),([0-9]+),(.*)$}
+  dict for {pk pk_dict} $::pkgs {
+    do_debug "zeroing local data for $pk"
+    dict set pk_dict "localrev" 0
+    dict set pk_dict "lcatv" 0
+    dict set ::pkgs $pk $pk_dict
+  }
+  foreach l $::out_log {
+    if [regexp $re $l m pk lr lv] {
+      set pk_dict [dict get $::pkgs $pk]
+      dict set pk_dict "localrev" $lr
+      dict set pk_dict "lcatv" $lv
+      dict set ::pkgs $pk $pk_dict
+    }
+  }
+  update_globals
+} ; # update_local_revnumbers
+
+##### Dialogs and their supporting procs ##############################
+
+# look at dialog.tcl, part of Tk itself, how to implement dialog-type behavior
+
+# So far:
+# - logs notebook,
+# - maybe a toplevel for restoring packages from backup, and
+# - a toplevel for picking a different local or remote repository.
+
+##### logs notebook #####
+
+# if invoked via log_widget_cb init, it tracks progress of a tlmgr command.
+# log_widget_cb will temporarily disable the close button
+# and set .tllg.status to busy.
+# otherwise, it shows the output of the last completed (list of) command(s).
+
+# Note that run_cmds clears ::out_log and ::err_log, but not ::dbg_log.
+
+proc show_logs {} {
+  toplevel .tllg -class Dialog
+  wm withdraw .tllg
+  set p [winfo toplevel [winfo parent .tllg]]
+  wm transient .tllg $p
+  wm title .tllg Logs
+  if $::plain_unix {wm attributes .tllg -type dialog}
+
+  # wallpaper
+  pack [ttk::frame .tllg.bg] -fill both -expand 1
+
+  ttk::frame .tllg.log
+  pack [ttk::scrollbar .tllg.log.scroll -command ".tllg.log.tx yview"] \
+      -side right -fill y
+  ppack [text .tllg.log.tx -height 10 -wrap word \
+      -yscrollcommand ".tllg.log.scroll set"] \
+      -expand 1 -fill both
+  .tllg.log.tx configure -state normal
+  foreach l $::out_log {
+    .tllg.log.tx insert end "$l\n"
+  }
+  if {$::tcl_platform(os) ne "Darwin"} {.tllg.log.tx configure -state disabled}
+  .tllg.log.tx yview moveto 1
+
+  ttk::frame .tllg.err
+  pack [ttk::scrollbar .tllg.err.scroll -command ".tllg.err.tx yview"] \
+      -side right -fill y
+  ppack [text .tllg.err.tx -height 10 -wrap word \
+      -yscrollcommand ".tllg.err.scroll set"] \
+      -expand 1 -fill both
+  .tllg.err.tx configure -state normal
+  foreach l $::err_log {
+    .tllg.err.tx configure -state normal
+    .tllg.err.tx insert end "$l\n"
+  }
+  if {$::tcl_platform(os) ne "Darwin"} {.tllg.err.tx configure -state disabled}
+  .tllg.err.tx yview moveto 1
+
+  if $::ddebug {
+    ttk::frame .tllg.dbg
+    pack [ttk::scrollbar .tllg.dbg.scroll -command ".tllg.dbg.tx yview"] \
+        -side right -fill y
+    ppack [text .tllg.dbg.tx -height 10 -bd 2 -relief groove -wrap word \
+        -yscrollcommand ".tllg.dbg.scroll set"] \
+        -expand 1 -fill both
+    .tllg.dbg.tx configure -state normal
+    foreach l $::dbg_log {
+      .tllg.dbg.tx insert end "$l\n"
+    }
+    if {$::tcl_platform(os) ne "Darwin"} {.tllg.dbg.tx configure -state disabled}
+    .tllg.dbg.tx yview moveto 1
+  }
+
+  pack [ttk::notebook .tllg.logs] -in .tllg.bg -side top -fill both -expand 1
+  .tllg.logs add .tllg.log -text "Output"
+  .tllg.logs add .tllg.err -text "Errors"
+  if $::ddebug {
+    .tllg.logs add .tllg.dbg -text "Debug"
+    raise .tllg.dbg .tllg.logs
+  }
+  raise .tllg.err .tllg.logs
+  raise .tllg.log .tllg.logs
+
+  pack [ttk::frame .tllg.bottom] -in .tllg.bg -side bottom -fill x
+  ttk::button .tllg.close -text close -command {
+    set p [winfo toplevel [winfo parent .tllg]]
+    if {$p eq ""} {set p "."}
+    raise $p; destroy .tllg}
+  ppack .tllg.close -in .tllg.bottom -side right -anchor e
+  ppack [ttk::label .tllg.status -anchor w] -in .tllg.bottom -side left
+
+  place_dlg .tllg $p
+  wm resizable .tllg 1 1
+} ; # show_logs
+
+##### repositories #####
+
+proc get_repo {} {
+  run_cmd_waiting "option repository"
+  # this returns the configured repository.
+  # for now, do not support a temporary change.
+  set re {repository\t(.*)$}
+  foreach l $::out_log {
+    if [regexp $re $l m ::repo] break
+  }
+} ; # get_repo
+
+proc is_repo_local {r} {
+  set db [file join $r "tlpkg/texlive.tlpdb"]
+  return [file exists $db]
+}
+
+### mirrors
+
+proc edit_name {n} {
+  set n [string tolower $n]
+  set n [string map {" "  "_"} $n]
+  return $n
+} ; # edit_name
+
+set mirrors [dict create]
+proc read_mirrors {} {
+  if [catch {open [file join [exec kpsewhich -var-value SELFAUTOPARENT] \
+                       "tlpkg/installer/ctan-mirrors.pl"] r} fm] {return 0}
+    set re_geo {^\s*'([^']+)' => \{\s*$}
+  set re_url {^\s*'(.*)' => ([0-9]+)}
+  set re_clo {^\s*\},?\s*$}
+  set starting 1
+  set lnum 0 ; # line number for error messages
+  set ok 1 ; # no errors encountered yet
+  set countries {} ; # aggregate list of countries
+  set urls {} ; # aggregate list of urls
+  set continent ""
+  set country ""
+  set u ""
+  set in_cont 0
+  set in_coun 0
+  while {! [catch {chan gets $fm} line] && ! [chan eof $fm]} {
+    incr lnum
+    if $starting {
+      if {[string first "\$mirrors =" $line] == 0} {
+        set starting 0
+        continue
+      } else {
+        set ok 0
+        set msg "Unexpected line '$line' at start"
+        break
+      }
+    }
+    # starting is now dealt with.
+    if [regexp $re_geo $line dummy c] {
+      if {! $in_cont} {
+        set in_cont 1
+        set continent $c
+        set cont_dict [dict create]
+        if {$continent in [dict keys $::mirrors]} {
+          set ok 0
+          set msg "Duplicate continent $c at line $lnum"
+          break
+        }
+      } elseif {! $in_coun} {
+        set in_coun 1
+        set country $c
+        if {$country in $countries} {
+          set ok 0
+          set msg "Duplicate country $c at line $lnum"
+          break
+        }
+        lappend countries $country
+        dict set cont_dict $country {}
+      } else {
+        set ok 0
+        set msg "Unexpected continent- or country line $line at line $lnum"
+        break
+      }
+    } elseif [regexp $re_url $line dummy u n] {
+      if {! $in_coun} {
+        set ok 0
+        set msg "Unexpected url line $line at line $lnum"
+        break
+      } elseif {$n ne "1"} {
+        continue
+      }
+      append u "systems/texlive/tlnet"
+      if {$u in $urls} {
+          set ok 0
+          set msg "Duplicate url $u at line $lnum"
+          break
+      }
+      dict lappend cont_dict $country $u
+      lappend urls $u
+      set u ""
+    } elseif [regexp $re_clo $line] {
+      if $in_coun {
+        set in_coun 0
+        set country ""
+      } elseif $in_cont {
+        set in_cont 0
+        dict set ::mirrors $continent $cont_dict
+        set continent ""
+      } else {
+        break ; # should close mirror list
+      }
+    } ; # ignore other lines
+  }
+  close $fm
+  if {! $ok} {do_debug $msg}
+} ; # read_mirrors
+
+proc find_local_repo {} {
+  if [is_repo_local $::new_repo] {
+    set inidir $::new_repo
+  } elseif [is_repo_local $::repo] {
+    set inidir $::repo
+  } else {
+    set inidir $::env(HOME) ; # HOME also ok for windows
+  }
+  set ::new_repo ""
+  while 1 {
+    set ::new_repo [tk_chooseDirectory -initialdir $inidir -mustexist 1 \
+                        -parent .tlr -title "Local repository..."]
+    if {$::new_repo ne "" && ! [is_repo_local $::new_repo]} {
+      tk_messageBox -message "$::new_repo not a repository" -parent .tlr
+      set inidir $::new_repo
+      set ::new_repo ""
+      continue
+    } else {
+      break
+    }
+  }
+} ; # find_local_repo
+
+proc close_repos {} {
+  raise .
+  destroy .tlr
+  set ::repo $::new_repo
+  if {$::tcl_platform(platform) eq "windows"} {
+    set ::repo [string map {\\ /} $::repo]
+  }
+  set ::new_repo ""
+  run_cmd_waiting "option repository $::repo"
+  close_tlmgr
+  start_tlmgr
+  # reload remote package information
+  set ::have_remote 0
+  get_packages_info_remote
+  collect_filtered
+} ; # close_repos
+
+proc repositories {} {
+
+  set ::new_repo $::repo
+
+  # dialog toplevel with
+  # - popup menu of mirrors (parse tlpkg/installer/ctan-mirrors.pl)
+  # - text entry box
+  # - directory browser button
+  # - ok and cancel buttons
+
+  toplevel .tlr -class Dialog
+  wm withdraw .tlr
+  wm transient .tlr .
+  wm title .tlr "Repositories"
+  if $::plain_unix {wm attributes .tlr -type dialog}
+
+  # wallpaper frame; see make_widgets
+  pack [ttk::frame .tlr.bg] -expand 1 -fill x
+
+  pack [ttk::frame .tlr.info] -in .tlr.bg -fill x
+  grid columnconfigure .tlr.info 1 -weight 1
+  set row -1
+
+  # current repository
+  incr row
+  pgrid [ttk::label .tlr.lcur -text "Current:"] \
+      -in .tlr.info -row $row -column 0 -sticky w
+  pgrid [ttk::label .tlr.cur -textvariable ::repo] \
+      -in .tlr.info -row 0 -column 1 -sticky w
+  # new repository
+  incr row
+  pgrid [ttk::label .tlr.lnew -text "New"] \
+      -in .tlr.info -row $row -column 0 -sticky w
+  pgrid [ttk::entry .tlr.new -textvariable ::new_repo -width 40] \
+      -in .tlr.info -row $row -column 1 -columnspan 2 -sticky w
+
+  ### three ways to specify a repository ###
+  pack [ttk::frame .tlr.mirbuttons] -in .tlr.bg -fill x
+  # default remote repository
+  ttk::button .tlr.ctan -text "Any CTAN mirror" \
+      -command {set ::new_repo "http://mirror.ctan.org/systems/texlive/tlnet"}
+  ppack .tlr.ctan -in .tlr.mirbuttons -side left -fill x
+  # freshly create a cascading mirror dropdown menu
+  destroy .tlr.mir.m
+  if {[dict size $::mirrors] == 0} read_mirrors
+  if {[dict size $::mirrors] > 0} {
+    ttk::menubutton .tlr.mir -text "Specific mirror..." -direction below \
+      -menu .tlr.mir.m
+    ppack .tlr.mir -in .tlr.mirbuttons -side left -fill x
+    menu .tlr.mir.m
+    dict for {cont d_cont} $::mirrors {
+      set c_ed [edit_name $cont]
+      menu .tlr.mir.m.$c_ed
+      .tlr.mir.m add cascade -label $cont -menu .tlr.mir.m.$c_ed
+      dict for {cntr urls} $d_cont {
+        set n_ed [edit_name $cntr]
+        menu .tlr.mir.m.$c_ed.$n_ed
+        .tlr.mir.m.$c_ed add cascade -label $cntr -menu .tlr.mir.m.$c_ed.$n_ed
+        foreach u $urls {
+          .tlr.mir.m.$c_ed.$n_ed add command -label $u \
+              -command "set ::new_repo $u"
+        }
+      }
+    }
+  }
+  # local repository
+  ttk::button .tlr.browse -text "Local directory..." \
+      -command find_local_repo
+  ppack .tlr.browse -in .tlr.mirbuttons -side left -fill x
+
+  spacing .tlr.bg
+
+  # two ways to close the dialog
+  pack [ttk::frame .tlr.closebuttons] -in .tlr.bg -fill x
+  ttk::button .tlr.save -text "Save and Load" -command close_repos
+  ppack .tlr.save -in .tlr.closebuttons -side right
+  ttk::button .tlr.abort -text "Abort"\
+      -command {raise .; destroy .tlr}
+  ppack .tlr.abort -in .tlr.closebuttons -side right
+
+  place_dlg .tlr .
+  wm resizable .tlr 0 0
+} ; # repositories
+
+### platforms
+
+if {$::tcl_platform(platform) ne "windows"} {
+
+  set ::platforms {}
+
+  proc toggle_pl_marked {pl cl} {
+    # toggle_pl_marked is triggered by a mouse click only in column #1.
+    # 'fut' should get updated in ::platforms and in .tlpl.pl.
+
+    if {$cl ne "#1"} return
+    if {$pl eq $::our_platform} {
+      tk_messageBox -message "Cannot remove own platform $::our_platform" \
+          -parent .tlpl
+      return
+    }
+    # $mrk: negation of current value of marked for $pl
+    set m1 [expr {[dict get $::platforms $pl "fut"] ? 0 : 1}]
+    dict set ::platforms $pl "fut" $m1
+    set m0 [dict get $::platforms $pl "cur"]
+    if {$m0 == $m1} {
+      .tlpl.pl set $pl "sup" [mark_sym $m0]
+    } else {
+      .tlpl.pl set $pl "sup" "[mark_sym $m0] \u21d2 [mark_sym $m1]"
+    }
+    .tlpl.do configure -state disabled
+    dict for {p mrks} $::platforms {
+      if {[dict get $mrks "fut"] ne [dict get $mrks "cur"]} {
+        .tlpl.do configure -state !disabled
+        break
+      }
+    }
+  } ; # toggle_pl_marked
+
+  proc platform_do {} {
+    raise .
+    destroy .tlpl
+    set pl_add {}
+    set pl_remove {}
+    dict for {p pd} $::platforms {
+      if {[dict get $pd "cur"] ne [dict get $pd "fut"]} {
+        if {[dict get $pd "fut"]} {
+          lappend pl_add $p
+        } else {
+          lappend pl_remove $p
+        }
+      }
+    }
+    if {[llength $pl_add] == 0 && [llength $pl_remove] == 0} return
+    set cmds {}
+    if {[llength $pl_add] > 0} {
+      set cmd "platform add "
+      append cmd [join $pl_add " "]
+      lappend cmds $cmd
+    }
+    if {[llength $pl_remove] > 0} {
+      set cmd "platform remove "
+      append cmd [join $pl_remove " "]
+      lappend cmds $cmd
+    }
+    run_cmds $cmds log_widget_cb
+    vwait ::done_waiting
+    update_local_revnumbers
+    collect_filtered
+
+  } ; # platform_do
+
+  proc platform_select {} {
+    run_cmd_waiting "platform list"
+    set ::platforms {}
+    foreach l $::out_log {
+      if [regexp {^\s+(\S+)$} $l m p] {
+        dict set ::platforms $p {}
+        dict set ::platforms $p "cur" 0
+        dict set ::platforms $p "fut" 0
+      } elseif [regexp {^\(i\)\s+(\S+)$} $l m p] {
+        dict set ::platforms $p {}
+        dict set ::platforms $p "cur" 1
+        dict set ::platforms $p "fut" 1
+      }
+    }
+    destroy .tlpl
+    toplevel .tlpl -class Dialog
+    wm withdraw .tlpl
+    wm transient .tlpl .
+    wm title .tlpl "Platforms"
+    if $::plain_unix {wm attributes .tlpl -type dialog}
+
+    # wallpaper frame
+    pack [ttk::frame .tlpl.bg] -expand 1 -fill both
+
+    # platforms treeview
+    pack [ttk::frame .tlpl.fpl] -in .tlpl.bg -fill both -expand 1
+    ttk::treeview .tlpl.pl -columns {sup plat} -show headings \
+        -height [dict size $::platforms] ; # -yscrollcommand {.tlpl.plsb set}
+    ppack .tlpl.pl -in .tlpl.fpl -side left -fill both -expand 1
+    #ttk::scrollbar .tlpl.plsb -orient vertical \
+    #    -command {.tlpl.pl yview}
+    #ppack .tlpl.plsb -in .tlpl.fpl -side right -fill y -expand 1
+    foreach col {sup plat} nm {"" "Platform"} {
+      .tlpl.pl heading $col -text $nm -anchor w
+    }
+    .tlpl.pl column sup -width [expr {$::cw * 6}]
+    .tlpl.pl column plat -width [expr {$::cw * 20}]
+    dict for {p mks} $::platforms {
+      .tlpl.pl insert {} end -id $p -values \
+          [list [mark_sym [dict get $mks "cur"]] $p]
+    }
+
+    # "#2" refers to the second column, with editable mark symbols
+    bind .tlpl.pl <space> {toggle_pl_marked [.tlpl.pl focus] "#1"}
+    bind .tlpl.pl <Return> {toggle_pl_marked [.tlpl.pl focus] "#1"}
+    # only toggle when column is "sup" i.e. #1
+    bind .tlpl.pl <ButtonRelease-1> \
+        {toggle_pl_marked \
+             [.tlpl.pl identify item %x %y] \
+             [.tlpl.pl identify column %x %y]}
+
+    # buttons
+    pack [ttk::frame .tlpl.but] -in .tlpl.bg -fill x
+    ttk::button .tlpl.do -text "Apply and close" -command platform_do
+    ttk::button .tlpl.dont -text "Close" -command \
+        {raise .; destroy .tlpl}
+    ppack .tlpl.do -in .tlpl.but -side right
+    .tlpl.do configure -state disabled
+    ppack .tlpl.dont -in .tlpl.but -side right
+
+    place_dlg .tlpl .
+    wm resizable .tlpl 0 0
+  } ; # platform_select
+
+} ; # $::tcl_platform(platform) ne "windows"
+
+##### restore from backup #####
+
+# This is currently rather dangerous.
+# ::do_restore is set to 0 or 1 near the top of this source.
+
+if $::do_restore {
+# dictionary of backups, with mapping to list of available revisions
+set bks {}
+
+proc enable_restore {yesno} {
+  set st [expr {$yesno ? !disabled : disabled}]
+  .tlbk.bklist state $st
+  .tlbk.all configure -state $st
+  .tlbk.done configure -state $st
+} ; # enable_restore
+
+proc finish_restore {} {
+  vwait ::done_waiting
+  # now log_widget_cb should have done finish mode
+  # and re-enabled its close button.
+  # We won't wait for the log toplevel to close, but we will
+  # update the packages display in the main window.
+  update_local_revnumbers
+  collect_filtered
+} ; # finish_restore
+
+proc restore_all {} {
+  run_cmd "restore --force --all" log_widget_cb
+  finish_restore
+  raise .
+  destroy .tlbk
+} ; # restore_all
+
+proc restore_this {} {
+  set id [.tlbk.bklist focus]
+  if {$id eq {}} return
+  set r [.tlbk.bklist set $id rev]
+  if {$r eq {}} return
+  set p [.tlbk.bklist set $id pkg]
+  if {$p eq {}} {
+    set id [.tlbk.bklist parent $id]
+    if {$id ne {}} {set p [.tlbk.bklist set $id pkg]}
+  }
+  if {$p eq {}} return
+  set ans [tk_messageBox -message "Restore $p to revision $r?" \
+               -type okcancel -parent .tlbk]
+  if {$ans ne {ok}} return
+  run_cmd "restore --force $p $r" log_widget_cb
+  finish_restore
+  # tkwait window .tllg
+} ; # restore_this
+
+proc bklist_callback_click {x y} {
+  set cl [.tlbk.bklist identify column $x $y]
+  if {$cl eq "#0"} return
+  set id [.tlbk.bklist identify item $x $y]
+  .tlbk.bklist focus $id
+  restore_this
+} ; # bklist_callback_click
+
+proc restore_backups_dialog {} {
+  run_cmd_waiting "option autobackup"
+  set re {autobackup\t(.*)$}
+  set abk 0
+  foreach l $::out_log {
+    if [regexp $re $l m abk] break
+  }
+  if {$abk == 0} {
+    tk_messageBox -message "No backups configured"
+    return
+  }
+  run_cmd_waiting "option backupdir"
+  set re {backupdir\t(.*)$}
+  set bdir ""
+  foreach l $::out_log {
+    if [regexp $re $l m bdir] break
+  }
+  if {$bdir eq ""} {
+    tk_messageBox -message "No backup directory defined"
+    return
+  }
+  set bdir [file join [exec kpsewhich -var-value SELFAUTOPARENT] $bdir]
+  if {! [file isdirectory $bdir]} {
+    tk_messageBox -message "Backup directory $bdir does not exist"
+    return
+  }
+  set pwd0 [pwd]
+  cd $bdir
+  set backups [lsort [glob *.tar.xz]]
+  if {[llength $backups] == 0} {
+    tk_messageBox -message "No backups found in $bdir"
+    return
+  }
+  # dictionary of backups; package => list of available revisions
+  set ::bks [dict create]
+  set re {^(.*)\.r(\d+)\.tar\.xz$}
+  foreach b $backups {
+    if [regexp $re $b m pk r] {
+      if {$pk in [dict keys $::bks]} {
+        dict lappend ::bks $pk $r
+      } else {
+        dict set ::bks $pk [list $r]
+      }
+    }
+  }
+  if {[llength [dict keys $::bks]] == 0} {
+    tk_messageBox -message "No packages in backup directory $bdir"
+    return
+  }
+  # invert sort order of revisions for each package
+  foreach pk [dict keys $::bks] {
+    dict set ::bks $pk [lsort -decreasing [dict get $::bks $pk]]
+  }
+  toplevel .tlbk -class Dialog
+  wm withdraw .tlbk
+  wm transient .tlbk .
+  wm title .tlbk "Restore from backup"
+  if $::plain_unix {wm attributes .tlbk -type dialog}
+
+  # wallpaper frame; see make_widgets
+  pack [ttk::frame .tlbk.bg] -expand 1 -fill x
+
+  # the displayed list of backed-up packages
+  pack [ttk::frame .tlbk.fbk] -in .tlbk.bg -side top
+  # package names not in #0, because we want to trigger actions
+  # without automatically opening a parent.
+  pack [ttk::treeview .tlbk.bklist -columns {"pkg" "rev"} \
+            -show {tree headings} -height 8 -selectmode browse \
+            -yscrollcommand {.tlbk.bkvsb set}] -in .tlbk.fbk -side left
+  pack [ttk::scrollbar .tlbk.bkvsb -orient vertical -command \
+            {.tlbk.bklist yview}] -in .tlbk.fbk -side right -fill y
+
+  foreach col {"pkg" "rev"} nm {"Package" "Revision"} {
+    .tlbk.bklist heading $col -text $nm -anchor w
+  }
+  .tlbk.bklist column "#0" -width [expr {$::cw * 2}]
+  .tlbk.bklist column "pkg" -width [expr {$::cw * 25}]
+  .tlbk.bklist column "rev" -width [expr {$::cw * 12}]
+
+  # fill .tlbk.bklist. Use the last available revision.
+  # Remember that $::bks is sorted and revisions inversely sorted
+  # id must be unique in the entire list: rev does not qualify
+  # must as well use $id for package items too
+  set id 0
+  dict for {pk rlist} $::bks {
+    # package
+    .tlbk.bklist insert {} end -id [incr id] \
+        -values [list $pk [lindex $rlist 0]] -open 0
+    set l [llength $rlist]
+    # additional revisions
+    if {$l > 1} {
+      set idparent $id
+      for {set i 1} {$i<$l} {incr i} {
+        .tlbk.bklist insert $idparent end -id [incr id] \
+            -values [list "" [lindex $rlist $i]]
+      }
+    }
+  }
+
+  # since we can only restore one non-last revision at a time, it is better
+  # to only show one non-last revision at a time too.
+  bind .tlbk.bklist <<TreeviewOpen>> {
+    foreach p [.tlbk.bklist children {}] {
+      if {$p ne [.tlbk.bklist focus]} {
+        .tlbk.bklist item $p -open 0
+      }
+    }
+  }
+  # restoring a single package
+  bind .tlbk.bklist <<RightClick>> {bklist_callback_click %x %y}
+  bind .tlbk.bklist <space> restore_this
+
+  # frame with buttons
+  pack [ttk::frame .tlbk.fbut] -in .tlbk.bg -side bottom -fill x
+  ppack [ttk::button .tlbk.all -text "Restore all" -command restore_all] \
+        -in .tlbk.fbut -side right
+  ppack [ttk::button .tlbk.done -text "Close" \
+             -command {raise .; destroy .tlbk}] -in .tlbk.fbut -side right
+
+  place_dlg .tlbk .
+  wm resizable .tlbk 0 0
+} ; # restore_backups_dialog
+
+} ; # if $::do_restore
+
+##### Main window and supporting procs and callbacks ##################
+
+##### package-related #####
+
+proc update_tlmgr {} {
+  if {! $::need_update_tlmgr} {
+    tk_messageBox -message "Nothing to do!"
+    return
+  }
+  run_cmd "update --self" log_widget_cb
+  vwait ::done_waiting
+  # tlmgr restarts itself automatically
+  update_local_revnumbers
+  collect_filtered
+} ; # update_tlmgr
+
+proc update_all {} {
+  if $::need_update_tlmgr {
+    tk_messageBox -message "Update self first!"
+    return
+  } elseif {! $::n_updates} {
+    tk_messageBox -message "Nothing to do!"
+    return
+  }
+  run_cmd "update --all" log_widget_cb
+  vwait ::done_waiting
+  update_local_revnumbers
+  collect_filtered
+} ; # update_all
+
+### doing something with some packages
+
+proc pkglist_from_option {opt {pk ""}} {
+  if {$opt eq "marked"} {
+    set pks {}
+    dict for {p props} $::pkgs {
+      if [dict get $props "marked"] {lappend pks $p}
+    }
+  } elseif {$opt eq "focus"} {
+    set p [.pkglist focus]
+    if {$p ne {}} {lappend pks $p}
+  } elseif {$opt eq "name"} {
+    lappend pks $pk
+  }
+  return $pks
+} ; # pkglist_from_option
+
+proc install_pkgs {sel_opt {pk ""}} {
+  set pks [pkglist_from_option $sel_opt $pk]
+  # check whether packages are installed
+  set pre_installed {}
+  set todo {}
+  foreach p $pks {
+    if {[dict get $::pkgs $p localrev] > 0} {
+      lappend pre_installed $p
+    } else {
+      lappend todo $p
+    }
+  }
+  if {[llength $todo] == 0} {
+    tk_messageBox -message "Nothing to do!" -type ok -icon info
+    return
+  }
+  run_cmd_waiting "install --dry-run $todo"
+  # check whether dependencies are going to be installed
+  set r {^(\S+)\s+i\s}
+  set deps {}
+  foreach l $::out_log {
+    if {[regexp $r $l d p] && $p ni $pks} {
+      lappend deps $p
+    }
+  }
+  if {[llength $deps] > 0} {
+    set ans [any_message \
+       "Also installing dependencies\n\n$deps.\n\nContinue?" "okcancel"]
+    if {$ans eq "cancel"} return
+  }
+  run_cmd "install $todo" log_widget_cb
+  vwait ::done_waiting
+  if {[llength $pre_installed] > 0} {
+    lappend ::err_log "Already installed: $pre_installed"
+    show_err_log
+  }
+  update_local_revnumbers
+  collect_filtered
+} ; # install_pkgs
+
+proc update_pkgs {sel_opt {pk ""}} {
+  set pks [pkglist_from_option $sel_opt $pk]
+  # check whether packages are installed
+  set not_inst {}
+  set uptodate {}
+  set todo {}
+  foreach p $pks {
+    set lv [dict get $::pkgs $p localrev]
+    if {[dict get $::pkgs $p localrev] == 0} {
+      lappend not_inst $p
+    } else {
+      set rv [dict get $::pkgs $p remoterev]
+      if {$lv >= $rv} {
+        lappend uptodate $p
+      } else {
+        lappend todo $p
+      }
+    }
+  }
+  if {[llength $todo] == 0} {
+    tk_messageBox -message "Nothing to do!" -type ok -icon info
+    return
+  }
+  run_cmd_waiting "update --dry-run $todo"
+  # check whether dependencies are going to be updated
+  set r {^(\S+)\s+u\s}
+  set deps {}
+  foreach l $::out_log {
+    if {[regexp $r $l d p] && $p ni $pks} {
+      lappend deps $p
+    }
+  }
+  if {[llength $deps] > 0} {
+    set ans [any_message "Also updating dependencies\n\n$deps?" \
+       "yesnocancel"]
+    switch $ans {
+      "cancel" return
+      "yes" {run_cmd "update $todo" log_widget_cb}
+      "no" {
+        set deps {}
+        run_cmd_waiting "update --dry-run --no-depends $todo"
+        foreach l $::out_log {
+          if {[regexp $r $l u p] && $p ni $pks} {
+            lappend deps $p
+          }
+        }
+        if {[llength $deps] > 0} {
+          set ans [any_message \
+                       "Updating hard dependencies $deps anyway. Continue?" \
+                       "okcancel"]
+          if {$ans eq "cancel"} return
+        }
+        run_cmd "update --no-depends $todo" log_widget_cb
+      }
+    }
+  } else {
+    run_cmd "update $todo" log_widget_cb
+  }
+  vwait ::done_waiting
+  if {[llength $not_inst] > 0} {
+    lappend ::err_log "Skipped because not installed: $not_inst"
+  }
+  if {[llength $uptodate] > 0} {
+    lappend ::err_log "Skipped because already up to date: $uptodate"
+  }
+  if {[llength $not_inst] > 0 || [llength $uptodate] > 0} {
+    show_err_log
+  }
+  update_local_revnumbers
+  collect_filtered
+} ; # update_pkgs
+
+proc remove_pkgs {sel_opt {pk ""}} {
+  set pks [pkglist_from_option $sel_opt $pk]
+  # check whether packages are installed
+  set not_inst {}
+  set todo {}
+  foreach p $pks {
+    if {[dict get $::pkgs $p localrev] > 0} {
+      lappend todo $p
+    } else {
+      lappend not_inst $p
+    }
+  }
+  run_cmd_waiting "remove --dry-run $todo"
+  # check whether dependencies are going to be removed
+  set r {^(\S+)\s+d\s}
+  set deps {}
+  foreach l $::out_log {
+    if {[regexp $r $l d p] && $p ni $pks} {
+      lappend deps $p
+    }
+  }
+  if {[llength $todo] == 0} {
+    tk_messageBox -message "Nothing to do!" -type ok -icon info
+    return
+  }
+  if {[llength $deps] > 0} {
+    set ans [any_message "Also remove dependencies\n\n$deps?" \
+                "yesnocancel"]
+    switch $ans {
+      "cancel" return
+      "yes" {run_cmd "remove $todo" log_widget_cb}
+      "no" {
+        set deps {}
+        run_cmd_waiting "remove --dry-run --no-depends $todo"
+        foreach l $::out_log {
+          if {[regexp $r $l d p] && $p ni $pks} {
+            lappend deps $p
+          }
+        }
+        if {[llength $deps] > 0} {
+          set ans [any_message \
+                       "Removing hard dependencies $deps anyway. Continue?" \
+                       "okcancel"]
+          if {$ans eq "cancel"} return
+        }
+        run_cmd "remove --no-depends $todo" log_widget_cb
+      }
+    }
+  } else {
+    run_cmd "remove $todo" log_widget_cb
+  }
+  vwait ::done_waiting
+ if {[llength $not_inst] > 0} {
+    lappend ::err_log "Skipped because not installed: $not_inst"
+    show_err_log
+  }
+  update_local_revnumbers
+  collect_filtered
+} ; # remove_pkgs
+
+# restoring packages is a rather different story, controlled by the
+# contents of the backup directory. see further up.
+
+##### varous callbacks #####
+
+proc run_entry {} {
+  # TODO: some validation of $cmd
+  do_debug "run_entry"
+  set cmd [.ent.e get]
+  if {$cmd eq ""} return
+  do_debug $cmd
+  .ent.e delete 0 end
+  run_cmd $cmd log_widget_cb
+}
+
+proc restart_self {} {
+  do_debug "trying to restart"
+  if {$::progname eq ""} {
+    tk_messageBox -message "progname not found; not restarting"
+    return
+  }
+  close_tlmgr
+  exec $::progname &
+  # on windows, it may take several seconds before
+  # the old tlshell disappears.
+  # oh well, windows is still windows....
+  destroy .
+} ; # restart_self
+
+proc toggle_marked {itm cl} {
+  # toggle_marked is triggered by a mouse click only in column #1.
+  # 'marked' should get updated in ::pkgs, ::filtered and in .pkglist.
+
+  if {$cl ne "#1"} return
+  # $mrk: negation of current value of marked for $itm
+  set mrk [expr {[dict get $::pkgs $itm "marked"] ? 0 : 1}]
+  dict set ::pkgs $itm "marked" $mrk
+  set m [mark_sym $mrk]
+  dict set ::filtered $itm [lreplace [dict get $::filtered $itm] 0 0 $m]
+  .pkglist set $itm mk $m
+} ; # toggle_marked
+
+proc mark_all {mrk} {
+  foreach nm [dict keys $::pkgs] {
+    dict set ::pkgs $nm "marked" $mrk
+  }
+  set m [mark_sym $mrk]
+  foreach nm [dict keys $::filtered] {
+    dict set ::filtered $nm [lreplace [dict get $::filtered $nm] 0 0 $m]
+  }
+  foreach nm [.pkglist children {}] {
+    .pkglist set $nm mk $m
+  }
+  # alternatively: regenerate ::filtered and .pkglist from ::pkgs
+} ; # mark_all
+
+proc toggle_search_desc {} {
+  # when this proc is called, ::search_desc is not yet toggled
+  # so we temporarily pre-toggle and post-untoggle it
+  set ::search_desc [expr {$::search_desc ? 0 : 1}]
+  display_packages_info
+  set ::search_desc [expr {$::search_desc ? 0 : 1}]
+}
+
+##### package popup #####
+
+proc do_package_popup_menu {x y X Y} {
+  # as focused item, the identity of the clicked item will be
+  # globally available:
+  .pkglist focus [.pkglist identify item $x $y]
+  # recreate menu with only applicable items
+  set lr [dict get $::pkgs [.pkglist focus] "localrev"]
+  set rr [dict get $::pkgs [.pkglist focus] "remoterev"]
+  .pkg_popup delete 0 end
+  .pkg_popup add command -label "Info" -command \
+      {run_cmd "info [.pkglist focus]" log_widget_cb; \
+           vwait ::done_waiting}
+  if {$::have_remote && ! $::need_update_tlmgr && $rr > 0 && $lr == 0} {
+    .pkg_popup add command -label "Install" -command \
+        {install_pkgs "focus"}
+  }
+  if {$::have_remote && ! $::need_update_tlmgr && $lr > 0 && $rr > $lr} {
+    .pkg_popup add command -label "Update" -command \
+        {update_pkgs "focus"}
+  }
+  if {$lr > 0} {
+    .pkg_popup add command -label "Remove" -command \
+        {remove_pkgs "focus"}
+  }
+  .pkg_popup post [expr {$X - 2}] [expr {$Y - 2}]
+  focus .pkg_popup
+} ; # do_package_popup_menu
+
+proc set_paper {p} {
+  run_cmd "paper paper $p" log_widget_cb
+}
+
+##### running external commands #####
+
+# For capturing an external command, we need a separate output channel,
+# but we reuse ::out_log.
+# stderr is bundled with stdout so ::err_log should stay empty.
+proc read_capt {} {
+  set l "" ; # will contain the line to be read
+  if {([catch {chan gets $::capt l} len] || [chan eof $::capt])} {
+    catch {chan close $::capt}
+    log_widget_cb "finish"
+    set ::done_waiting 1
+  } elseif {$len >= 0} {
+    lappend ::out_log $l
+    log_widget_cb "line" $l
+  }
+}; # read_capt
+
+proc run_external {cmd mess} {
+  set ::out_log {}
+  set ::err_log {}
+  lappend ::out_log $mess
+  unset -nocomplain ::done_waiting
+  # dont understand why, on windows, start_tlmgr does not trigger
+  # a console window but this proc does
+  if [catch {open "|$cmd 2>&1" "r"} ::capt] {
+    tk_messageBox -message "Failure to launch $cmd"
+  }
+  chan configure $::capt -buffering line -blocking 0
+  chan event $::capt readable read_capt
+  log_widget_cb "init"
+}
+
+##### main window #####
+
+proc make_widgets {} {
+
+  wm title . "$::progname $::procid"
+
+  # width of '0', as a rough estimate of average character width
+  set ::cw [font measure TkTextFont "0"]
+
+  # dummy empty menu to replace the real menu .mn in disabled states.
+  # the "File" cascade should ensure that the dummy menu
+  # occupies the same vertical space as the real menu.
+  menu .mn_empty
+  .mn_empty add cascade -label "File" -menu .mn_empty.file -underline 0
+  if $::plain_unix {
+    .mn_empty configure -borderwidth 1
+    .mn_empty configure -background $::default_bg
+  menu .mn_empty.file
+  }
+  # real menu
+  menu .mn
+  . configure -menu .mn
+  if $::plain_unix {
+    .mn configure -borderwidth 1
+    .mn configure -background $::default_bg
+
+    # plain_unix: avoid a RenderBadPicture error on quitting.
+    # 'send' changes the shutdown sequence,
+    # which avoids triggering the bug.
+    # 'tk appname <something>' restores 'send' and avoids the bug
+    bind . <Destroy> {
+      catch {tk appname appname}
+    }
+  }
+
+  .mn add cascade -label "File" -menu .mn.file -underline 0
+  menu .mn.file
+  .mn.file add command -label "Load default repository" \
+      -command {get_packages_info_remote; collect_filtered}
+  .mn.file add command -command {destroy .} -label "Exit" -underline 1
+
+  # inx: keeping count where needed, i.e. when an entry needs to be referenced
+  .mn add cascade -label "Packages" -menu .mn.pkg
+  menu .mn.pkg
+  set inx 0
+  set ::inx_upd_tlmgr $inx
+  .mn.pkg add command -label "Update tlmgr" -command update_tlmgr
+  incr inx
+  set ::inx_upd_all $inx
+  .mn.pkg add command -label "Update all" -command update_all
+  incr inx
+  .mn.pkg add command -label "Install marked" \
+      -command {install_pkgs "marked"}
+  incr inx
+  .mn.pkg add command -label "Update marked" \
+      -command {update_pkgs "marked"}
+  incr inx
+  .mn.pkg add command -label "Remove marked" \
+      -command {remove_pkgs "marked"}
+  if $::do_restore {
+  incr inx
+  .mn.pkg add command -label "Restore from backup..." \
+      -command restore_backups_dialog
+  }
+
+  .mn add cascade -label "Actions" -menu .mn.act -underline 0
+  menu .mn.act
+  .mn.act add command -label "Regenerate filename database" -command \
+      {run_external "mktexlsr" "Regenerating filename database..."}
+  .mn.act add command -label "Regenerate formats" -command \
+      {run_external "fmtutil-sys --all" "Rebuilding formats..."}
+  .mn.act add command -label "Regenerate fontmaps" -command \
+      {run_external "updmap-sys" "Rebuilding fontmap files..."}
+
+  .mn add cascade -label "Options" -menu .mn.opt -underline 0
+  menu .mn.opt
+  set inx 0
+  .mn.opt add command -label "Change repository..." \
+      -command repositories
+  incr inx
+  .mn.opt add cascade -label "Paper" -menu .mn.opt.paper
+  menu .mn.opt.paper
+  foreach p [list a4 letter] {
+    .mn.opt.paper add command -label $p -command "set_paper $p"
+  }
+  if {$::tcl_platform(platform) ne "windows"} {
+    incr inx
+    set ::inx_platforms $inx
+    .mn.opt add command -label "Platforms..." -command platform_select
+  }
+
+  .mn add cascade -label "Help" -menu .mn.help -underline 0
+  menu .mn.help
+  .mn.help add command -command {tk_messageBox -message "Helpless"} \
+      -label "About"
+
+  # wallpaper frame
+  # it is possible to set a background color for a toplevel, but on
+  # MacOS I did not find a way to determine the right $::default_bg
+  # color. Instead, all toplevels are given a wallpaper ttk::frame
+  # with the default ttk::frame color, which seems to work
+  # everywhere.
+  pack [ttk::frame .bg] -expand 1 -fill both
+
+  # various info
+  ttk::frame .topf
+  pack .topf -in .bg -side top -anchor w
+
+  pgrid [ttk::label .topf.llrepo -text "Default repository" -anchor w] \
+      -row 0 -column 0 -sticky w
+  pgrid [ttk::label .topf.lrepo -textvariable ::repo] \
+      -row 0 -column 1 -sticky w
+  pgrid [ttk::label .topf.loaded -text "Not loaded"] \
+      -row 1 -column 1 -sticky w
+
+  ttk::label .topf.lluptodate -text "TL Manager up to date?" -anchor w
+  pgrid .topf.lluptodate -row 2 -column 0 -sticky w
+  ttk::label .topf.luptodate -text "Unknown" -anchor w
+  pgrid .topf.luptodate -row 2 -column 1 -sticky w
+
+  pgrid [ttk::label .topf.llcmd -anchor w -text "Last tlmgr command: "] \
+      -row 3 -column 0 -sticky w
+  pgrid [ttk::label .topf.lcmd -anchor w -textvariable ::last_cmd] \
+      -row 3 -column 1 -sticky w
+
+  # command entry widget
+  spacing .bg
+  ttk::frame .ent
+  ppack [ttk::label .ent.l -text "Type command:"] -side left
+  ppack [ttk::entry .ent.e -width 40] -side left -padx 3
+  ppack [ttk::button .ent.b -text Go -command run_entry] -side left
+  bind .ent.e <Return> run_entry
+  pack .ent -in .bg -fill x -side top
+
+  spacing .bg
+
+  # package list
+  ttk::label .lpack -text "Package list" -font TkHeadingFont -anchor w
+  ppack .lpack -in .bg -side top -fill x
+
+  # controlling package list
+  ttk::frame .pkfilter
+  # filter on status: inst, all, upd
+  ttk::label .pkfilter.lstat -font TkHeadingFont -text "Status"
+  ttk::radiobutton .pkfilter.inst -text Installed -value inst \
+      -variable ::stat_opt -command collect_filtered
+  ttk::radiobutton .pkfilter.alls -text All -value all \
+      -variable ::stat_opt -command collect_filtered
+  ttk::radiobutton .pkfilter.upd -text Updatable -value upd \
+      -variable ::stat_opt -command collect_filtered
+  grid .pkfilter.lstat -column 0 -row 0 -sticky w -padx {3 50}
+  pgrid .pkfilter.inst -column 0 -row 1 -sticky w
+  pgrid .pkfilter.alls -column 0 -row 2 -sticky w
+  pgrid .pkfilter.upd -column 0 -row 3 -sticky w
+
+  # filter on detail level: all, coll, schm
+  ttk::label .pkfilter.ldtl -font TkHeadingFont -text "Detail >> Global"
+  ttk::radiobutton .pkfilter.alld -text All -value all \
+      -variable ::dtl_opt -command collect_filtered
+  ttk::radiobutton .pkfilter.coll -text "Collections and schemes" -value coll \
+      -variable ::dtl_opt -command collect_filtered
+  ttk::radiobutton .pkfilter.schm -text "Only schemes" -value schm \
+      -variable ::dtl_opt -command collect_filtered
+  pgrid .pkfilter.ldtl -column 1 -row 0 -sticky w
+  pgrid .pkfilter.alld -column 1 -row 1 -sticky w
+  pgrid .pkfilter.coll -column 1 -row 2 -sticky w
+  pgrid .pkfilter.schm -column 1 -row 3 -sticky w
+
+  # marks
+  grid [ttk::button .mrk_all -text "Mark all" -command {mark_all 1}] \
+      -in .pkfilter -column 2 -row 1 -sticky w -padx {50 3} -pady 3
+  grid [ttk::button .mrk_none -text "Mark none" -command {mark_all 0}] \
+      -in .pkfilter -column 2 -row 2 -sticky w -padx {50 3} -pady 3
+
+  pack .pkfilter -in .bg -side top -fill x
+
+  # search interface
+  pack [ttk::frame .pksearch] -in .bg -side top -fill x
+  ppack [ttk::label .pksearch.l \
+      -text "Search package names"] \
+      -side left
+  pack [ttk::entry .pksearch.e -width 30] -side left -padx {3 0} -pady 3
+  ppack [ttk::checkbutton .pksearch.d -variable ::search_desc \
+             -text "Also search short descriptions"] -side left
+  bind .pksearch.e <KeyRelease> display_packages_info
+  bind .pksearch.d <ButtonRelease> toggle_search_desc
+
+  # packages list
+  pack [ttk::frame .fpkg] -in .bg -side top -fill both -expand 1
+  ttk::treeview .pkglist -columns \
+      {mk name localrev remoterev shortdesc} \
+      -show headings -height 8 -selectmode extended \
+      -xscrollcommand {.pkhsb set} -yscrollcommand {.pkvsb set}
+  foreach \
+      col {mk name localrev remoterev shortdesc} \
+      nm {"" Name "Local Rev. (ver.)" "Remote Rev. (ver.)" Description} {
+    .pkglist heading $col -text $nm -anchor w
+  }
+  .pkglist column mk -width [expr {$::cw * 3}]
+  .pkglist column name -width [expr {$::cw * 25}]
+  .pkglist column localrev -width [expr {$::cw * 18}]
+  .pkglist column remoterev -width [expr {$::cw * 18}]
+  .pkglist column shortdesc -width [expr {$::cw * 50}]
+
+  ttk::scrollbar .pkhsb -orient horizontal -command {.pkglist xview}
+  ttk::scrollbar .pkvsb -orient vertical -command {.pkglist yview}
+  pgrid .pkglist -in .fpkg -row 0 -column 0 -sticky news
+  grid .pkvsb -in .fpkg -row 0 -column 1 -sticky ns
+  grid .pkhsb -in .fpkg -row 1 -column 0 -sticky ew
+  grid columnconfigure .fpkg 0 -weight 1
+  grid rowconfigure .fpkg 0 -weight 1
+
+  # "#1" refers to the first column (with mark symbols)
+  bind .pkglist <space> {toggle_marked [.pkglist focus] "#1"}
+  bind .pkglist <Return> {toggle_marked [.pkglist focus] "#1"}
+  # only toggle when column is "mk" i.e. #1
+  bind .pkglist <ButtonRelease-1> {toggle_marked \
+      [.pkglist identify item %x %y] [.pkglist identify column %x %y]}
+
+  menu .pkg_popup ; # entries added on-the-fly
+  bind .pkglist <<RightClick>> {do_package_popup_menu %x %y %X %Y}
+  if $::plain_unix {
+    bind .pkg_popup <Leave> {.pkg_popup unpost}
+  }
+
+  # bottom of main window
+  pack [ttk::frame .endbuttons] -in .bg -side bottom -fill x
+  ttk::label .busy -textvariable ::busy -font TkHeadingFont -anchor w
+  ppack .busy -in .endbuttons -side left
+  ppack [ttk::button .q -text Quit -command {destroy .}] \
+      -in .endbuttons -side right
+  ppack [ttk::button .r -text "Restart self" -command restart_self] \
+      -in .endbuttons -side right
+  ppack [ttk::button .t -text "Restart tlmgr" \
+             -command {close_tlmgr; start_tlmgr}] \
+      -in .endbuttons -side right
+  ttk::button .showlogs -text "Show logs" -command show_logs
+  ppack .showlogs -in .endbuttons -side right
+} ; # make_widgets
+
+##### initialize ######################################################
+
+proc initialize {} {
+  # seed random numbers
+  expr {srand([clock seconds])}
+  # prepend TL to process searchpath (not needed on windows)
+  if {$::tcl_platform(platform) ne "windows"} {
+    set texbin [file dirname [info script]]
+    set savedir [pwd]
+    cd $texbin
+    set texbin [pwd]
+    cd $savedir
+    # prepend texbin to PATH, unless it is already the _first_
+    # path component
+    if {$::tcl_platform(platform) eq "unix"} {
+      set pathsep ":"
+    } else {
+      set pathsep ";"
+    }
+    set dirs [split $::env(PATH) $pathsep]
+    if {[lindex $dirs 0] ne $texbin} {
+      set ::env(PATH) "$texbin$pathsep$::env(PATH)"
+    }
+    # now is a good time to ask tlmgr for the tl name of our platform
+    set ::our_platform [exec tlmgr print-platform]
+  }
+  # directory for temp files
+  set attemptdirs {}
+  foreach tmp {TMPDIR TEMP TMP} {
+    if {$tmp in [array names ::env]} {
+      lappend attemptdirs $::env($tmp)
+    }
+  }
+  if {$::tcl_platform(platform) eq "unix"} {
+    lappend attemptdirs "/tmp"
+  }
+  lappend attemptdirs [pwd]
+  set ::tempsub ""
+  foreach tmp $attemptdirs {
+    if {$::tcl_platform(platform) eq "windows"} {
+      regsub -all {\\} $tmp {/} tmp
+    }
+    if {[file isdirectory $tmp]} {
+      # no real point in randomizing directory name itself
+      if {$::tcl_platform(platform) eq "unix"} {
+        set ::tempsub [file join $tmp $::env(USER)]
+      } else {
+        set ::tempsub [file join $tmp $::env(USERNAME)]
+      }
+      append ::tempsub "-tlshell"
+      if {! [catch {file mkdir $::tempsub}]} {break} ;# success
+    }
+  }
+
+  if {$::tempsub eq "" || [file isdirectory $::tempsub] == 0} {
+    error "Cannot create directory for temporary files"
+  }
+  # temp file for stderr
+  set ::err_file [maketemp ".err_tlshl"]
+
+  # logfile
+  if $::ddebug {
+    set fname [file join $::tempsub \
+      [clock format [clock seconds] -format {%H:%M}]]
+    set ::flid [open $fname w]
+  }
+
+  # add json subdirectory to auto_path, but at low priority
+  # since the tcl/tk installation may already have a better implementation.
+  # Use kpsewhich to find out own directory and bypass symlinks.
+  #set tlsdir [file dirname [exec kpsewhich -format texmfscripts tlshell.tcl]]
+  #lappend ::auto_path [file join $tlsdir "json"]
+
+  make_widgets
+
+  start_tlmgr
+  get_repo
+  get_packages_info_local
+  collect_filtered ; # invokes display_packages_info
+  enable_menu_controls 1
+}; # initialize
+
+initialize


Property changes on: trunk/Build/source/texk/texlive/linked_scripts/tlshell/tlshell.tcl
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Modified: trunk/Master/.mkisofsrc
===================================================================
--- trunk/Master/.mkisofsrc	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/.mkisofsrc	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1,4 +1,4 @@
 APPI=Complete TeX system
 COPY=LICENSE.TL
 PUBL=TeX Live <tex-live at tug.org>
-VOLI=TeXLive2017
+VOLI=TeXLive2018

Modified: trunk/Master/bin/aarch64-linux/tlcockpit
===================================================================
--- trunk/Master/bin/aarch64-linux/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/aarch64-linux/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/amd64-freebsd/tlcockpit
===================================================================
--- trunk/Master/bin/amd64-freebsd/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/amd64-freebsd/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/amd64-netbsd/tlcockpit
===================================================================
--- trunk/Master/bin/amd64-netbsd/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/amd64-netbsd/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/armel-linux/tlcockpit
===================================================================
--- trunk/Master/bin/armel-linux/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/armel-linux/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/armhf-linux/tlcockpit
===================================================================
--- trunk/Master/bin/armhf-linux/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/armhf-linux/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/i386-cygwin/tlcockpit
===================================================================
--- trunk/Master/bin/i386-cygwin/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/i386-cygwin/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/i386-darwin/tlcockpit
===================================================================
--- trunk/Master/bin/i386-darwin/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/i386-darwin/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/i386-freebsd/tlcockpit
===================================================================
--- trunk/Master/bin/i386-freebsd/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/i386-freebsd/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/i386-linux/tlcockpit
===================================================================
--- trunk/Master/bin/i386-linux/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/i386-linux/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/i386-netbsd/tlcockpit
===================================================================
--- trunk/Master/bin/i386-netbsd/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/i386-netbsd/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/i386-solaris/tlcockpit
===================================================================
--- trunk/Master/bin/i386-solaris/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/i386-solaris/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/powerpc-darwin/tlcockpit
===================================================================
--- trunk/Master/bin/powerpc-darwin/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/powerpc-darwin/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/powerpc-linux/tlcockpit
===================================================================
--- trunk/Master/bin/powerpc-linux/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/powerpc-linux/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/sparc-solaris/tlcockpit
===================================================================
--- trunk/Master/bin/sparc-solaris/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/sparc-solaris/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/x86_64-cygwin/tlcockpit
===================================================================
--- trunk/Master/bin/x86_64-cygwin/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-cygwin/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/x86_64-darwin/tlcockpit
===================================================================
--- trunk/Master/bin/x86_64-darwin/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-darwin/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/x86_64-darwinlegacy/tlcockpit
===================================================================
--- trunk/Master/bin/x86_64-darwinlegacy/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-darwinlegacy/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/x86_64-linux/afm2pl
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/afm2tfm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/aleph
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/asy
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/autosp
===================================================================
(Binary files differ)

Added: trunk/Master/bin/x86_64-linux/axohelp
===================================================================
(Binary files differ)

Index: trunk/Master/bin/x86_64-linux/axohelp
===================================================================
--- trunk/Master/bin/x86_64-linux/axohelp	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-linux/axohelp	2018-03-03 18:29:03 UTC (rev 46798)

Property changes on: trunk/Master/bin/x86_64-linux/axohelp
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: trunk/Master/bin/x86_64-linux/bbox
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/bg5conv
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/bibtex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/bibtex8
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/bibtexu
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/cef5conv
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/cefconv
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/cefsconv
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/cfftot1
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/chktex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ctangle
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ctie
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/cweave
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/detex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/devnag
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/disdvi
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dt2dv
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dv2dt
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvi2tty
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvibook
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dviconcat
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvicopy
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvidvi
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvihp
===================================================================
--- trunk/Master/bin/x86_64-linux/dvihp	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-linux/dvihp	2018-03-03 18:29:03 UTC (rev 46798)
@@ -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

Modified: trunk/Master/bin/x86_64-linux/dvilj
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvilj2p
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvilj4
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvilj4l
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvipng
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvipos
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvips
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dviselect
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvisvgm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvitodvi
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/dvitype
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/epsffit
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/eptex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/euptex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/extconv
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/gftodvi
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/gftopk
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/gftype
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/gregorio
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/gsftopk
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/hbf2gf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/kpseaccess
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/kpsereadlink
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/kpsestat
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/kpsewhich
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/lacheck
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/luajittex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/luatex
===================================================================
(Binary files differ)

Added: trunk/Master/bin/x86_64-linux/luatex53
===================================================================
(Binary files differ)

Index: trunk/Master/bin/x86_64-linux/luatex53
===================================================================
--- trunk/Master/bin/x86_64-linux/luatex53	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-linux/luatex53	2018-03-03 18:29:03 UTC (rev 46798)

Property changes on: trunk/Master/bin/x86_64-linux/luatex53
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: trunk/Master/bin/x86_64-linux/mag
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/makeindex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/makejvf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mendex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mf-nowin
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mflua
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mfluajit
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mft
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mktexlsr
===================================================================
--- trunk/Master/bin/x86_64-linux/mktexlsr	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-linux/mktexlsr	2018-03-03 18:29:03 UTC (rev 46798)
@@ -73,7 +73,18 @@
 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
 

Modified: trunk/Master/bin/x86_64-linux/mmafm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mmpfb
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/mpost
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/msxlint
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/odvicopy
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/odvitype
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/omfonts
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/otangle
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/otfinfo
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/otftotfm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/otp2ocp
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/outocp
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/patgen
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pbibtex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pdfclose
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pdfopen
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pdftex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pdftosrc
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pdvitype
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pfb2pfa
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pk2bm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pktogf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pktype
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pltotf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pmpost
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pmxab
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pooltype
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ppltotf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/prepmx
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ps2pk
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/psbook
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/psnup
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/psresize
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/psselect
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/pstops
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ptex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ptftopl
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/scor2prt
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/sjisconv
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/synctex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1ascii
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1asm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1binary
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1disasm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1dotlessj
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1lint
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1mac
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1rawafm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1reencode
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1testpage
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t1unmac
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/t4ht
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/tangle
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/teckit_compile
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/tex
===================================================================
(Binary files differ)

Added: trunk/Master/bin/x86_64-linux/tex2aspc
===================================================================
(Binary files differ)

Index: trunk/Master/bin/x86_64-linux/tex2aspc
===================================================================
--- trunk/Master/bin/x86_64-linux/tex2aspc	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-linux/tex2aspc	2018-03-03 18:29:03 UTC (rev 46798)

Property changes on: trunk/Master/bin/x86_64-linux/tex2aspc
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: trunk/Master/bin/x86_64-linux/tex4ht
===================================================================
(Binary files differ)

Added: trunk/Master/bin/x86_64-linux/texlua53
===================================================================
--- trunk/Master/bin/x86_64-linux/texlua53	                        (rev 0)
+++ trunk/Master/bin/x86_64-linux/texlua53	2018-03-03 18:29:03 UTC (rev 46798)
@@ -0,0 +1 @@
+link luatex53
\ No newline at end of file


Property changes on: trunk/Master/bin/x86_64-linux/texlua53
___________________________________________________________________
Added: svn:special
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/bin/x86_64-linux/texlua53c
===================================================================
--- trunk/Master/bin/x86_64-linux/texlua53c	                        (rev 0)
+++ trunk/Master/bin/x86_64-linux/texlua53c	2018-03-03 18:29:03 UTC (rev 46798)
@@ -0,0 +1 @@
+link luatex53
\ No newline at end of file


Property changes on: trunk/Master/bin/x86_64-linux/texlua53c
___________________________________________________________________
Added: svn:special
## -0,0 +1 ##
+*
\ No newline at end of property
Modified: trunk/Master/bin/x86_64-linux/tftopl
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/tie
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/tlcockpit
===================================================================
--- trunk/Master/bin/x86_64-linux/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-linux/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/bin/x86_64-linux/ttf2afm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ttf2pk
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ttf2tfm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ttfdump
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/ttftotype42
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/upbibtex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/updvitype
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/upmendex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/upmpost
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/uppltotf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/uptex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/uptftopl
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/vftovp
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/vlna
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/vptovf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/weave
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/wofm2opl
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/wopl2ofm
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/wovf2ovp
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/wovp2ovf
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/xdvi-xaw
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/xdvipdfmx
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-linux/xetex
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/x86_64-solaris/tlcockpit
===================================================================
--- trunk/Master/bin/x86_64-solaris/tlcockpit	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/bin/x86_64-solaris/tlcockpit	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1 @@
-link ../../texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
\ No newline at end of file
+link ../../texmf-dist/scripts/tlcockpit/tlcockpit.sh
\ No newline at end of file

Modified: trunk/Master/release-texlive.txt
===================================================================
--- trunk/Master/release-texlive.txt	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/release-texlive.txt	2018-03-03 18:29:03 UTC (rev 46798)
@@ -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

Deleted: trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh
===================================================================
--- trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh	2018-03-03 18:29:03 UTC (rev 46798)
@@ -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" "$@"

Copied: trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh (from rev 46797, trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit-runner.sh)
===================================================================
--- trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/tlcockpit/tlcockpit.sh	2018-03-03 18:29:03 UTC (rev 46798)
@@ -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" "$@"

Modified: trunk/Master/texmf-dist/web2c/texmf.cnf
===================================================================
--- trunk/Master/texmf-dist/web2c/texmf.cnf	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/texmf-dist/web2c/texmf.cnf	2018-03-03 18:29:03 UTC (rev 46798)
@@ -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 @@
 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 @@
 % 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

Modified: trunk/Master/texmf-dist/web2c/texmfcnf.lua
===================================================================
--- trunk/Master/texmf-dist/web2c/texmfcnf.lua	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/texmf-dist/web2c/texmfcnf.lua	2018-03-03 18:29:03 UTC (rev 46798)
@@ -45,13 +45,13 @@
             -- 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

Modified: trunk/Master/tlpkg/TeXLive/TLConfig.pm
===================================================================
--- trunk/Master/tlpkg/TeXLive/TLConfig.pm	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/tlpkg/TeXLive/TLConfig.pm	2018-03-03 18:29:03 UTC (rev 46798)
@@ -52,7 +52,7 @@
 
 # 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.

Modified: trunk/Master/tlpkg/bin/tl-update-bindir
===================================================================
--- trunk/Master/tlpkg/bin/tl-update-bindir	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/tlpkg/bin/tl-update-bindir	2018-03-03 18:29:03 UTC (rev 46798)
@@ -184,7 +184,9 @@
     $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;;

Modified: trunk/Master/tlpkg/bin/tl-update-tlnet
===================================================================
--- trunk/Master/tlpkg/bin/tl-update-tlnet	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/tlpkg/bin/tl-update-tlnet	2018-03-03 18:29:03 UTC (rev 46798)
@@ -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 @@
 unset CDPATH
 unset LS_COLORS
 
-yyyy=2017
+yyyy=2018
 
 check_consistency=true
 chicken=false
@@ -133,7 +133,7 @@
 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.

Modified: trunk/Master/tlpkg/doc/releng.txt
===================================================================
--- trunk/Master/tlpkg/doc/releng.txt	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/tlpkg/doc/releng.txt	2018-03-03 18:29:03 UTC (rev 46798)
@@ -56,36 +56,35 @@
 
 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,11 +92,14 @@
 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.
@@ -104,20 +106,28 @@
 (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
 
-A. After tlnet freeze:
+10. After first rebuild success, undo --recreate and proceed normally.
+
+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

Modified: trunk/Master/tlpkg/tlpsrc/autosp.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/autosp.tlpsrc	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/tlpkg/tlpsrc/autosp.tlpsrc	2018-03-03 18:29:03 UTC (rev 46798)
@@ -1 +1,2 @@
 binpattern f bin/${ARCH}/${PKGNAME}
+binpattern f bin/${ARCH}/tex2aspc

Modified: trunk/Master/tlpkg/tlpsrc/axodraw2.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/axodraw2.tlpsrc	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/tlpkg/tlpsrc/axodraw2.tlpsrc	2018-03-03 18:29:03 UTC (rev 46798)
@@ -0,0 +1 @@
+binpattern f bin/${ARCH}/axohelp

Modified: trunk/Master/tlpkg/tlpsrc/luatex.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/luatex.tlpsrc	2018-03-03 18:17:58 UTC (rev 46797)
+++ trunk/Master/tlpkg/tlpsrc/luatex.tlpsrc	2018-03-03 18:29:03 UTC (rev 46798)
@@ -30,6 +30,11 @@
 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
 #



More information about the tex-live-commits mailing list