diff options
author | Norbert Preining <preining@logic.at> | 2009-02-11 01:36:28 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2009-02-11 01:36:28 +0000 |
commit | 38870aa3f85399010f2635bc58d83ec8dcb2d2cf (patch) | |
tree | a095c81c1a5d0aafa7bb755273aae823946d3331 /Master/texmf/scripts | |
parent | 3423445291427575351d3b1e2025f16f66f77c37 (diff) |
move w32_updater to texmf/scripts/texlive/, and let the GUI exit if
updates have been prepared.
git-svn-id: svn://tug.org/texlive/trunk@12136 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf/scripts')
-rwxr-xr-x | Master/texmf/scripts/texlive/tlmgr.pl | 2 | ||||
-rwxr-xr-x | Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl | 16 | ||||
-rw-r--r-- | Master/texmf/scripts/texlive/w32_updater.bat | 144 |
3 files changed, 155 insertions, 7 deletions
diff --git a/Master/texmf/scripts/texlive/tlmgr.pl b/Master/texmf/scripts/texlive/tlmgr.pl index 36087f9dc9f..6132a43c2e5 100755 --- a/Master/texmf/scripts/texlive/tlmgr.pl +++ b/Master/texmf/scripts/texlive/tlmgr.pl @@ -1201,7 +1201,7 @@ sub write_w32_updater { } return 0 if ($opts{"dry-run"}); # nothing else to do # write the updater script file - open UPDATER, ">$root/tlpkg/installer/updater" + open UPDATER, ">$root/texmf/scripts/texlive/updater" or die "Cannot create updater: $!"; print UPDATER '@echo off setlocal enableextensions diff --git a/Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl b/Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl index b7da39b5175..3dc9bac0098 100755 --- a/Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl +++ b/Master/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl @@ -106,6 +106,7 @@ $TRANS{'en'} = { # new ones backupdir => "Default backup directory", autobackup => "Auto backup setting", + critupdates => "Updates for the tlmgr are present.\nInstallation and upgrades won't work without being forced.\nPlease select only (if listed) the bin-texlive and texlive.infra package\nand press \"update selected packages\".\nAfter that the Program Window will be closed and the update will be finished automatically." }; @@ -494,8 +495,13 @@ sub update_selected_packages { } push @args, @_; execute_action_gui(@args); - reinit_local_tlpdb(); if (win32() && $updater_needed) { + # terminate here immediately so that we are sure the auto-updater + # is run immediately + # make sure we exit in finish(0) + $::gui_mode = 0; + finish(0); + # the following code is not reached anymore ... my $t = ___"runupdater"; $t =~ s/TEXROOT/$Master/; # TODO TODO TODO TODO @@ -510,6 +516,7 @@ sub update_selected_packages { # -text => $t, # -buttons => [ ___"ok" ])->Show; } + reinit_local_tlpdb(); # TODO TODO TODO # we should give a warning window when something didn't work out!!! } @@ -602,11 +609,8 @@ sub create_update_list { } if ($criticalupdate) { my $sw = $mw->DialogBox(-title => ___"warning", -buttons => [ ___"ok" ]); - $sw->add("Label", -text => "Updates for the tlmgr are present. -Installation and upgrades won't work without being forced. -Please select only (if listed) the bin-texlive and texlive.infra package -and press \"update selected packages\". Then quit the program." - )->pack(-padx => "3m", -pady => "3m"); + $sw->add("Label", -text => ___"critupdates")->pack(-padx => "3m", + -pady => "3m"); $sw->Show; } } diff --git a/Master/texmf/scripts/texlive/w32_updater.bat b/Master/texmf/scripts/texlive/w32_updater.bat new file mode 100644 index 00000000000..cbd8982c6f3 --- /dev/null +++ b/Master/texmf/scripts/texlive/w32_updater.bat @@ -0,0 +1,144 @@ +@echo off +rem Update script for TeX Live infrastructure +rem called automatically if there are any infrastructure updates +rem +rem Copyright 2009 by Tomasz M. Trzeciak <t.m.trzeciak@googlemail.com> +rem This file is licensed under the GNU General Public License version 2 +rem or any later version. +rem + +rem This script makes some very specific assumptions. +rem Arguments are expected to be a package list passed in triples: +rem package-name old-revision-number new-revision-number +rem For each package-name a tar archive package-name.tar is +rem expected as well (also for .source and .doc pseudo packages - +rem - those are for distribution only and don't appear as separate +rem entries in tlpdb) and a corresponding backup archive +rem __BACKUP_package-name.rXXX.tar, where XXX is (old) +rem revision number (.source and .doc are included in them) + +rem The update logic is follows: +rem (1) untar all package archives +rem (2) include .tlpobj files into tlpdb +rem (3) print update info +rem Any error during (1) or (2) trigers a rollback action: +rem (1) print failed update info +rem (2) untar all package backups +rem (3) include .tlpobj files (from backup) into tlpdb +rem (4) print restore info and popup an error dialog +rem Any error during (1) or (2) and we go into panic mode. +rem At this point there is no guarantee that the installation is still +rem working. There is not much we can do but to print failed restore info +rem and popup a fatal error dialog with instructions to download and run +rem 'update-tlmgr-latest.exe' when everything else failed. + +rem make environment changes local & enable cmd extensions +setlocal enableextensions +rem get installation root +for /f "delims=" %%D in ('kpsewhich -var-value=SELFAUTOPARENT') do (set tlroot=%%~fD) +if exist "%tlroot%\" goto :foundtlroot +>&2 echo Could not locate installation root. +exit /b 1 + +:foundtlroot +rem get location of the log file +for /f "delims=" %%D in ('kpsewhich -var-value=TEXMFSYSVAR') do (set logdir=%%~fD\web2c) +if not exist "%logdir%\" (set logdir=temp) +rem cd to root +cd /d "%tlroot%" +rem create tar.exe backup +>nul copy /y "tlpkg\installer\tar.exe" "tlpkg\installer\tarsave.exe" +rem set up perl environment +set "PERL5LIB=%tlroot%\tlpkg\tlperl\lib" +rem let's make sure that we can use dynamic variables +(set errorlevel=) +(set date=) +(set time=) + +rem get package list from arguments +(set pkgpartslist=%*) +if not defined pkgpartslist exit /b 0 +rem construct package list without .source and .doc packages +rem count the total number of packages while doing that +set pkgcount=0 +(set pkglist=) +call :foreachpkg :remove_src_doc pkglist %pkgpartslist% + +echo DO NOT CLOSE THIS WINDOW! +echo TeX Live infrastructure update in progress... +call :foreachpkg :untar "temp\" %pkgpartslist% || goto :rollback +call :foreachpkg :incltlpobj "tlpkg\tlpobj\" %pkgpartslist% || goto :rollback +call :foreachpkg :update_info "" %pkglist% +echo Update complete. +set exitcode=0 +goto :finish + +:rollback +call :foreachpkg :update_info ">&2" %pkglist% +>&2 echo Update failed! Rolling back to previous version... +call :foreachpkg :untar "temp\__BACKUP_" %pkglist% || goto :panic +call :foreachpkg :incltlpobj "tlpkg\tlpobj\" %pkglist% || goto :panic +call :foreachpkg :restore_info "" %pkglist% +echo Recovery from backup successful. +call :errorpopup "ERROR: TeX Live" "TeX Live infrastructure update failed." +set exitcode=1 +goto :finish + +:panic +call :foreachpkg :restore_info ">&2" %pkglist% +>&2 echo FATAL ERROR: recovery from backup failed! +echo Your TeX Live installation may be broken, to repair it download and run: +echo http://mirror.ctan.org/systems/texlive/tlnet/2008/update-tlmgr-latest.exe +call :errorpopup "FATAL ERROR: TeX Live" "TeX Live infrastructure update failed and so did recovery from backup.\nYour TeX Live installation may be broken, to repair it download and run:\nhttp://mirror.ctan.org/systems/texlive/tlnet/2008/update-tlmgr-latest.exe" +rem Evil has taken over - emit adequate exit code +exit /b 666 + +:finish +2>nul del tlpkg\installer\tarsave.exe temp\__BACKUP_* +exit /b %exitcode% + +REM SUBROUTINES + +:foreachpkg cmd prefix [pkg_name oldrev newrev [...]] +set pkgcurr=0 +:pkgloop +if [%3]==[] exit /b 0 +set /a pkgcurr+=1 +call %~1 %2 %3 %4 %5 +if errorlevel 1 exit /b %errorlevel% +shift /3 & shift /3 & shift /3 +goto :pkgloop + +:untar temp\[__BACKUP_] pkg_name +set "ext=tar" +if %~n1_==__BACKUP__ set "ext=r%~3.tar" +tlpkg\installer\tarsave.exe -x -f "%~1%~2.%ext%" && del "%~1%~2.%ext%" +exit /b %errorlevel% + +:incltlpobj tlpkg\tlpobj\ pkg_name +tlpkg\tlperl\bin\perl.exe texmf\scripts\texlive\tlmgr.pl _include_tlpobj "%~1%~2.tlpobj" +exit /b %errorlevel% + +:remove_src_doc +if /i %~x2.==.source. exit /b 0 +if /i %~x2.==.doc. exit /b 0 +set %1=%pkglist% %2 %3 %4 +set /a pkgcount+=1 +exit /b 0 + +:update_info redir pkg_name oldrev newrev +set "infomsg=update: %~2 (%~3 -^> %~4)" +goto :continue_info +:restore_info redir pkg_name oldrev newrev +set "infomsg=restore: %~2 (%~3)" +:continue_info +if "%~1"==">&2" set "infomsg=failed %infomsg%" +>>"%logdir%\tlmgr.log" echo [%date% %time%] %infomsg% +%~1 echo [%pkgcurr%/%pkgcount%] %infomsg% +exit /b 0 + +:errorpopup "title string" "message text" +>temp\errorpopup.vbs echo CreateObject("Scripting.FileSystemObject").DeleteFile(WScript.ScriptFullName) : MsgBox Replace("%~2","\n",Chr(10)), 16, "%~1" +wscript temp\errorpopup.vbs +rem del temp\errorpopup.vbs +exit /b 0
\ No newline at end of file |