diff options
Diffstat (limited to 'perl-install/fs/partitioning.pm')
| -rw-r--r-- | perl-install/fs/partitioning.pm | 83 | 
1 files changed, 83 insertions, 0 deletions
| diff --git a/perl-install/fs/partitioning.pm b/perl-install/fs/partitioning.pm new file mode 100644 index 000000000..18fa7e114 --- /dev/null +++ b/perl-install/fs/partitioning.pm @@ -0,0 +1,83 @@ +package fs::partitioning; + +use diagnostics; +use strict; + +use common; +use fs::format; +use fs::get; +use fs::type; + +sub guess_partitions_to_format { +    my ($fstab) = @_; +    my $root_part = fs::get::root($fstab); +    foreach (@$fstab) { +	$_->{mntpoint} = "swap" if isSwap($_) && ($_->{rootDevice} eq $root_part->{rootDevice} || !$_->{is_removable} && !$root_part->{is_removable}); +	$_->{mntpoint} or next; + +	add2hash_($_, { toFormat => $_->{notFormatted} }) if $_->{fs_type}; #- eg: do not set toFormat for isRawRAID (0xfd) +        $_->{toFormatUnsure} ||= member($_->{mntpoint}, '/', '/usr'); + +	if (!$_->{toFormat}) { +	    my $fs_type = fs::type::fs_type_from_magic($_); +	    if (!$fs_type || $fs_type ne $_->{fs_type}) { +		log::l("setting toFormatUnsure for $_->{device} because <$_->{fs_type}> ne <$fs_type>"); +		$_->{toFormatUnsure} = 1; +	    } +	} +    } +} + +sub choose_partitions_to_format { +    my ($in, $fstab) = @_; + +    guess_partitions_to_format($fstab); + +    my @l = grep { !$_->{isMounted} && $_->{mntpoint} && !isSwap($_) && +		   (!isFat_or_NTFS($_) || $_->{notFormatted}) && +		   (!isOtherAvailableFS($_) || $_->{toFormat}); +	       } @$fstab; +    $_->{toFormat} = 1 foreach grep { isSwap($_) } @$fstab; + +    return if @l == 0 || every { $_->{toFormat} } @l; + +    #- keep it temporary until the guy has accepted +    $_->{toFormatTmp} = $_->{toFormat} || $_->{toFormatUnsure} foreach @l; + +    $in->ask_from_( +        { messages => N("Choose the partitions you want to format"), +	  interactive_help_id => 'formatPartitions', +          advanced_messages => N("Check for bad blocks?"), +        }, +        [ map {  +	    my $e = $_; +	    ({ +	      text => partition_table::description($e), type => 'bool', +	      val => \$e->{toFormatTmp} +	     }, if_(!isLoopback($_) && isBlockCheckable($_), { +	      text => partition_table::description($e), type => 'bool', advanced => 1,  +	      disabled => sub { !$e->{toFormatTmp} }, +	      val => \$e->{toFormatCheck} +        })) } @l ] +    ) or die 'already displayed'; +    #- ok now we can really set toFormat +    foreach (@l) { +	$_->{toFormat} = delete $_->{toFormatTmp}; +	set_isFormatted($_, 0); +    } +} + +sub format_mount_partitions { +    my ($in, $all_hds, $fstab) = @_; +    my ($w, $wait_message) = $in->wait_message_with_progress_bar; +    catch_cdie { +        fs::format::formatMount_all($all_hds, $fstab, $wait_message); +    } sub {  +	$@ =~ /fsck failed on (\S+)/ or return; +	$in->ask_yesorno('', N("Failed to check filesystem %s. Do you want to repair the errors? (beware, you can lose data)", $1), 1); +    }; +    undef $w; #- help perl (otherwise wait_message stays forever in curses) +    die N("Not enough swap space to fulfill installation, please add some") if availableMemory() < 40 * 1024; +} + +1; | 
