diff options
-rwxr-xr-x | Master/texmf/scripts/texlive/tlmgr.pl | 78 |
1 files changed, 68 insertions, 10 deletions
diff --git a/Master/texmf/scripts/texlive/tlmgr.pl b/Master/texmf/scripts/texlive/tlmgr.pl index 6a5f8177548..6f695f17e90 100755 --- a/Master/texmf/scripts/texlive/tlmgr.pl +++ b/Master/texmf/scripts/texlive/tlmgr.pl @@ -595,14 +595,9 @@ sub action_update { if (!@todo) { printf "tlmgr update takes either a list of packages or --all\n"; } + my $updater_started = 0; foreach my $pkg (@todo) { next if ($pkg =~ m/^00texlive/); - # it looks like that can actually be done!!! - # It gives several warnings but afterwards the files are changed. Strange - #if (win32() && (($pkg eq "texlive.infra") || ($pkg eq "bin-texlive"))) { - # info("We cannot upgrade $pkg on win32, since we are running it!\n"); - # next; - #} my $tlp = $localtlpdb->get_package($pkg); if (!defined($tlp)) { printf STDERR "Strange, $pkg cannot be found!\n"; @@ -634,16 +629,79 @@ sub action_update { $opt_backupdir, "${pkg}.r" . $tlp->revision); } } - print "update: $pkg (first remove old, then install new)\n"; - merge_into(\%ret, &remove_package($pkg, $localtlpdb, 1)); - merge_into(\%ret, $tlmediasrc->install_package($pkg, $localtlpdb, $opt_nodepends, 0)); - print "update: $pkg done\n"; + + if (win32() && (($pkg =~ m/^texlive\.infra/) || + ($pkg =~ m/^luatex/) || + ($pkg =~ m/^bin-tlperl\.win32$/) || + ($pkg =~ m/^bin-texlive/))) { + if (!$updater_started) { + open UPDATER, ">" . $localtlpdb->root . "/tlpkg/installer/updater.bat" + or die "Cannot create updater.bat: $!"; + print UPDATER <<'EOF'; +rem update program, can savely removed after it has been done +set tlupdate=%~dp0 +set tldrive=%~d0 + +%tldrive% +cd %tlupdate% +rem now we are in .../tlpkg/installer +rem create tar.exe backup +copy tar.exe tarsave.exe +cd .. +cd .. +rem now we are in the root + +EOF +; + $updater_started = 1; + } + # these packages cannot be upgrade on win32 + # so we have to create a update program + my $media = $tlmediasrc->media; + my $remoteroot = $mediatlpdb->root; + my $root = $localtlpdb->root; + my $temp = "$root/temp"; + TeXLive::TLUtils::mkdirhier($temp); + if ($media eq 'DVD') { + tlwarn ("Creating updater from DVD currently not implemented!\n"); + } else { + if ($media eq 'CD') { + copy("$remoteroot/$DiskArchive/$pkg.tar.lzma", "$temp"); + } else { # net + TeXLive::TLUtils::download_file("$remoteroot/$NetArchive/$pkg.tar.lzma", "$temp/$pkg.tar.lzma"); + } + # now we should have the file present + if (! -r "$temp/$pkg.tar.lzma") { + tlwarn ("Couldn't get $pkg.tar.lzma, that is bad\n"); + } else { + # add lines to the un-archiver + print UPDATER <<EOF; +tlpkg\\installer\\lzma\\lzmadec.win32.exe < temp\\$pkg.tar.lzma > temp\\$pkg.tar +tlpkg\\installer\\tarsave.exe -x -f temp\\$pkg.tar +tlmgr include_tlpobj tlpobj\\$pkg.tlpobj +EOF +; + } + } + } else { + print "update: $pkg (first remove old, then install new)\n"; + merge_into(\%ret, &remove_package($pkg, $localtlpdb, 1)); + merge_into(\%ret, $tlmediasrc->install_package($pkg, $localtlpdb, $opt_nodepends, 0)); + print "update: $pkg done\n"; + } } } elsif ($rev > $mediarev) { print "$pkg: revision in $location is less then local revision, not updating!\n"; next; } } + if ($updater_started) { + print UPDATER "del tlpkg\\installer\\tarsave.exe\n"; + print UPDATER "del /s /q temp\n"; + print UPDATER "rmdir temp\n"; + close (UPDATER); + tlwarn("UPDATER has been created, please execute tlpkg\\installer\\updater.bat\n"); + } return(\%ret); } |