diff options
Diffstat (limited to 'Master/tlpkg/etc')
-rw-r--r-- | Master/tlpkg/etc/dev.rework-setup-programs-with-copy.patch | 245 |
1 files changed, 198 insertions, 47 deletions
diff --git a/Master/tlpkg/etc/dev.rework-setup-programs-with-copy.patch b/Master/tlpkg/etc/dev.rework-setup-programs-with-copy.patch index 70b0d49e5f7..6d38d05a3e6 100644 --- a/Master/tlpkg/etc/dev.rework-setup-programs-with-copy.patch +++ b/Master/tlpkg/etc/dev.rework-setup-programs-with-copy.patch @@ -1,8 +1,73 @@ +Index: tlpkg/TeXLive/TLConfig.pm +=================================================================== +--- tlpkg/TeXLive/TLConfig.pm (revision 11959) ++++ tlpkg/TeXLive/TLConfig.pm (working copy) +@@ -28,6 +28,7 @@ + $WinSpecialUpdatePackagesRegexp + @CriticalPackagesList + @AllowedConfigOptions ++ @PostMortemRemovals + ); + @EXPORT = @EXPORT_OK; + } +@@ -81,7 +82,9 @@ + backupdir + autobackup + /; +- ++ ++our @PostMortemRemovals = (); ++ + 1; + + +@@ -165,6 +168,11 @@ + + A list of a config options that can be set in 00texlive-installation.config. + ++=item C<@TeXLive::TLConfig::PostMortemRemovals> ++ ++A list of files and directories we try to remove after install-tl or ++tlmgr has been terminated. ++ + =back + + =head1 SEE ALSO Index: tlpkg/TeXLive/TLUtils.pm =================================================================== ---- tlpkg/TeXLive/TLUtils.pm (revision 11951) +--- tlpkg/TeXLive/TLUtils.pm (revision 11959) +++ tlpkg/TeXLive/TLUtils.pm (working copy) -@@ -1265,31 +1265,44 @@ +@@ -1324,10 +1324,6 @@ + If a program is not present in the TeX Live tree, we also check along + PATH (without the platform extension.) + +-Returns -1 if the architecture is not supported (i.e., there is no +-C<lzmadec> binary for that arch present), 0 for programs that are +-present but don't work, and 1 for success. +- + =cut + + sub setup_programs { +@@ -1342,7 +1338,17 @@ + $::progs{'tar'} = conv_to_w32_path("$bindir/tar.exe"); + $::progs{'lzmadec'} = conv_to_w32_path("$bindir/lzma/lzmadec.win32.exe"); + $::progs{'lzma'} = conv_to_w32_path("$bindir/lzma/lzma.exe"); +- ++ for my $prog ("lzmadec", "wget") { ++ my $opt = $prog eq "lzmadec" ? "--help" : "--version"; ++ my $ret = system("$::progs{$prog} $opt > nul 2>&1"); # on windows ++ if ($ret != 0) { ++ warn "TeXLive::TLUtils::setup_programs failed"; # no newline ++ warn "$::progs{$prog} $opt failed (status $ret): $!\n"; ++ warn "Output is:\n"; ++ system ("$::progs{$prog} $opt"); ++ return 0; ++ } ++ } + } else { + if (!defined($platform) || ($platform eq "")) { + # we assume that we run from the DVD, so we can call platform() and +@@ -1352,51 +1358,102 @@ $::installerdir = "$bindir/../.."; $platform = platform(); } @@ -13,41 +78,10 @@ Index: tlpkg/TeXLive/TLUtils.pm - $::progs{'lzma'} = "$bindir/lzma/lzma.$platform" - if -x "$bindir/lzma/lzma.$platform"; + our $tmp; -+ # TODO TODO TODO -+ # it seems that the -x bit checking is not enough because perl -+ # returns true on -x but still the noexec overrides that ... -+ # we need to actually execute the file to see if it works -+ sub setup_one { -+ my ($p, $def) = @_; -+ our $tmp; -+ if (-r $def) { -+ if (-x $def) { -+ $::progs{$p} = $def; -+ } else { -+ # create tmp dir only when necessary -+ chomp ($tmp = `mktemp -d`) unless defined($tmp); -+ # probably we are running from DVD and want to copy it to -+ # some temporary location -+ copy($def, $tmp); -+ my $bn = basename($def); -+ $::progs{$p} = "$tmp/$bn"; -+ chmod(0755,$::progs{$p}); -+ # we do not check the return value of chmod, but check whether -+ # the -x bit is now set, the only thing that counts -+ if (! -x $::progs{$p}) { -+ # hmm, something is going really bad, not even the copy is -+ # executable. Fall back to normal path element -+ $::progs{$p} = $p; -+ } -+ } -+ } else { -+ # hope that we can find in in the global PATH -+ $::progs{$p} = $p; -+ } -+ } -+ setup_one('wget', "$bindir/wget/wget.$platform"); -+ setup_one('lzmadec', "$bindir/lzma/lzmadec.$platform"); -+ setup_one('lzma', "$bindir/lzma/lzma.$platform"); ++ setup_unix_one('wget', "$bindir/wget/wget.$platform", "--version"); ++ setup_unix_one('lzmadec', "$bindir/lzma/lzmadec.$platform", "--help"); ++ setup_unix_one('lzma', "$bindir/lzma/lzma.$platform", "notest"); ++ push @TeXLive::TLConfig::PostMortemRemovals, $tmp; } - # Check for existence of lzmadec in our directory; if so, the present @@ -60,28 +94,145 @@ Index: tlpkg/TeXLive/TLUtils.pm - # - (my $lzmadec = $::progs{'lzmadec'}) =~ s/^"(.*)"/$1/; - my $found_lzmadec = -x $lzmadec; -- ++ return 1; # success ++} + - # should we do something like this? - #if (-r $lzmadec && ! -x $lzmadec) { - # warn "$lzmadec is not executable. You might want to mount the DVD without the 'noexec' option."; - # return 0; - #} - - # check if the programs are working, but do not test tar, we rely on - # the system having a usable one. The main point is to check the - # binaries we provide. -@@ -1302,7 +1315,7 @@ - warn "$::progs{$prog} $opt failed (status $ret): $!\n"; - warn "Output is:\n"; - system ("$::progs{$prog} $opt"); +- # check if the programs are working, but do not test tar, we rely on +- # the system having a usable one. The main point is to check the +- # binaries we provide. +- for my $prog ("lzmadec", "wget") { +- my $opt = $prog eq "lzmadec" ? "--help" : "--version"; +- my $ret = system("$::progs{$prog} $opt >" +- . (win32() ? "nul" : "/dev/null") . " 2>&1"); +- if ($ret != 0) { +- warn "TeXLive::TLUtils::setup_programs failed"; # no newline +- warn "$::progs{$prog} $opt failed (status $ret): $!\n"; +- warn "Output is:\n"; +- system ("$::progs{$prog} $opt"); - return $found_lzmadec ? 0 : -1; -+ return 0; ++sub setup_unix_one { ++ my ($p, $def, $arg) = @_; ++ our $tmp; ++ my $test_fallback = 0; ++ if (-r $def) { ++ my $ready = 0; ++ if (-x $def) { ++ # checking only for the executable bit is not enough, we have ++ # to check for actualy "executability" since a "noexec" mount ++ # option may interfere, which is not taken into account by ++ # perl's -x test. ++ $::progs{$p} = $def; ++ if ($arg ne "notest") { ++ my $ret = system("$def $arg > /dev/null 2>&1" ); # we are on Unix ++ if ($ret == 0) { ++ $ready = 1; ++ debug("Using shipped $def for $p (tested).\n"); ++ } else { ++ ddebug("Shipped $def has -x but cannot be executed.\n"); ++ } ++ } else { ++ # do not test, just return ++ $ready = 1; ++ debug("Using shipped $def for $p (not tested).\n"); ++ } } ++ if (!$ready) { ++ # out of some reasons we couldn't execute the shipped program ++ # try to copy it to a temp directory and make it executable ++ # ++ # create tmp dir only when necessary ++ chomp ($tmp = `mktemp -d`) unless defined($tmp); ++ # probably we are running from DVD and want to copy it to ++ # some temporary location ++ copy($def, $tmp); ++ my $bn = basename($def); ++ $::progs{$p} = "$tmp/$bn"; ++ push @TeXLive::TLConfig::PostMortemRemovals, $::progs{$p}; ++ chmod(0755,$::progs{$p}); ++ # we do not check the return value of chmod, but check whether ++ # the -x bit is now set, the only thing that counts ++ if (! -x $::progs{$p}) { ++ # hmm, something is going really bad, not even the copy is ++ # executable. Fall back to normal path element ++ $test_fallback = 1; ++ ddebug("Copied $p $::progs{$p} does not have -x bit, strange!\n"); ++ } else { ++ # check again for executability ++ if ($arg ne "notest") { ++ my $ret = system("$::progs{$p} $arg > /dev/null 2>&1"); ++ if ($ret == 0) { ++ # ok, the copy works ++ debug("Using copied $::progs{$p} for $p (tested).\n"); ++ } else { ++ # even the copied prog is not executable, strange ++ $test_fallback = 1; ++ ddebug("Copied $p $::progs{$p} has x bit but not executable, strange!\n"); ++ } ++ } else { ++ debug("Using copied $::progs{$p} for $p (not tested).\n"); ++ } ++ } ++ } ++ } else { ++ # hope that we can find in in the global PATH ++ $test_fallback = 1; + } +- +- return 1; # success ++ if ($test_fallback) { ++ # all our playing around and copying did not succeed, try the ++ # fallback ++ $::progs{$p} = $p; ++ if ($arg ne "notest") { ++ my $ret = system("$p $arg > /dev/null 2>&1"); ++ if ($ret == 0) { ++ debug("Using system $p (tested).\n"); ++ } else { ++ tlwarn("TeXLive::TLUtils::setup_programs failed.\n"); ++ tlwarn("Could not find a usable program for $p.\n"); ++ return 0; ++ } ++ } else { ++ debug ("Using system $p (not tested).\n"); ++ } ++ } + } + +- + =item C<download_file( $relpath, $destination [, $progs ] )> + + Try to download the file given in C<$relpath> from C<$TeXLiveURL> +Index: install-tl +=================================================================== +--- install-tl (revision 11959) ++++ install-tl (working copy) +@@ -1371,6 +1371,17 @@ + } else { + print "No logfile\n"; } ++ ++ # remove stuff that has been accumulated in @PostMortemRemoval ++ # do not check for any success in removal. ++ # ++ # first remove all not dirs, then try to remove dirs ++ for my $e (@TeXLive::TLConfig::PostMortemRemovals) { ++ unlink $e unless -d $e; ++ } ++ for my $e (@TeXLive::TLConfig::PostMortemRemovals) { ++ rmdir $e if -d $e; ++ } + } + Index: texmf/scripts/texlive/tlmgr.pl =================================================================== ---- texmf/scripts/texlive/tlmgr.pl (revision 11951) +--- texmf/scripts/texlive/tlmgr.pl (revision 11959) +++ texmf/scripts/texlive/tlmgr.pl (working copy) @@ -2431,6 +2431,9 @@ # |