From c38ee3cb11234c50add0edf70043e87955854eed Mon Sep 17 00:00:00 2001 From: Softer Date: Sat, 11 Apr 2026 01:56:51 +0300 Subject: [PATCH 1/4] Add Pacman settings submenu with Color and ParallelDownloads Replace the standalone Parallel Downloads menu item with a Pacman submenu containing ParallelDownloads (default 5) and Color (default on). Settings are applied to both live and target system pacman.conf. Hidden behind --advanced flag. Backward compatible with old configs using "parallel_downloads" key. --- archinstall/lib/args.py | 11 +- archinstall/lib/general/__init__.py | 2 - archinstall/lib/general/general_menu.py | 50 --------- archinstall/lib/global_menu.py | 26 +++-- archinstall/lib/installer.py | 5 + archinstall/lib/models/pacman.py | 37 +++++++ archinstall/lib/pacman/config.py | 21 +++- archinstall/lib/pacman/pacman_menu.py | 114 +++++++++++++++++++++ archinstall/locales/base.pot | 46 +++++++++ archinstall/locales/uk/LC_MESSAGES/base.mo | Bin 81144 -> 81459 bytes archinstall/locales/uk/LC_MESSAGES/base.po | 56 ++++++++++ archinstall/scripts/guided.py | 3 +- tests/test_args.py | 3 +- 13 files changed, 305 insertions(+), 69 deletions(-) create mode 100644 archinstall/lib/models/pacman.py create mode 100644 archinstall/lib/pacman/pacman_menu.py diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py index c61bc5a15f..20ff37cfda 100644 --- a/archinstall/lib/args.py +++ b/archinstall/lib/args.py @@ -22,6 +22,7 @@ from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import NetworkConfiguration from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.models.users import Password, User, UserSerialization from archinstall.lib.output import debug, error, logger, warn @@ -73,7 +74,7 @@ class ArchConfig: kernels: list[str] = field(default_factory=lambda: ['linux']) ntp: bool = True packages: list[str] = field(default_factory=list) - parallel_downloads: int = 0 + pacman_config: PacmanConfiguration = field(default_factory=PacmanConfiguration.default) timezone: str = 'UTC' services: list[str] = field(default_factory=list) custom_commands: list[str] = field(default_factory=list) @@ -104,7 +105,7 @@ def safe_config(self) -> dict[str, Any]: 'kernels': self.kernels, 'ntp': self.ntp, 'packages': self.packages, - 'parallel_downloads': self.parallel_downloads, + 'pacman_config': self.pacman_config.json(), 'swap': self.swap, 'timezone': self.timezone, 'services': self.services, @@ -209,8 +210,10 @@ def from_config(cls, args_config: dict[str, Any], args: Arguments) -> Self: if packages := args_config.get('packages', []): arch_config.packages = packages - if parallel_downloads := args_config.get('parallel_downloads', 0): - arch_config.parallel_downloads = parallel_downloads + if pacman_config := args_config.get('pacman_config', None): + arch_config.pacman_config = PacmanConfiguration.parse_arg(pacman_config) + elif parallel_downloads := args_config.get('parallel_downloads', 0): + arch_config.pacman_config = PacmanConfiguration(parallel_downloads=int(parallel_downloads)) swap_arg = args_config.get('swap') if swap_arg is not None: diff --git a/archinstall/lib/general/__init__.py b/archinstall/lib/general/__init__.py index 21add83479..7c082d849f 100644 --- a/archinstall/lib/general/__init__.py +++ b/archinstall/lib/general/__init__.py @@ -1,5 +1,4 @@ from archinstall.lib.general.general_menu import ( - add_number_of_parallel_downloads, select_archinstall_language, select_hostname, select_ntp, @@ -8,7 +7,6 @@ from archinstall.lib.general.system_menu import select_driver, select_kernel, select_swap __all__ = [ - 'add_number_of_parallel_downloads', 'select_archinstall_language', 'select_driver', 'select_hostname', diff --git a/archinstall/lib/general/general_menu.py b/archinstall/lib/general/general_menu.py index b6cf9a75ee..ad85c14b60 100644 --- a/archinstall/lib/general/general_menu.py +++ b/archinstall/lib/general/general_menu.py @@ -3,7 +3,6 @@ from archinstall.lib.locale.utils import list_timezones from archinstall.lib.menu.helpers import Confirmation, Input, Selection from archinstall.lib.output import warn -from archinstall.lib.pathnames import PACMAN_CONF from archinstall.lib.translationhandler import Language, tr from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup from archinstall.tui.ui.result import ResultType @@ -126,55 +125,6 @@ async def select_archinstall_language(languages: list[Language], preset: Languag raise ValueError('Language selection not handled') -async def add_number_of_parallel_downloads(preset: int = 1) -> int | None: - max_recommended = 5 - - header = tr('This option enables the number of parallel downloads that can occur during package downloads') + '\n' - header += tr(' - Maximum recommended value : {} ( Allows {} parallel downloads at a time )').format(max_recommended, max_recommended) + '\n\n' - header += tr('Enter the number of parallel downloads to be enabled') - - def validator(s: str) -> str | None: - try: - value = int(s) - - if 1 <= value <= max_recommended: - return None - - return tr('Value must be between 1 and {}').format(max_recommended) - except Exception: - return tr('Please enter a valid number') - - result = await Input( - header=header, - allow_skip=True, - allow_reset=True, - validator_callback=validator, - default_value=str(preset), - ).show() - - downloads = 1 - - match result.type_: - case ResultType.Skip: - return preset - case ResultType.Reset: - return downloads - case ResultType.Selection: - downloads = int(result.get_value()) - - with PACMAN_CONF.open() as f: - pacman_conf = f.read().split('\n') - - with PACMAN_CONF.open('w') as fwrite: - for line in pacman_conf: - if 'ParallelDownloads' in line: - fwrite.write(f'ParallelDownloads = {downloads}\n') - else: - fwrite.write(f'{line}\n') - - return downloads - - async def select_post_installation(elapsed_time: float | None = None) -> PostInstallationAction: header = 'Installation completed' if elapsed_time is not None: diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index cae51df2c2..745b317f54 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -7,7 +7,7 @@ from archinstall.lib.bootloader.bootloader_menu import BootloaderMenu from archinstall.lib.configuration import save_config from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu -from archinstall.lib.general.general_menu import add_number_of_parallel_downloads, select_hostname, select_ntp, select_timezone +from archinstall.lib.general.general_menu import select_hostname, select_ntp, select_timezone from archinstall.lib.general.system_menu import select_kernel, select_swap from archinstall.lib.hardware import SysInfo from archinstall.lib.locale.locale_menu import LocaleMenu @@ -22,11 +22,13 @@ from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import NetworkConfiguration, NicType from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.network.network_menu import select_network from archinstall.lib.output import FormattedOutput from archinstall.lib.packages.packages import list_available_packages, select_additional_packages from archinstall.lib.pacman.config import PacmanConfig +from archinstall.lib.pacman.pacman_menu import PacmanMenu from archinstall.lib.translationhandler import Language, tr, translation_handler from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup @@ -137,11 +139,11 @@ def _get_menu_options(self) -> list[MenuItem]: key='network_config', ), MenuItem( - text=tr('Parallel Downloads'), - action=add_number_of_parallel_downloads, - value=1, - preview_action=self._prev_parallel_dw, - key='parallel_downloads', + text=tr('Pacman'), + action=self._pacman_configuration, + value=PacmanConfiguration.default(), + preview_action=self._prev_pacman_config, + key='pacman_config', ), MenuItem( text=tr('Additional packages'), @@ -410,10 +412,14 @@ def _prev_hostname(self, item: MenuItem) -> str | None: return f'{tr("Hostname")}: {item.value}' return None - def _prev_parallel_dw(self, item: MenuItem) -> str | None: - if item.value is not None: - return f'{tr("Parallel Downloads")}: {item.value}' - return None + async def _pacman_configuration(self, preset: PacmanConfiguration) -> PacmanConfiguration | None: + return await PacmanMenu(preset).show() + + def _prev_pacman_config(self, item: MenuItem) -> str | None: + if not item.value: + return None + config: PacmanConfiguration = item.value + return config.preview() def _prev_kernel(self, item: MenuItem) -> str | None: if item.value: diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 463901fea6..05b4e2b9f6 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -48,6 +48,7 @@ from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network import Nic from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.users import User from archinstall.lib.output import debug, error, info, log, logger, warn from archinstall.lib.packages.packages import installed_package @@ -883,6 +884,7 @@ def minimal_installation( mkinitcpio: bool = True, hostname: str | None = None, locale_config: LocaleConfiguration | None = LocaleConfiguration.default(), + pacman_config: PacmanConfiguration | None = None, ) -> None: if self._disk_config.lvm_config: lvm = 'lvm2' @@ -929,6 +931,9 @@ def minimal_installation( pacman_conf.persist() + if pacman_config: + pacman_conf.configure(pacman_config) + # Periodic TRIM may improve the performance and longevity of SSDs whilst # having no adverse effect on other devices. Most distributions enable # periodic TRIM by default. diff --git a/archinstall/lib/models/pacman.py b/archinstall/lib/models/pacman.py new file mode 100644 index 0000000000..81ca97541f --- /dev/null +++ b/archinstall/lib/models/pacman.py @@ -0,0 +1,37 @@ +from dataclasses import dataclass +from typing import Any, Self + +from archinstall.lib.translationhandler import tr + + +@dataclass +class PacmanConfiguration: + parallel_downloads: int = 5 + color: bool = True + + @classmethod + def default(cls) -> Self: + return cls() + + def json(self) -> dict[str, Any]: + return { + 'parallel_downloads': self.parallel_downloads, + 'color': self.color, + } + + def preview(self) -> str: + color_str = str(self.color) + output = '{}: {}\n'.format(tr('Parallel Downloads'), self.parallel_downloads) + output += '{}: {}'.format(tr('Color'), color_str) + return output + + @classmethod + def parse_arg(cls, args: dict[str, Any]) -> Self: + config = cls.default() + + if 'parallel_downloads' in args: + config.parallel_downloads = int(args['parallel_downloads']) + if 'color' in args: + config.color = bool(args['color']) + + return config diff --git a/archinstall/lib/pacman/config.py b/archinstall/lib/pacman/config.py index 1d36154230..5785b31994 100644 --- a/archinstall/lib/pacman/config.py +++ b/archinstall/lib/pacman/config.py @@ -2,6 +2,7 @@ from pathlib import Path from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.pathnames import PACMAN_CONF @@ -50,5 +51,23 @@ def apply(self) -> None: f.writelines(content) def persist(self) -> None: - if self._repositories and self._config_remote_path: + if self._config_remote_path: PACMAN_CONF.copy(self._config_remote_path, preserve_metadata=True) + + def configure(self, pacman_config: PacmanConfiguration) -> None: + """Apply PacmanConfiguration (Color, ParallelDownloads) to the target system's pacman.conf.""" + if not self._config_remote_path or not self._config_remote_path.exists(): + return + + content = self._config_remote_path.read_text().splitlines() + result = [] + + for line in content: + if re.match(r'^#?\s*ParallelDownloads', line): + result.append(f'ParallelDownloads = {pacman_config.parallel_downloads}') + elif re.match(r'^#?\s*Color\s*$', line): + result.append('Color' if pacman_config.color else '#Color') + else: + result.append(line) + + self._config_remote_path.write_text('\n'.join(result) + '\n') diff --git a/archinstall/lib/pacman/pacman_menu.py b/archinstall/lib/pacman/pacman_menu.py new file mode 100644 index 0000000000..5104ee2fc9 --- /dev/null +++ b/archinstall/lib/pacman/pacman_menu.py @@ -0,0 +1,114 @@ +from typing import override + +from archinstall.lib.menu.abstract_menu import AbstractSubMenu +from archinstall.lib.menu.helpers import Confirmation, Input +from archinstall.lib.models.pacman import PacmanConfiguration +from archinstall.lib.pathnames import PACMAN_CONF +from archinstall.lib.translationhandler import tr +from archinstall.tui.ui.menu_item import MenuItem, MenuItemGroup +from archinstall.tui.ui.result import ResultType + + +class PacmanMenu(AbstractSubMenu[PacmanConfiguration]): + def __init__( + self, + pacman_conf: PacmanConfiguration, + ): + self._pacman_conf = pacman_conf + menu_options = self._define_menu_options() + + self._item_group = MenuItemGroup(menu_options, sort_items=False, checkmarks=True) + super().__init__( + self._item_group, + config=self._pacman_conf, + allow_reset=True, + ) + + def _define_menu_options(self) -> list[MenuItem]: + return [ + MenuItem( + text=tr('Parallel Downloads'), + action=select_parallel_downloads, + value=self._pacman_conf.parallel_downloads, + preview_action=lambda item: str(item.get_value()), + key='parallel_downloads', + ), + MenuItem( + text=tr('Color'), + action=select_color, + value=self._pacman_conf.color, + preview_action=lambda item: str(item.get_value()), + key='color', + ), + ] + + @override + async def show(self) -> PacmanConfiguration | None: + config = await super().show() + + if config is None: + config = PacmanConfiguration.default() + + _apply_to_live(config.parallel_downloads) + + return config + + +def _apply_to_live(parallel_downloads: int) -> None: + """Apply ParallelDownloads to live system pacman.conf for faster installation.""" + with PACMAN_CONF.open() as f: + pacman_conf = f.read().split('\n') + + with PACMAN_CONF.open('w') as fwrite: + for line in pacman_conf: + if 'ParallelDownloads' in line: + fwrite.write(f'ParallelDownloads = {parallel_downloads}\n') + else: + fwrite.write(f'{line}\n') + + +async def select_parallel_downloads(preset: int = 5) -> int | None: + max_recommended = 10 + + header = tr('Enter the number of parallel downloads (1-{})').format(max_recommended) + + def validator(s: str) -> str | None: + try: + value = int(s) + if 1 <= value <= max_recommended: + return None + return tr('Value must be between 1 and {}').format(max_recommended) + except Exception: + return tr('Please enter a valid number') + + result = await Input( + header=header, + allow_skip=True, + allow_reset=True, + validator_callback=validator, + default_value=str(preset), + ).show() + + match result.type_: + case ResultType.Skip: + return preset + case ResultType.Reset: + return 5 + case ResultType.Selection: + return int(result.get_value()) + + +async def select_color(preset: bool = True) -> bool | None: + result = await Confirmation( + header=tr('Enable colored output for pacman'), + preset=preset, + allow_skip=True, + ).show() + + match result.type_: + case ResultType.Skip: + return preset + case ResultType.Reset: + return True + case ResultType.Selection: + return result.get_value() diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index df0915c769..695762681c 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -830,6 +830,19 @@ msgstr "" msgid "Parallel Downloads" msgstr "" +msgid "Pacman" +msgstr "" + +msgid "Color" +msgstr "" + +#, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "" + +msgid "Enable colored output for pacman" +msgstr "" + msgid "ESC to skip" msgstr "" @@ -2067,3 +2080,36 @@ msgstr "" #, python-brace-format msgid "Environment type: {} {}" msgstr "" + +msgid "Input cannot be empty" +msgstr "" + +msgid "Recommended" +msgstr "" + +msgid "Package" +msgstr "" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +msgid "Package group" +msgstr "" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +msgid "Packages in group" +msgstr "" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +msgid "Description" +msgstr "" + +msgid "Select a flavor of KDE Plasma to install" +msgstr "" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.mo b/archinstall/locales/uk/LC_MESSAGES/base.mo index 6d6f7558c3ab8f462977b451520a1f1dd39445a3..923d4bf68c0a52993070df4dc6d0f674593fb36f 100644 GIT binary patch delta 13746 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 delta 13484 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 y-c8%**&DOh=Sv@c-!;QNvR_;C}!WCxUeV diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index b88fd2901e..10e1a90a5f 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -823,6 +823,19 @@ msgstr "Некоректне введення! Повторіть спробу msgid "Parallel Downloads" msgstr "Паралельні Завантаження" +msgid "Pacman" +msgstr "Pacman" + +msgid "Color" +msgstr "Колір" + +#, python-brace-format +msgid "Enter the number of parallel downloads (1-{})" +msgstr "Введіть кількість паралельних завантажень (1-{})" + +msgid "Enable colored output for pacman" +msgstr "Увімкнути кольоровий вивід для pacman" + msgid "ESC to skip" msgstr "ESC, щоб пропустити" @@ -2002,3 +2015,46 @@ msgstr "Надійність пароля: Сильна" msgid "The selected desktop profile requires a regular user to log in via the greeter" msgstr "Обраний профіль робочого столу вимагає входу звичайного користувача через менеджер входу" + +#, fuzzy, python-brace-format +msgid "Environment type: {} {}" +msgstr "Тип середовища: {}" + +#, fuzzy +msgid "Input cannot be empty" +msgstr "Значення не може бути пустим" + +msgid "Recommended" +msgstr "" + +#, fuzzy +msgid "Package" +msgstr "Група пакетів:" + +msgid "Curated selection of KDE Plasma packages" +msgstr "" + +msgid "Dependencies" +msgstr "" + +#, fuzzy +msgid "Package group" +msgstr "Група пакетів:" + +msgid "Extensive KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Packages in group" +msgstr "Група пакетів:" + +msgid "Minimal KDE Plasma installation" +msgstr "" + +#, fuzzy +msgid "Description" +msgstr "Шифрування диска" + +#, fuzzy +msgid "Select a flavor of KDE Plasma to install" +msgstr "Оберіть завантажувач для встановлення" diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 5683ab9ec0..afee61773e 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -43,7 +43,7 @@ def show_menu( ) if not arch_config_handler.args.advanced: - global_menu.set_enabled('parallel_downloads', False) + global_menu.set_enabled('pacman_config', False) result: ArchConfig | None = tui.run(global_menu) if result is None: @@ -106,6 +106,7 @@ def perform_installation( mkinitcpio=run_mkinitcpio, hostname=arch_config_handler.config.hostname, locale_config=locale_config, + pacman_config=config.pacman_config, ) if mirror_config := config.mirror_config: diff --git a/tests/test_args.py b/tests/test_args.py index 1b052ec0a1..4cbad41bae 100644 --- a/tests/test_args.py +++ b/tests/test_args.py @@ -22,6 +22,7 @@ from archinstall.lib.models.mirrors import CustomRepository, CustomServer, MirrorConfiguration, MirrorRegion, SignCheck, SignOption from archinstall.lib.models.network import NetworkConfiguration, Nic, NicType from archinstall.lib.models.packages import Repository +from archinstall.lib.models.pacman import PacmanConfiguration from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.models.users import Password, User from archinstall.lib.profile.profiles_handler import profile_handler @@ -234,7 +235,7 @@ def test_config_file_parsing( kernels=['linux-zen'], ntp=True, packages=['firefox'], - parallel_downloads=66, + pacman_config=PacmanConfiguration(parallel_downloads=66), swap=ZramConfiguration(enabled=False), timezone='UTC', services=['service_1', 'service_2'], From 310118ba156bd575e8412789ae7b9defd9968685 Mon Sep 17 00:00:00 2001 From: Softer Date: Sat, 11 Apr 2026 02:13:50 +0300 Subject: [PATCH 2/4] Skip _apply_to_live when user exits Pacman menu without changes --- archinstall/lib/pacman/pacman_menu.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archinstall/lib/pacman/pacman_menu.py b/archinstall/lib/pacman/pacman_menu.py index 5104ee2fc9..c844c76b7d 100644 --- a/archinstall/lib/pacman/pacman_menu.py +++ b/archinstall/lib/pacman/pacman_menu.py @@ -47,7 +47,7 @@ async def show(self) -> PacmanConfiguration | None: config = await super().show() if config is None: - config = PacmanConfiguration.default() + return PacmanConfiguration.default() _apply_to_live(config.parallel_downloads) From 97af5d1179dea68d2acb0e8d4fba60a4c24ae5c6 Mon Sep 17 00:00:00 2001 From: Softer Date: Sun, 12 Apr 2026 07:27:22 +0300 Subject: [PATCH 3/4] Use TypedDict for PacmanConfiguration serialization --- archinstall/lib/models/pacman.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/archinstall/lib/models/pacman.py b/archinstall/lib/models/pacman.py index 81ca97541f..5d271ea98c 100644 --- a/archinstall/lib/models/pacman.py +++ b/archinstall/lib/models/pacman.py @@ -1,9 +1,14 @@ from dataclasses import dataclass -from typing import Any, Self +from typing import Self, TypedDict from archinstall.lib.translationhandler import tr +class PacmanConfigSerialization(TypedDict): + parallel_downloads: int + color: bool + + @dataclass class PacmanConfiguration: parallel_downloads: int = 5 @@ -13,7 +18,7 @@ class PacmanConfiguration: def default(cls) -> Self: return cls() - def json(self) -> dict[str, Any]: + def json(self) -> PacmanConfigSerialization: return { 'parallel_downloads': self.parallel_downloads, 'color': self.color, @@ -26,7 +31,7 @@ def preview(self) -> str: return output @classmethod - def parse_arg(cls, args: dict[str, Any]) -> Self: + def parse_arg(cls, args: PacmanConfigSerialization) -> Self: config = cls.default() if 'parallel_downloads' in args: From 739b5eb122ddabd1959592205bab3fb013c27ad0 Mon Sep 17 00:00:00 2001 From: Softer Date: Sun, 12 Apr 2026 08:08:11 +0300 Subject: [PATCH 4/4] Show Pacman menu by default, keep ParallelDownloads behind --advanced --- archinstall/lib/global_menu.py | 10 ++++++++-- archinstall/lib/pacman/pacman_menu.py | 3 +++ archinstall/scripts/guided.py | 4 +--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index d1c02948b5..6e4b6720c8 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -40,11 +40,13 @@ def __init__( arch_config: ArchConfig, mirror_list_handler: MirrorListHandler | None = None, skip_boot: bool = False, + advanced: bool = False, title: str | None = None, ) -> None: self._arch_config = arch_config self._mirror_list_handler = mirror_list_handler self._skip_boot = skip_boot + self._advanced = advanced self._uefi = SysInfo.has_uefi() menu_options = self._get_menu_options() @@ -416,13 +418,17 @@ def _prev_hostname(self, item: MenuItem) -> str | None: return None async def _pacman_configuration(self, preset: PacmanConfiguration) -> PacmanConfiguration | None: - return await PacmanMenu(preset).show() + return await PacmanMenu(preset, advanced=self._advanced).show() def _prev_pacman_config(self, item: MenuItem) -> str | None: if not item.value: return None config: PacmanConfiguration = item.value - return config.preview() + output = '' + if self._advanced: + output += '{}: {}\n'.format(tr('Parallel Downloads'), config.parallel_downloads) + output += '{}: {}'.format(tr('Color'), config.color) + return output def _prev_kernel(self, item: MenuItem) -> str | None: if item.value: diff --git a/archinstall/lib/pacman/pacman_menu.py b/archinstall/lib/pacman/pacman_menu.py index c844c76b7d..010c3f6d27 100644 --- a/archinstall/lib/pacman/pacman_menu.py +++ b/archinstall/lib/pacman/pacman_menu.py @@ -13,8 +13,10 @@ class PacmanMenu(AbstractSubMenu[PacmanConfiguration]): def __init__( self, pacman_conf: PacmanConfiguration, + advanced: bool = False, ): self._pacman_conf = pacman_conf + self._advanced = advanced menu_options = self._define_menu_options() self._item_group = MenuItemGroup(menu_options, sort_items=False, checkmarks=True) @@ -32,6 +34,7 @@ def _define_menu_options(self) -> list[MenuItem]: value=self._pacman_conf.parallel_downloads, preview_action=lambda item: str(item.get_value()), key='parallel_downloads', + enabled=self._advanced, ), MenuItem( text=tr('Color'), diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index afee61773e..601ca7bc6e 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -39,12 +39,10 @@ def show_menu( arch_config_handler.config, mirror_list_handler, arch_config_handler.args.skip_boot, + advanced=arch_config_handler.args.advanced, title=title_text, ) - if not arch_config_handler.args.advanced: - global_menu.set_enabled('pacman_config', False) - result: ArchConfig | None = tui.run(global_menu) if result is None: sys.exit(0)