summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xMaster/install-tl68
-rw-r--r--Master/tlpkg/TeXLive/TLUtils.pm16
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};
}