diff options
-rwxr-xr-x | Master/install-tl | 68 | ||||
-rw-r--r-- | Master/tlpkg/TeXLive/TLUtils.pm | 16 |
2 files changed, 62 insertions, 22 deletions
diff --git a/Master/install-tl b/Master/install-tl index 3f4dfe0a80e..855bb38b1fd 100755 --- a/Master/install-tl +++ b/Master/install-tl @@ -298,6 +298,8 @@ my $opt_scheme = ""; my $opt_version = 0; my $opt_warn_checksums = 1; my $opt_font; +# we might want to set this to 1 ...? TODO +my $opt_continue = 0; # unusual cases: $::opt_select_repository = 0; our $opt_in_place = 0; @@ -317,6 +319,9 @@ $::lang = "en"; # do not debug translations by default $::debug_translation = 0; +# List of packages that failed to install but we continued due to --continue +@::installation_failed_packages = (); + # before we try to interact with the user, we need to know whether or not # install-tl was called from an external gui. This gui will start install-tl # with "-from_ext_gui" as its first command-line option. @@ -361,6 +366,7 @@ process_logging_options(); # now the others GetOptions( "all-options" => \$::opt_all_options, + "continue" => \$opt_continue, "custom-bin=s" => \$opt_custom_bin, "debug-translation" => \$::debug_translation, "fancyselector", @@ -716,6 +722,19 @@ if ($opt_gui eq 'text' or $opt_gui eq 'extl' or $opt_profile ne "") { } printf STDOUT "Installed on platform %s at %s\n", $vars{'this_platform'}, $vars{'TEXDIR'} if ($opt_gui eq 'extl'); + + if (@::installation_failed_packages) { + print <<EOF; +*************** WARNING ************************* +The following list of inessential packages have failed to install + @::installation_failed_packages +You can fix this by running + tlmgr update --all --reinstall-forcibly-removed +to complete the installation. Doing this immediately might not work +and the command needs to be called later on. +************************************************ +EOF + } } exit $status; @@ -2107,24 +2126,31 @@ sub read_profile { } # read_profile sub do_install_packages { - # let's install the critical packages first, since they are the most - # likely to fail (so let's fail early), and nothing is usable without them. + # We split installation of packages into two stages: + # - first critical packages, those absolutely necessary for working + # - all the other packages, that can be also installed afterwards + # via tlmgr + # If something fails in the first group, we stop the installation. + # If something fails in the second group: + # - if --continue is given, try to continue install + # - if --continue is not given, terminate (behaviour till now) + # + my @criticalwhat = (); my @what = (); - foreach my $package (sort { - if ($a =~ /$CriticalPackagesRegexp/) { - if ($b =~ /$CriticalPackagesRegexp/) { - return $a cmp $b; # both critical - } else { - return -1; # critical before non-critical - } - } elsif ($b =~ /$CriticalPackagesRegexp/) { - return 1; # critical before non-critical - } else { - return $a cmp $b; - } - } keys %install) { - push (@what, $package) if ($install{$package} == 1); + my @surely_fail_packages = @CriticalPackagesList; + # texlive-scripts are necessary for mktexlsr, updmap, fmtutil, ... + # the installation cannot continue without those + # TODO for Windows ... what else is needed? luatex? + push @surely_fail_packages, "texlive-scripts"; + for my $package (keys %install) { + if (member($package, @surely_fail_packages)) { + push @criticalwhat, $package if ($install{$package} == 1); + } else { + push @what, $package if ($install{$package} == 1); + } } + @criticalwhat = sort @criticalwhat; + @what = sort @what; # temporary unset the localtlpdb options responsible for # running all kind of postactions, since install_packages # would call them without the PATH already set up @@ -2132,9 +2158,15 @@ sub do_install_packages { $localtlpdb->option ("desktop_integration", "0"); $localtlpdb->option ("file_assocs", "0"); $localtlpdb->option ("post_code", "0"); - if (!install_packages($tlpdb,$media,$localtlpdb,\@what, + if (!install_packages($tlpdb,$media,$localtlpdb,\@criticalwhat, + $vars{'tlpdbopt_install_srcfiles'}, + $vars{'tlpdbopt_install_docfiles'}, + 0) + || + !install_packages($tlpdb,$media,$localtlpdb,\@what, $vars{'tlpdbopt_install_srcfiles'}, - $vars{'tlpdbopt_install_docfiles'})) { + $vars{'tlpdbopt_install_docfiles'}, + $opt_continue)) { my $profile_name = "installation.profile"; create_profile($profile_name); tlwarn("Installation failed.\n"); diff --git a/Master/tlpkg/TeXLive/TLUtils.pm b/Master/tlpkg/TeXLive/TLUtils.pm index 675a5463385..2cd96368c4a 100644 --- a/Master/tlpkg/TeXLive/TLUtils.pm +++ b/Master/tlpkg/TeXLive/TLUtils.pm @@ -73,7 +73,7 @@ C<TeXLive::TLUtils> - TeX Live infrastructure miscellany TeXLive::TLUtils::create_language_def($tlpdb,$dest,$localconf); TeXLive::TLUtils::create_language_lua($tlpdb,$dest,$localconf); TeXLive::TLUtils::time_estimate($totalsize, $donesize, $starttime) - TeXLive::TLUtils::install_packages($from_tlpdb,$media,$to_tlpdb,$what,$opt_src, $opt_doc)>); + TeXLive::TLUtils::install_packages($from_tlpdb,$media,$to_tlpdb,$what,$opt_src, $opt_doc, $continue); TeXLive::TLUtils::do_postaction($how, $tlpobj, $do_fileassocs, $do_menu, $do_desktop, $do_script); TeXLive::TLUtils::announce_execute_actions($how, @executes, $what); TeXLive::TLUtils::add_symlinks($root, $arch, $sys_bin, $sys_man, $sys_info); @@ -1579,7 +1579,7 @@ sub time_estimate { } -=item C<install_packages($from_tlpdb, $media, $to_tlpdb, $what, $opt_src, $opt_doc)> +=item C<install_packages($from_tlpdb, $media, $to_tlpdb, $what, $opt_src, $opt_doc, $continue)> Installs the list of packages found in C<@$what> (a ref to a list) into the TLPDB given by C<$to_tlpdb>. Information on files are taken from @@ -1588,12 +1588,15 @@ the TLPDB C<$from_tlpdb>. C<$opt_src> and C<$opt_doc> specify whether srcfiles and docfiles should be installed (currently implemented only for installation from uncompressed media). +If C<$continue> is trueish, installation failure of non-critical packages +will be ignored. + Returns 1 on success and 0 on error. =cut sub install_packages { - my ($fromtlpdb,$media,$totlpdb,$what,$opt_src,$opt_doc) = @_; + my ($fromtlpdb,$media,$totlpdb,$what,$opt_src,$opt_doc, $opt_continue) = @_; my $container_src_split = $fromtlpdb->config_src_container; my $container_doc_split = $fromtlpdb->config_doc_container; my $root = $fromtlpdb->root; @@ -1670,7 +1673,12 @@ sub install_packages { info("$infostr\n"); # return false if download failed again if (!$fromtlpdb->install_package($package, $totlpdb)) { - return 0; + if ($opt_continue) { + push @::installation_failed_packages, $package; + tlwarn("Failed to install $package, but continue anyway!\n"); + } else { + return 0; + } } $donesize += $tlpsizes{$package}; } |