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