summaryrefslogtreecommitdiff
path: root/Master/texmf/scripts
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2009-02-11 01:36:28 +0000
committerNorbert Preining <preining@logic.at>2009-02-11 01:36:28 +0000
commit38870aa3f85399010f2635bc58d83ec8dcb2d2cf (patch)
treea095c81c1a5d0aafa7bb755273aae823946d3331 /Master/texmf/scripts
parent3423445291427575351d3b1e2025f16f66f77c37 (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-xMaster/texmf/scripts/texlive/tlmgr.pl2
-rwxr-xr-xMaster/texmf/scripts/texlive/tlmgrgui/tlmgrgui.pl16
-rw-r--r--Master/texmf/scripts/texlive/w32_updater.bat144
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