summaryrefslogtreecommitdiff
path: root/Master/install-tl
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2022-02-14 06:44:19 +0000
committerNorbert Preining <preining@logic.at>2022-02-14 06:44:19 +0000
commit92d4bbc3da7cdbfd620e1e4b7bdc9823e1e6f91c (patch)
tree3bbfac6464dc3be98b565b8e6f9696fc47256002 /Master/install-tl
parent081a18380b9a8d620d2077126008912608650a34 (diff)
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
Diffstat (limited to 'Master/install-tl')
-rwxr-xr-xMaster/install-tl68
1 files changed, 50 insertions, 18 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");