diff options
Diffstat (limited to 'Master/tlpkg/installer')
-rw-r--r-- | Master/tlpkg/installer/w32_updater.cmd | 123 |
1 files changed, 76 insertions, 47 deletions
diff --git a/Master/tlpkg/installer/w32_updater.cmd b/Master/tlpkg/installer/w32_updater.cmd index b92a8d4a5bf..df0d84acf92 100644 --- a/Master/tlpkg/installer/w32_updater.cmd +++ b/Master/tlpkg/installer/w32_updater.cmd @@ -1,106 +1,130 @@ @echo off rem Update script for TeX Live infrastructure -rem called automatically if detected by tlmgr launcher +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 -2>nul verify nonzero_errorlevel setlocal enableextensions -if not errorlevel 1 goto :begin ->&2 echo CMD.EXE extensions not available. Aborting... +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 -:begin -rem let's make sure that we can use dynamic variables -set "errorlevel=" -set "date=" -set "time=" -rem get root location -for /f "delims=" %%D in ('kpsewhich -var-value=SELFAUTOPARENT') do set "TLROOT=%%~fD" +:foundtlroot rem get location of the log file -for /f "delims=" %%D in ('kpsewhich -var-value=TEXMFSYSVAR') do set "logdir=%%~fD\web2c\" +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%" +cd /d "%tlroot%" rem create tar.exe backup >nul copy /y "%~dp0tar.exe" "%~dp0tarsave.exe" rem set up perl environment -set "PERL5LIB=%TLROOT%\tlpkg\tlperl\lib" +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 pkglist=%* -if not defined pkglist goto :finish +(set pkgpartslist=%*) +if not defined pkgpartslist exit /b 0 +rem construct package list without .src 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\" %pkglist% || goto :rollback -call :foreachpkg :tlobj "tlpkg\tlpobj\" %pkglist% || goto :rollback -set pkglist=& call :foreachpkg :filter_src_doc "" %pkglist% +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 -set pkglist=& call :foreachpkg :filter_src_doc "" %pkglist% 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 :tlobj "tlpkg\tlpobj\" %pkglist% || goto :panic +call :foreachpkg :incltlpobj "tlpkg\tlpobj\" %pkglist% || goto :panic call :foreachpkg :restore_info "" %pkglist% echo Recovery from backup successful. - >temp\popup.vbs echo MsgBox "TeX Live infrastructure update failed." ^& Chr(10) ^& _ ->>temp\popup.vbs echo "Recovery from backup succeeded.", _ ->>temp\popup.vbs echo 48, "TeX Live update" -start /wait wscript temp\popup.vbs -del temp\popup.vbs +call :errorpopup "ERROR: TeX Live" "TeX Live infrastructure update failed." set exitcode=1 goto :finish -:finish -del tlpkg\installer\tarsave.exe temp\__BACKUP_* -rem start /b cmd /c del "%~f0" & exit /b 0 -exit /b %exitcode% - :panic call :foreachpkg :restore_info ">&2" %pkglist% >&2 echo FATAL ERROR: recovery from backup failed! -echo To repair your TeX Live installation download and run: +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 - >temp\popup.vbs echo MsgBox "TeX Live infrastructure update failed and so did recovery from backup." ^& Chr(10) ^& _ ->>temp\popup.vbs echo "To repair your TeX Live installation download and run:" ^& Chr(10) ^& _ ->>temp\popup.vbs echo "http://mirror.ctan.org/systems/texlive/tlnet/2008/update-tlmgr-latest.exe", _ ->>temp\popup.vbs echo 16, "FATAL ERROR: TeX Live update" -start /wait wscript temp\popup.vbs -del temp\popup.vbs +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 :foreachpkg +goto :pkgloop :untar temp\[__BACKUP_] pkg_name set "ext=tar" +if "%~x2"==".src" (set type=.source) else (set type=%~x2) if %~n1_==__BACKUP__ set "ext=r%~3.tar" -tlpkg\installer\tarsave.exe -x -f "%~1%~2.%ext%" && del "%~1%~2.%ext%" +tlpkg\installer\tarsave.exe -x -f "%~1%~n2%type%.%ext%" && del "%~1%~n2%type%.%ext%" exit /b %errorlevel% -:tlobj tlpkg\tlpobj\ pkg_name +:incltlpobj tlpkg\tlpobj\ pkg_name tlpkg\tlperl\bin\perl.exe texmf\scripts\texlive\tlmgr.pl _include_tlpobj "%~1%~2.tlpobj" exit /b %errorlevel% -:filter_src_doc +:remove_src_doc if /i %~x2.==.src. exit /b 0 if /i %~x2.==.doc. exit /b 0 -set pkglist=%pkglist% %2 %3 %4 +set %1=%pkglist% %2 %3 %4 +set /a pkgcount+=1 exit /b 0 :update_info redir pkg_name oldrev newrev @@ -109,8 +133,13 @@ goto :continue_info :restore_info redir pkg_name oldrev newrev set "infomsg=restore: %~2 (%~3)" :continue_info -rem exit /b 0 -if "%~1"==">&2" set "infomsg=failed %infomsg% -rem >>%logdir%tlmgr.log echo [%date% %time%] %infomsg% -%~1 echo %infomsg% +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 |