From 92d4bbc3da7cdbfd620e1e4b7bdc9823e1e6f91c Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 14 Feb 2022 06:44:19 +0000 Subject: More resilient installation split installation of packages into two stages: first those which are absolutely necessary for the installation process to continue (fmtutil, updmap, tlmgr, ...), and those which are just normal packages which can be installed afterwards for fixing. For now, the option --continue needs to be passed. git-svn-id: svn://tug.org/texlive/trunk@62016 c570f23f-e606-0410-a88d-b1316a301751 --- Master/install-tl | 68 ++++++++++++++++++++++++++++++----------- 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 <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 - 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 +=item C 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}; } -- cgit v1.2.3