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 11959) +++ tlpkg/TeXLive/TLUtils.pm (working copy) @@ -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 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(); } - $::progs{'wget'} = "$bindir/wget/wget.$platform" - if -x "$bindir/wget/wget.$platform"; - $::progs{'lzmadec'} = "$bindir/lzma/lzmadec.$platform" - if -x "$bindir/lzma/lzmadec.$platform"; - $::progs{'lzma'} = "$bindir/lzma/lzma.$platform" - if -x "$bindir/lzma/lzma.$platform"; + our $tmp; + 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 - # platform is supported. But if it's not there, the test below for a - # working lzmadec could still succeed if the binary is found in $PATH. - # - # Because conv_to_w32_path possibly added quotes, strip them away for - # the file test. Since all other uses of conv_to_w32_path use the - # result in shell commands, this is the most expedient thing to do. - # - (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. - 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; +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 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 11959) +++ texmf/scripts/texlive/tlmgr.pl (working copy) @@ -2431,6 +2431,9 @@ # # set global $location variable. # if we cannot read tlpdb, die if arg SHOULD_I_DIE is true. +# +# if an argument is given and is true init_local_db will die if +# setting up of programs failed. # sub init_local_db { my ($should_i_die) = @_; @@ -2438,17 +2441,8 @@ die("cannot find tlpdb in $Master") unless (defined($localtlpdb)); # setup the programs, for w32 we need the shipped wget/lzma etc, so we # pass the location of these files to setup_programs. - my $ret = setup_programs("$Master/tlpkg/installer", - $localtlpdb->option_platform); - if ($ret == -1) { - tlwarn("no binary of lzmadec for $::_platform_ detected.\n"); - if (defined($should_i_die) && $should_i_die) { - exit 1; - } else { - tlwarn("Continuing anyway ...\n"); - } - } - if (!$ret) { + if (!setup_programs("$Master/tlpkg/installer", + $localtlpdb->option_platform)) { tlwarn("Couldn't set up the necessary programs.\nInstallation of packages is not supported.\nPlease report to texlive\@tug.org.\n"); if (defined($should_i_die) && $should_i_die) { finish(1);