From 4a477351e0790f18b4099424b45dd79bb1db245e Mon Sep 17 00:00:00 2001 From: codefiles <11915375+codefiles@users.noreply.github.com> Date: Sun, 23 Feb 2025 20:18:14 -0500 Subject: [PATCH] Fix manual partitioning device wipe status (#3198) --- archinstall/lib/disk/partitioning_menu.py | 92 +++++++++++++---------- archinstall/lib/interactions/disk_conf.py | 5 +- 2 files changed, 56 insertions(+), 41 deletions(-) diff --git a/archinstall/lib/disk/partitioning_menu.py b/archinstall/lib/disk/partitioning_menu.py index 59eb4913..98ff8bfd 100644 --- a/archinstall/lib/disk/partitioning_menu.py +++ b/archinstall/lib/disk/partitioning_menu.py @@ -5,12 +5,13 @@ from pathlib import Path from typing import TYPE_CHECKING, override from archinstall.lib.models.device_model import ( - BDevice, BtrfsMountOption, + DeviceModification, FilesystemType, ModificationStatus, PartitionFlag, PartitionModification, + PartitionTable, PartitionType, SectorSize, Size, @@ -18,7 +19,6 @@ from archinstall.lib.models.device_model import ( ) from archinstall.tui import Alignment, EditMenu, FrameProperties, MenuItem, MenuItemGroup, Orientation, ResultType, SelectMenu -from ..hardware import SysInfo from ..menu import ListManager from ..output import FormattedOutput from ..utils.util import prompt_dir @@ -75,10 +75,17 @@ class DiskSegment: class PartitioningList(ListManager): - def __init__(self, prompt: str, device: BDevice, device_partitions: list[PartitionModification]): + def __init__( + self, + device_mod: DeviceModification, + partition_table: PartitionTable + ) -> None: + device = device_mod.device + self._device = device + self._wipe = device_mod.wipe self._buffer = Size(1, Unit.MiB, device.device_info.sector_size) - self._using_gpt = SysInfo.has_uefi() + self._using_gpt = device_mod.using_gpt(partition_table) self._actions = { 'suggest_partition_layout': str(_('Suggest partition layout')), @@ -93,14 +100,32 @@ class PartitioningList(ListManager): 'delete_partition': str(_('Delete partition')) } + device_partitions = [] + + if not device_mod.partitions: + # we'll display the existing partitions of the device + for partition in device.partition_infos: + device_partitions.append( + PartitionModification.from_existing_partition(partition) + ) + else: + device_partitions = device_mod.partitions + + prompt = str(_('Partition management: {}')).format(device.device_info.path) + '\n' + prompt += str(_('Total length: {}')).format(device.device_info.total_size.format_size(Unit.MiB)) + self._info = prompt + '\n' + display_actions = list(self._actions.values()) super().__init__( self.as_segments(device_partitions), display_actions[:1], display_actions[2:], - prompt + self._info + self.wipe_str() ) + def wipe_str(self) -> str: + return '{}: {}'.format(str(_('Wipe')), self._wipe) + def as_segments(self, device_partitions: list[PartitionModification]) -> list[DiskSegment]: end = self._device.device_info.total_size @@ -163,10 +188,10 @@ class PartitioningList(ListManager): if isinstance(s.segment, PartitionModification) ] - @override - def run(self) -> list[PartitionModification]: + def get_device_mod(self) -> DeviceModification: disk_segments = super().run() - return self.get_part_mods(disk_segments) + partitions = self.get_part_mods(disk_segments) + return DeviceModification(self._device, self._wipe, partitions) @override def _run_actions_on_entry(self, entry: DiskSegment) -> None: @@ -241,9 +266,11 @@ class PartitioningList(ListManager): match action_key: case 'suggest_partition_layout': part_mods = self.get_part_mods(data) - new_partitions = self._suggest_partition_layout(part_mods) - if len(new_partitions) > 0: - data = self.as_segments(new_partitions) + device_mod = self._suggest_partition_layout(part_mods) + if device_mod and device_mod.partitions: + data = self.as_segments(device_mod.partitions) + self._wipe = device_mod.wipe + self._prompt = self._info + self.wipe_str() case 'remove_added_partitions': if self._reset_confirmation(): data = [ @@ -506,43 +533,32 @@ class PartitioningList(ListManager): return result.item() == MenuItem.yes() - def _suggest_partition_layout(self, data: list[PartitionModification]) -> list[PartitionModification]: + def _suggest_partition_layout( + self, + data: list[PartitionModification] + ) -> DeviceModification | None: # if modifications have been done already, inform the user # that this operation will erase those modifications if any([not entry.exists() for entry in data]): if not self._reset_confirmation(): - return [] + return None from ..interactions.disk_conf import suggest_single_disk_layout - device_modification = suggest_single_disk_layout(self._device) - return device_modification.partitions + return suggest_single_disk_layout(self._device) def manual_partitioning( - device: BDevice, - prompt: str = '', - preset: list[PartitionModification] = [] -) -> list[PartitionModification]: - if not prompt: - prompt = str(_('Partition management: {}')).format(device.device_info.path) + '\n' - prompt += str(_('Total length: {}')).format(device.device_info.total_size.format_size(Unit.MiB)) - - manual_preset = [] - - if not preset: - # we'll display the existing partitions of the device - for partition in device.partition_infos: - manual_preset.append( - PartitionModification.from_existing_partition(partition) - ) - else: - manual_preset = preset - - menu_list = PartitioningList(prompt, device, manual_preset) - partitions: list[PartitionModification] = menu_list.run() + device_mod: DeviceModification, + partition_table: PartitionTable +) -> DeviceModification | None: + menu_list = PartitioningList(device_mod, partition_table) + mod = menu_list.get_device_mod() if menu_list.is_last_choice_cancel(): - return preset + return device_mod - return partitions + if mod.partitions: + return mod + + return None diff --git a/archinstall/lib/interactions/disk_conf.py b/archinstall/lib/interactions/disk_conf.py index 0cb4c19e..44f85380 100644 --- a/archinstall/lib/interactions/disk_conf.py +++ b/archinstall/lib/interactions/disk_conf.py @@ -116,9 +116,8 @@ def _manual_partitioning( if not mod: mod = DeviceModification(device, wipe=False) - if partitions := manual_partitioning(device, preset=mod.partitions): - mod.partitions = partitions - modifications.append(mod) + if device_mod := manual_partitioning(mod, device_handler.partition_table): + modifications.append(device_mod) return modifications