From 3f56a2387224b352fe370d8ec94ca49aa1d3d937 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Sat, 5 Mar 2022 14:03:21 +0000 Subject: installer and free disk space improvements - factor free disk space computation into a new TLUtils function - save (and update) the free disk space for the current TEXDIR in %vars - display the free disk space (if it is available) in the text menu git-svn-id: svn://tug.org/texlive/trunk@62431 c570f23f-e606-0410-a88d-b1316a301751 --- Master/install-tl | 38 +++++---------------- Master/tlpkg/TeXLive/TLUtils.pm | 51 +++++++++++++++++++++++++++-- Master/tlpkg/installer/install-menu-text.pl | 7 +++- 3 files changed, 64 insertions(+), 32 deletions(-) (limited to 'Master') diff --git a/Master/install-tl b/Master/install-tl index 73c1a525d98..5f1cf6896e3 100755 --- a/Master/install-tl +++ b/Master/install-tl @@ -907,6 +907,8 @@ sub final_remote_init { set_texlive_default_dirs(); set_install_platform(); initialize_collections(); + # size information + $vars{'free_size'} = TeXLive::TLUtils::diskfree($vars{'TEXDIR'}); # initialize the scheme from the command line value, if given. if ($opt_scheme) { @@ -943,35 +945,13 @@ sub do_installation { if (win32()) { TeXLive::TLWinGoo::maybe_make_ro ($vars{'TEXDIR'}); } - # If df is available, check for free disk space - if ($::progs{"df"}) { - # To ensure that GNU coreutil df returns POSIX style 512-blocks, - # it is necessary to set POSIXLY_CORRECT=1 - # (GNU df defaults to 1024-block) - # https://en.wikipedia.org/wiki/POSIX#512-_vs_1024-byte_blocks - my $td = $vars{'TEXDIR'}; - $td .= "/" if ($td !~ m!/$!); - debug("Checking for free diskspace in $td\n"); - my ($output, $retval) = - TeXLive::TLUtils::run_cmd("df -P \"$vars{'TEXDIR'}\"", - POSIXLY_CORRECT => 1); - if ($retval == 0) { - # Output format should be this: - # Filesystem 512-blocks Used Available Capacity Mounted on - # /dev/sdb3 6099908248 3590818104 2406881416 60% /home - my ($h,$l) = split(/\n/, $output); - my ($fs, $nrb, $used, $avail, @rest) = split(' ', $l); - debug("disk space: used=$used (512-block), avail=$avail (512-block),", - " required=$vars{'total_size'} (Mb)\n"); - # $vars{'total_size'} is number required in Mb (1024**2) - # $vars{'total_size'} = - # sprintf "%d", ($size * $TeXLive::TLConfig::BlockSize)/1024**2; - # $avail is in 512 blocks, so we need to device by 2 * 1024 to obtain Mb - # require that at least 100M remain free - my $reserve = 100; - if ( $avail / 2024 + $reserve < $vars{'total_size'}) { - die("DISK SPACE INSUFFICIENT!"); - } + # check for free disk space + my $diskfree = TeXLive::TLUtils::diskfree($vars{'TEXDIR'}); + # -1 is returned if df not available or some other error + if ($diskfree != -1) { + my $reserve = 100; + if ( $diskfree + $reserve < $vars{'total_size'}) { + die("DISK SPACE INSUFFICIENT!"); } } # now remove final slash from TEXDIR even if it is the root of a drive diff --git a/Master/tlpkg/TeXLive/TLUtils.pm b/Master/tlpkg/TeXLive/TLUtils.pm index f8a39394f25..da35ab1352d 100644 --- a/Master/tlpkg/TeXLive/TLUtils.pm +++ b/Master/tlpkg/TeXLive/TLUtils.pm @@ -42,6 +42,7 @@ C - TeX Live infrastructure miscellany TeXLive::TLUtils::xsystem(@args); TeXLive::TLUtils::run_cmd($cmd [, @envvars ]); TeXLive::TLUtils::system_pipe($prog, $infile, $outfile, $removeIn, @args); + TeXLive::TLUtils::diskfree($path); =head2 File utilities @@ -232,6 +233,7 @@ BEGIN { &xsystem &run_cmd &system_pipe + &diskfree &announce_execute_actions &add_symlinks &remove_symlinks @@ -258,7 +260,7 @@ BEGIN { @EXPORT = qw(setup_programs download_file process_logging_options tldie tlwarn info log debug ddebug dddebug debug debug_hash_str debug_hash - win32 xchdir xsystem run_cmd system_pipe sort_archs); + win32 xchdir xsystem run_cmd system_pipe diskfree sort_archs); } use Cwd; @@ -801,6 +803,51 @@ sub system_pipe { } } +=item C + +If a POSIX compliant C program is found, returns the number of +Mb free at C<$path>, otherwise C<-1>. If C<$path> is not existent, go +back up to two levels and check if any of the parents exists, and use +the existing one for computing the disk space. + +=cut + +sub diskfree { + my $td = shift; + return (-1) if (! $::progs{"df"}); + # drop final / + $td =~ s!/$!!; + if (! -e $td) { + my $ptd = dirname($td); + if (-e $ptd) { + $td = $ptd; + } else { + my $pptd = dirname($ptd); + if (-e $pptd) { + $td = $pptd; + } + } + } + $td .= "/" if ($td !~ m!/$!); + return (-1) if (! -e $td); + debug("Checking for free diskspace in $td\n"); + my ($output, $retval) = run_cmd("df -P \"$td\"", POSIXLY_CORRECT => 1); + if ($retval == 0) { + # Output format should be this: + # Filesystem 512-blocks Used Available Capacity Mounted on + # /dev/sdb3 6099908248 3590818104 2406881416 60% /home + my ($h,$l) = split(/\n/, $output); + my ($fs, $nrb, $used, $avail, @rest) = split(' ', $l); + debug("disk space: used=$used (512-block), avail=$avail (512-block)\n"); + # $avail is in 512 blocks, so we need to device by 2 * 1024 to obtain Mb + # require that at least 100M remain free + return (int($avail / 2024)); + } else { + # error in running df -P out of whatever reason + return (-1); + } +} + =back =head2 File utilities @@ -2635,7 +2682,7 @@ sub setup_programs { # tar needs to be provided by the system, we not even check! $::progs{'tar'} = "tar"; - setup_one("unix", "df", undef, "-P", 0); + setup_one("unix", "df", undef, "-P .", 0); if (!defined($platform) || ($platform eq "")) { # we assume that we run from uncompressed media, so we can call diff --git a/Master/tlpkg/installer/install-menu-text.pl b/Master/tlpkg/installer/install-menu-text.pl index 9cc79fe8ebb..9f20c7ec7a4 100644 --- a/Master/tlpkg/installer/install-menu-text.pl +++ b/Master/tlpkg/installer/install-menu-text.pl @@ -545,6 +545,10 @@ EOF if ("\u$answer" eq '1' and !$opt_in_place) { print "New value for TEXDIR [$vars{'TEXDIR'}]: "; $answer = &input_dirname (); + # update free space information + if ($answer ne $vars{'TEXDIR'}) { + $vars{'free_size'} = TeXLive::TLUtils::diskfree($answer); + } $vars{'TEXDIR'} = $answer if $answer ne ""; my $texdirnoslash; if ($vars{'TEXDIR'}=~/^(.*)\/$texlive_release$/) { @@ -1035,6 +1039,7 @@ sub main_menu { } clear_screen; + my $freestring = ($vars{'free_size'} >= 0 ? " (free: $vars{'free_size'} MB)" : ""); print <<"EOF"; ======================> TeX Live installation procedure <===================== @@ -1053,7 +1058,7 @@ EOF set installation scheme: $vars{'selected_scheme'} set installation collections: - $vars{'n_collections_selected'} collections out of $vars{'n_collections_available'}, disk space required: $vars{'total_size'} MB + $vars{'n_collections_selected'} collections out of $vars{'n_collections_available'}, disk space required: $vars{'total_size'} MB$freestring EOF } -- cgit v1.2.3