@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 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 "%~dp0tar.exe" "%~dp0tarsave.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 .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\" %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 "%~x2"==".src" (set type=.source) else (set type=%~x2) if %~n1_==__BACKUP__ set "ext=r%~3.tar" tlpkg\installer\tarsave.exe -x -f "%~1%~n2%type%.%ext%" && del "%~1%~n2%type%.%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.==.src. 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