summaryrefslogtreecommitdiff
path: root/Master
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2022-03-05 14:03:21 +0000
committerNorbert Preining <preining@logic.at>2022-03-05 14:03:21 +0000
commit3f56a2387224b352fe370d8ec94ca49aa1d3d937 (patch)
tree4edf802ca70969a3030853e2534c6dd9890e3b03 /Master
parent09a830748cdedad7fc6dbd8d239513e7374c97f4 (diff)
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
Diffstat (limited to 'Master')
-rwxr-xr-xMaster/install-tl38
-rw-r--r--Master/tlpkg/TeXLive/TLUtils.pm51
-rw-r--r--Master/tlpkg/installer/install-menu-text.pl7
3 files changed, 64 insertions, 32 deletions
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<TeXLive::TLUtils> - 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<diskfree($path)>
+
+If a POSIX compliant C<df> 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
<S> set installation scheme: $vars{'selected_scheme'}
<C> 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
}