summaryrefslogtreecommitdiff
path: root/Master/tlpkg
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2009-02-09 07:16:35 +0000
committerNorbert Preining <preining@logic.at>2009-02-09 07:16:35 +0000
commitc92f1ff98e4fc53d91cec289ca90cfd8ab6b15f1 (patch)
tree770e96de7b4a8ba54ec83fca43d1f4166d1fb4f4 /Master/tlpkg
parentade7ca0899ec126ca5c34413ec4e23d3a09a7732 (diff)
new patch from Tomek for tmgr/w32_updater
git-svn-id: svn://tug.org/texlive/trunk@12122 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg')
-rw-r--r--Master/tlpkg/installer/w32_updater.cmd123
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