diff options
-rwxr-xr-x | Master/texmf/scripts/texlive/tlmgr.pl | 103 | ||||
-rwxr-xr-x | Master/texmf/scripts/texlive/tlmgr2.pl | 129 | ||||
-rw-r--r-- | Master/tlpkg/TeXLive/TLConfig.pm | 9 |
3 files changed, 234 insertions, 7 deletions
diff --git a/Master/texmf/scripts/texlive/tlmgr.pl b/Master/texmf/scripts/texlive/tlmgr.pl index ec9ee674c93..b4fd1bd7c66 100755 --- a/Master/texmf/scripts/texlive/tlmgr.pl +++ b/Master/texmf/scripts/texlive/tlmgr.pl @@ -1095,12 +1095,14 @@ sub action_update { my $opt_noremove = 0; my $opt_backupdir; my $opt_backup = 0; + my $opt_force = 0; Getopt::Long::Configure(@getopt_configure_subopts); GetOptions("no-depends" => \$opt_nodepends, "no-depends-at-all" => \$opt_reallynodepends, "all" => \$opt_all, "list" => \$opt_list, "no-remove" => \$opt_noremove, + "force" => \$opt_force, "backupdir=s" => \$opt_backupdir, "backup" => \$opt_backup, "n|dry-run" => \$opt_dry) or pod2usage(2); @@ -1112,6 +1114,40 @@ sub action_update { my $mediatlpdb = $tlmediasrc->tlpdb; info("update: dry run, no changes will be made\n") if $opt_dry; + # if the update is not for one of the critical packages then do + # check for updates to tlmgr and die unless either --force or --list + # is given + my $other_updates_asked_for = 0; + if ($opt_all) { + $other_updates_asked_for = 1; + } else { + for my $p (@ARGV) { + my $matched = 0; + for my $cp (@CriticalPackagesList) { + # we match for initial package name, that shold be fine + if ($p =~ m/^$cp/) { + $matched = 1; + last; + } + } + if (!$matched) { + $other_updates_asked_for = 1; + last; + } + } + } + if ($other_updates_asked_for) { + if (check_for_critical_updates($localtlpdb, $mediatlpdb)) { + if ($opt_force) { + tlwarn("Continuing due to --force\n"); + } elsif ($opt_list) { + # do not warn here + } else { + die "not continuing, please see warning above!"; + } + } + } + # do backup dir checking now so that we don't run into troubles # later, and exit if that doesn't work if ($opt_backupdir) { @@ -1478,14 +1514,22 @@ sub action_install { my $opt_reallynodepends = 0; my $opt_dry = 0; my $opt_reinstall = 0; + my $opt_force = 0; Getopt::Long::Configure(@getopt_configure_subopts); GetOptions("no-depends" => \$opt_nodepends, "no-depends-at-all" => \$opt_reallynodepends, "reinstall" => \$opt_reinstall, + "force" => \$opt_force, "n|dry-run" => \$opt_dry) or pod2usage(2); my %ret; init_tlmedia(); my $tlmediatlpdb = $tlmediasrc->tlpdb; + + # check for updates to tlmgr itself, and die unless --force is given + if(check_for_critical_updates( $localtlpdb, $tlmediatlpdb, !$opt_force)) { + die "not continuing, please see warning above!"; + } + $opt_nodepends = 1 if $opt_reallynodepends; info("install: dry run, no changes will be made\n") if $opt_dry; @@ -2220,6 +2264,53 @@ sub clear_old_backups } } +# +# check for updates to tlcritical packages +# +sub check_for_critical_updates +{ + my ($localtlpdb, $mediatlpdb) = @_; + + my $criticalupdate = 0; + my @critical = $localtlpdb->expand_dependencies("-no-collections", + $localtlpdb, @CriticalPackagesList); + for my $pkg (sort @critical) { + my $tlp = $localtlpdb->get_package($pkg); + if (!defined($tlp)) { + # that should not happen, we expanded in the localtlpdb so why + # should it not be present, any anyway, those are so fundamental + # so they have to be there + tlwarn("Fundamental package $pkg not present, that is sooo bad.\n"); + die "Serious error, $pkg not found"; + } + my $localrev = $tlp->revision; + my $mtlp = $mediatlpdb->get_package($pkg); + if (!defined($mtlp)) { + tlwarn("Very suprising, $pkg is not present in the remote tlpdb.\n"); + next; + } + my $remoterev = $mtlp->revision; + if ($remoterev > $localrev) { + $criticalupdate = 1; + last; + } + } + if ($criticalupdate) { + tlwarn("==========================================================\n"); + tlwarn("Updates for the tlmgr itself are present.\n"); + tlwarn("Please update the package bin-texlive and texlive.infra first, "); + tlwarn("e.g., by calling\n"); + tlwarn(" tlmgr update bin-texlive texlive.infra\n"); + tlwarn("Or get the latest updater from\nfor Unix-ish systems:\n"); + tlwarn(" $TeXLiveURL/update-tlmgr-latest.sh\n"); + tlwarn("for Windows systems:\n"); + tlwarn(" $TeXLiveURL/update-tlmgr-latest.exe\n"); + tlwarn("Then continue with other updates.\n"); + tlwarn("==========================================================\n"); + } + return($criticalupdate); +} + # # return all the directories from which all content will be removed @@ -2415,6 +2506,12 @@ Don't use it unless you are sure of what you are doing. Nothing is actually installed; instead, the actions to be performed are written to the terminal. +=item B<--force> + +If updates to the tlmgr itself (and the underlying infrastructure) are +present tlmgr will bail out and not perform the installation unless this option +is given. + =back @@ -2449,6 +2546,12 @@ removed, without actually changing anything. Nothing is actually installed; instead, the actions to be performed are written to the terminal. This is a more detailed report than C<--list>. +=item B<--force> + +If updates to the tlmgr itself (and the underlying infrastructure) are +present tlmgr will bail out and not perform the update unless this option +is given (or B<--list> is given). + =item B<--no-remove> Under normal circumstances tlmgr tries to remove packages which have diff --git a/Master/texmf/scripts/texlive/tlmgr2.pl b/Master/texmf/scripts/texlive/tlmgr2.pl index 9aaf02e58b3..25e4e878b60 100755 --- a/Master/texmf/scripts/texlive/tlmgr2.pl +++ b/Master/texmf/scripts/texlive/tlmgr2.pl @@ -6,6 +6,9 @@ # or any later version. # # TODO: +# - in GUI mode updating bin-texlive/texlive.infra DOES work without +# the warning, but it does NOT force to restart the GUI. THAT IS BAD!!! +# # # MAYBE TODO (needs discussion) # - save the remote texlive.tlpdb and its md5-hash, and before downloading @@ -76,7 +79,7 @@ binmode(STDERR, ":utf8"); # # global variable that specifies if a call to finish() should actually # finish the program or immediately return -$::do_finish = 1; +$::gui_mode = 0; # used variables # the TLMedia from which we install/update @@ -92,6 +95,7 @@ our $location; # each action uses this. my @getopt_configure_subopts = qw(no_pass_through permute); + # option variables my $opt_location; my $opt_help = 0; @@ -278,7 +282,7 @@ sub execute_action { die "$0: unknown action: $action\n"; } # close the special log file - if ($packagelogfile && $::do_finish) { + if ($packagelogfile && !$::gui_mode) { info("tlmgr: package log updated at $packagelogfile\n") if $packagelogged; close(PACKAGELOG); } @@ -1116,12 +1120,14 @@ sub action_update { my $opt_noremove = 0; my $opt_backupdir; my $opt_backup = 0; + my $opt_force = 0; Getopt::Long::Configure(@getopt_configure_subopts); GetOptions("no-depends" => \$opt_nodepends, "no-depends-at-all" => \$opt_reallynodepends, "all" => \$opt_all, "list" => \$opt_list, "no-remove" => \$opt_noremove, + "force" => \$opt_force, "backupdir=s" => \$opt_backupdir, "backup" => \$opt_backup, "n|dry-run" => \$opt_dry) or pod2usage(2); @@ -1133,6 +1139,45 @@ sub action_update { my $mediatlpdb = $tlmediasrc->tlpdb; info("update: dry run, no changes will be made\n") if $opt_dry; + # if the update is not for one of the critical packages then do + # check for updates to tlmgr and die unless either --force or --list + # is given + my $other_updates_asked_for = 0; + if ($opt_all) { + $other_updates_asked_for = 1; + } else { + for my $p (@ARGV) { + my $matched = 0; + for my $cp (@CriticalPackagesList) { + # we match for initial package name, that shold be fine + if ($p =~ m/^$cp/) { + $matched = 1; + last; + } + } + if (!$matched) { + $other_updates_asked_for = 1; + last; + } + } + } + if ($other_updates_asked_for) { + if (check_for_critical_updates($localtlpdb, $mediatlpdb)) { + if ($opt_force) { + tlwarn("Continuing due to --force\n"); + } elsif ($opt_list) { + # do not warn here + } else { + if ($::gui_mode) { + # return here and don't do any updates + return; + } else { + die "not continuing, please see warning above!"; + } + } + } + } + # do backup dir checking now so that we don't run into troubles # later, and exit if that doesn't work if ($opt_backupdir) { @@ -1499,14 +1544,23 @@ sub action_install { my $opt_reallynodepends = 0; my $opt_dry = 0; my $opt_reinstall = 0; + my $opt_force = 0; Getopt::Long::Configure(@getopt_configure_subopts); GetOptions("no-depends" => \$opt_nodepends, "no-depends-at-all" => \$opt_reallynodepends, "reinstall" => \$opt_reinstall, + "force" => \$opt_force, "n|dry-run" => \$opt_dry) or pod2usage(2); my %ret; init_tlmedia(); my $tlmediatlpdb = $tlmediasrc->tlpdb; + + # check for updates to tlmgr itself, and die unless --force is given + if(check_for_critical_updates( $localtlpdb, $tlmediatlpdb, !$opt_force)) { + die "not continuing, please see warning above!" + unless $::gui_mode; + } + $opt_nodepends = 1 if $opt_reallynodepends; info("install: dry run, no changes will be made\n") if $opt_dry; @@ -1848,6 +1902,7 @@ sub init_local_db { sub action_gui { my ($guiscreen) = @_; + # yes, two times to make perl warnings shut up ... $::guiscreen = $guiscreen; $::guiscreen = $guiscreen; unshift (@INC, "$Master/texmf/scripts/texlive/tlmgrgui"); @@ -1893,7 +1948,8 @@ Error message from creating MainWindow: } # be sure that sub actions do *not* finish - $::do_finish = 0; + $::gui_mode = 1; + require("tlmgrgui2.pl"); # should not be reached exit(1); @@ -2220,7 +2276,7 @@ sub logpackage { # # finish # evaluates only the -pause option, and then exits -# if the global $::do_finish is set to 0 then the not exit, but return is called +# if the global $::gui_mode is set to 1 then the not exit, but return is called sub finish { my ($ret) = @_; @@ -2233,10 +2289,10 @@ sub finish { <STDIN>; } - if ($::do_finish) { - exit($ret); - } else { + if ($::gui_mode) { return($ret); + } else { + exit($ret); } } @@ -2271,6 +2327,53 @@ sub clear_old_backups } } +# +# check for updates to tlcritical packages +# +sub check_for_critical_updates +{ + my ($localtlpdb, $mediatlpdb) = @_; + + my $criticalupdate = 0; + my @critical = $localtlpdb->expand_dependencies("-no-collections", + $localtlpdb, @CriticalPackagesList); + for my $pkg (sort @critical) { + my $tlp = $localtlpdb->get_package($pkg); + if (!defined($tlp)) { + # that should not happen, we expanded in the localtlpdb so why + # should it not be present, any anyway, those are so fundamental + # so they have to be there + tlwarn("Fundamental package $pkg not present, that is sooo bad.\n"); + die "Serious error, $pkg not found"; + } + my $localrev = $tlp->revision; + my $mtlp = $mediatlpdb->get_package($pkg); + if (!defined($mtlp)) { + tlwarn("Very suprising, $pkg is not present in the remote tlpdb.\n"); + next; + } + my $remoterev = $mtlp->revision; + if ($remoterev > $localrev) { + $criticalupdate = 1; + last; + } + } + if ($criticalupdate) { + tlwarn("==========================================================\n"); + tlwarn("Updates for the tlmgr itself are present.\n"); + tlwarn("Please update the package bin-texlive and texlive.infra first, "); + tlwarn("e.g., by calling\n"); + tlwarn(" tlmgr update bin-texlive texlive.infra\n"); + tlwarn("Or get the latest updater from\nfor Unix-ish systems:\n"); + tlwarn(" $TeXLiveURL/update-tlmgr-latest.sh\n"); + tlwarn("for Windows systems:\n"); + tlwarn(" $TeXLiveURL/update-tlmgr-latest.exe\n"); + tlwarn("Then continue with other updates.\n"); + tlwarn("==========================================================\n"); + } + return($criticalupdate); +} + # # return all the directories from which all content will be removed @@ -2466,6 +2569,12 @@ Don't use it unless you are sure of what you are doing. Nothing is actually installed; instead, the actions to be performed are written to the terminal. +=item B<--force> + +If updates to the tlmgr itself (and the underlying infrastructure) are +present tlmgr will bail out and not perform the installation unless this option +is given. + =back @@ -2500,6 +2609,12 @@ removed, without actually changing anything. Nothing is actually installed; instead, the actions to be performed are written to the terminal. This is a more detailed report than C<--list>. +=item B<--force> + +If updates to the tlmgr itself (and the underlying infrastructure) are +present tlmgr will bail out and not perform the update unless this option +is given (or B<--list> is given). + =item B<--no-remove> Under normal circumstances tlmgr tries to remove packages which have diff --git a/Master/tlpkg/TeXLive/TLConfig.pm b/Master/tlpkg/TeXLive/TLConfig.pm index c3329fac362..ee5a903f12d 100644 --- a/Master/tlpkg/TeXLive/TLConfig.pm +++ b/Master/tlpkg/TeXLive/TLConfig.pm @@ -26,6 +26,7 @@ BEGIN { $TeXLiveServerPath $TeXLiveURL $WinSpecialUpdatePackagesRegexp + @CriticalPackagesList ); @EXPORT = @EXPORT_OK; } @@ -61,6 +62,9 @@ our $TeXLiveURL = "$TeXLiveServerURL/$TeXLiveServerPath"; our $WinSpecialUpdatePackagesRegexp = '^(texlive\.infra|luatex|bin-tlperl\.win32$|bin-texlive|bin-kpathsea)'; + +our @CriticalPackagesList = qw/texlive.infra bin-texlive/; + 1; @@ -136,6 +140,11 @@ release version, such as C<tldev> or C<2008>. A regexp matching all those packages which cannot be normally updated because they contain files which are open during the update process. +=item C<@TeXLive::TLConfig::CriticalPackagesList> + +A list of all those packages which we do not update regularly +since they are too central, currently bin-texlive and texlive.infra. + =back =head1 SEE ALSO |