Add new version indicator in the title of the main menu (#3587)
* Add new version indicator in the title of the main menu * Update
This commit is contained in:
parent
7b3b7c9ebf
commit
063b9643b4
|
|
@ -8,6 +8,7 @@ import traceback
|
||||||
|
|
||||||
from archinstall.lib.args import arch_config_handler
|
from archinstall.lib.args import arch_config_handler
|
||||||
from archinstall.lib.disk.utils import disk_layouts
|
from archinstall.lib.disk.utils import disk_layouts
|
||||||
|
from archinstall.lib.packages.packages import check_package_upgrade
|
||||||
|
|
||||||
from .lib.hardware import SysInfo
|
from .lib.hardware import SysInfo
|
||||||
from .lib.output import FormattedOutput, debug, error, info, log, warn
|
from .lib.output import FormattedOutput, debug, error, info, log, warn
|
||||||
|
|
@ -53,15 +54,15 @@ def _check_new_version() -> None:
|
||||||
info('Checking version...')
|
info('Checking version...')
|
||||||
upgrade = None
|
upgrade = None
|
||||||
|
|
||||||
try:
|
upgrade = check_package_upgrade('archinstall')
|
||||||
upgrade = Pacman.run('-Qu archinstall').decode()
|
|
||||||
except Exception as e:
|
|
||||||
debug(f'Failed determine pacman version: {e}')
|
|
||||||
|
|
||||||
if upgrade:
|
if upgrade is None:
|
||||||
text = f'New version available: {upgrade}'
|
debug('No archinstall upgrades found')
|
||||||
info(text)
|
return None
|
||||||
time.sleep(3)
|
|
||||||
|
text = tr('New version available') + f': {upgrade}'
|
||||||
|
info(text)
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
def main() -> int:
|
||||||
|
|
|
||||||
|
|
@ -94,8 +94,8 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskLayoutConfiguration]):
|
||||||
]
|
]
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def run(self) -> DiskLayoutConfiguration | None:
|
def run(self, additional_title: str | None = None) -> DiskLayoutConfiguration | None:
|
||||||
super().run()
|
super().run(additional_title=additional_title)
|
||||||
|
|
||||||
if self._disk_menu_config.disk_config:
|
if self._disk_menu_config.disk_config:
|
||||||
self._disk_menu_config.disk_config.lvm_config = self._disk_menu_config.lvm_config
|
self._disk_menu_config.disk_config.lvm_config = self._disk_menu_config.lvm_config
|
||||||
|
|
|
||||||
|
|
@ -115,8 +115,8 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def run(self) -> DiskEncryption | None:
|
def run(self, additional_title: str | None = None) -> DiskEncryption | None:
|
||||||
super().run()
|
super().run(additional_title=additional_title)
|
||||||
|
|
||||||
enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value
|
enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value
|
||||||
enc_password: Password | None = self._item_group.find_by_key('encryption_password').value
|
enc_password: Password | None = self._item_group.find_by_key('encryption_password').value
|
||||||
|
|
|
||||||
|
|
@ -60,8 +60,11 @@ class LocaleMenu(AbstractSubMenu[LocaleConfiguration]):
|
||||||
return temp_locale.preview()
|
return temp_locale.preview()
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def run(self) -> LocaleConfiguration:
|
def run(
|
||||||
super().run()
|
self,
|
||||||
|
additional_title: str | None = None,
|
||||||
|
) -> LocaleConfiguration:
|
||||||
|
super().run(additional_title=additional_title)
|
||||||
return self._locale_conf
|
return self._locale_conf
|
||||||
|
|
||||||
def _select_kb_layout(self, preset: str | None) -> str | None:
|
def _select_kb_layout(self, preset: str | None) -> str | None:
|
||||||
|
|
|
||||||
|
|
@ -94,7 +94,10 @@ class AbstractMenu[ValueT]:
|
||||||
def _is_config_valid(self) -> bool:
|
def _is_config_valid(self) -> bool:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def run(self) -> ValueT | None:
|
def run(
|
||||||
|
self,
|
||||||
|
additional_title: str | None = None,
|
||||||
|
) -> ValueT | None:
|
||||||
self._sync_from_config()
|
self._sync_from_config()
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
|
@ -106,6 +109,7 @@ class AbstractMenu[ValueT]:
|
||||||
preview_style=PreviewStyle.RIGHT,
|
preview_style=PreviewStyle.RIGHT,
|
||||||
preview_size='auto',
|
preview_size='auto',
|
||||||
preview_frame=FrameProperties('Info', FrameStyle.MAX),
|
preview_frame=FrameProperties('Info', FrameStyle.MAX),
|
||||||
|
additional_title=additional_title,
|
||||||
).run()
|
).run()
|
||||||
|
|
||||||
match result.type_:
|
match result.type_:
|
||||||
|
|
|
||||||
|
|
@ -296,8 +296,8 @@ class MirrorMenu(AbstractSubMenu[MirrorConfiguration]):
|
||||||
return output.strip()
|
return output.strip()
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def run(self) -> MirrorConfiguration:
|
def run(self, additional_title: str | None = None) -> MirrorConfiguration:
|
||||||
super().run()
|
super().run(additional_title=additional_title)
|
||||||
return self._mirror_config
|
return self._mirror_config
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,6 @@ def validate_package_list(packages: list[str]) -> tuple[list[str], list[str]]:
|
||||||
|
|
||||||
|
|
||||||
def installed_package(package: str) -> LocalPackage | None:
|
def installed_package(package: str) -> LocalPackage | None:
|
||||||
package_info = []
|
|
||||||
try:
|
try:
|
||||||
package_info = Pacman.run(f'-Q --info {package}').decode().split('\n')
|
package_info = Pacman.run(f'-Q --info {package}').decode().split('\n')
|
||||||
return _parse_package_output(package_info, LocalPackage)
|
return _parse_package_output(package_info, LocalPackage)
|
||||||
|
|
@ -115,6 +114,17 @@ def installed_package(package: str) -> LocalPackage | None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
@lru_cache
|
||||||
|
def check_package_upgrade(package: str) -> str | None:
|
||||||
|
try:
|
||||||
|
upgrade = Pacman.run(f'-Qu {package}').decode()
|
||||||
|
return upgrade
|
||||||
|
except SysCallError:
|
||||||
|
debug(f'Failed to check for package upgrades: {package}')
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
@lru_cache
|
@lru_cache
|
||||||
def list_available_packages(
|
def list_available_packages(
|
||||||
repositories: tuple[Repository],
|
repositories: tuple[Repository],
|
||||||
|
|
|
||||||
|
|
@ -64,8 +64,8 @@ class ProfileMenu(AbstractSubMenu[ProfileConfiguration]):
|
||||||
]
|
]
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def run(self) -> ProfileConfiguration | None:
|
def run(self, additional_title: str | None = None) -> ProfileConfiguration | None:
|
||||||
super().run()
|
super().run(additional_title=additional_title)
|
||||||
return self._profile_config
|
return self._profile_config
|
||||||
|
|
||||||
def _select_profile(self, preset: Profile | None) -> Profile | None:
|
def _select_profile(self, preset: Profile | None) -> Profile | None:
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,9 @@ from archinstall.lib.models.device_model import (
|
||||||
)
|
)
|
||||||
from archinstall.lib.models.users import User
|
from archinstall.lib.models.users import User
|
||||||
from archinstall.lib.output import debug, error, info
|
from archinstall.lib.output import debug, error, info
|
||||||
|
from archinstall.lib.packages.packages import check_package_upgrade
|
||||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
from archinstall.lib.profile.profiles_handler import profile_handler
|
||||||
|
from archinstall.lib.translationhandler import tr
|
||||||
from archinstall.tui import Tui
|
from archinstall.tui import Tui
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -27,13 +29,20 @@ def ask_user_questions() -> None:
|
||||||
will we continue with the actual installation steps.
|
will we continue with the actual installation steps.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
title_text = None
|
||||||
|
|
||||||
|
upgrade = check_package_upgrade('archinstall')
|
||||||
|
if upgrade:
|
||||||
|
text = tr('New version available') + f': {upgrade}'
|
||||||
|
title_text = f' ({text})'
|
||||||
|
|
||||||
with Tui():
|
with Tui():
|
||||||
global_menu = GlobalMenu(arch_config_handler.config)
|
global_menu = GlobalMenu(arch_config_handler.config)
|
||||||
|
|
||||||
if not arch_config_handler.args.advanced:
|
if not arch_config_handler.args.advanced:
|
||||||
global_menu.set_enabled('parallel_downloads', False)
|
global_menu.set_enabled('parallel_downloads', False)
|
||||||
|
|
||||||
global_menu.run()
|
global_menu.run(additional_title=title_text)
|
||||||
|
|
||||||
|
|
||||||
def perform_installation(mountpoint: Path) -> None:
|
def perform_installation(mountpoint: Path) -> None:
|
||||||
|
|
|
||||||
|
|
@ -82,8 +82,8 @@ class AbstractCurses[ValueT](metaclass=ABCMeta):
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def help_entry(self) -> ViewportEntry:
|
def help_text(self) -> str:
|
||||||
return ViewportEntry(tr('Press Ctrl+h for help'), 0, 0, STYLE.NORMAL)
|
return tr('Press Ctrl+h for help')
|
||||||
|
|
||||||
def _show_help(self) -> None:
|
def _show_help(self) -> None:
|
||||||
help_text = Help.get_help_text()
|
help_text = Help.get_help_text()
|
||||||
|
|
@ -488,7 +488,7 @@ class EditMenu(AbstractCurses[str]):
|
||||||
title = f'* {title}' if not self._allow_skip else title
|
title = f'* {title}' if not self._allow_skip else title
|
||||||
self._frame = FrameProperties(title, FrameStyle.MAX)
|
self._frame = FrameProperties(title, FrameStyle.MAX)
|
||||||
|
|
||||||
self._help_vp: Viewport | None = None
|
self._title_vp: Viewport | None = None
|
||||||
self._header_vp: Viewport | None = None
|
self._header_vp: Viewport | None = None
|
||||||
self._input_vp: EditViewport | None = None
|
self._input_vp: EditViewport | None = None
|
||||||
self._info_vp: Viewport | None = None
|
self._info_vp: Viewport | None = None
|
||||||
|
|
@ -507,7 +507,7 @@ class EditMenu(AbstractCurses[str]):
|
||||||
def _init_viewports(self) -> None:
|
def _init_viewports(self) -> None:
|
||||||
y_offset = 0
|
y_offset = 0
|
||||||
|
|
||||||
self._help_vp = Viewport(self._max_width, 2, 0, y_offset)
|
self._title_vp = Viewport(self._max_width, 2, 0, y_offset)
|
||||||
y_offset += 2
|
y_offset += 2
|
||||||
|
|
||||||
if self._header_entries:
|
if self._header_entries:
|
||||||
|
|
@ -543,8 +543,8 @@ class EditMenu(AbstractCurses[str]):
|
||||||
self._draw()
|
self._draw()
|
||||||
|
|
||||||
def _clear_all(self) -> None:
|
def _clear_all(self) -> None:
|
||||||
if self._help_vp:
|
if self._title_vp:
|
||||||
self._help_vp.erase()
|
self._title_vp.erase()
|
||||||
if self._header_vp:
|
if self._header_vp:
|
||||||
self._header_vp.erase()
|
self._header_vp.erase()
|
||||||
if self._input_vp:
|
if self._input_vp:
|
||||||
|
|
@ -572,8 +572,10 @@ class EditMenu(AbstractCurses[str]):
|
||||||
return text
|
return text
|
||||||
|
|
||||||
def _draw(self) -> None:
|
def _draw(self) -> None:
|
||||||
if self._help_vp:
|
if self._title_vp:
|
||||||
self._help_vp.update([self.help_entry()], 0)
|
help_text = self.help_text()
|
||||||
|
help_entry = ViewportEntry(help_text, 0, 0, STYLE.NORMAL)
|
||||||
|
self._title_vp.update([help_entry], 0)
|
||||||
|
|
||||||
if self._header_entries and self._header_vp:
|
if self._header_entries and self._header_vp:
|
||||||
self._header_vp.update(self._header_entries, 0)
|
self._header_vp.update(self._header_entries, 0)
|
||||||
|
|
@ -692,6 +694,7 @@ class SelectMenu[ValueT](AbstractCurses[ValueT]):
|
||||||
preview_style: PreviewStyle = PreviewStyle.NONE,
|
preview_style: PreviewStyle = PreviewStyle.NONE,
|
||||||
preview_size: float | Literal['auto'] = 0.2,
|
preview_size: float | Literal['auto'] = 0.2,
|
||||||
preview_frame: FrameProperties | None = None,
|
preview_frame: FrameProperties | None = None,
|
||||||
|
additional_title: str | None = None,
|
||||||
):
|
):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
|
@ -712,6 +715,7 @@ class SelectMenu[ValueT](AbstractCurses[ValueT]):
|
||||||
self._frame = frame
|
self._frame = frame
|
||||||
self._interrupt_warning = reset_warning_msg
|
self._interrupt_warning = reset_warning_msg
|
||||||
self._header = header
|
self._header = header
|
||||||
|
self._additional_title = additional_title
|
||||||
|
|
||||||
self._header_entries = []
|
self._header_entries = []
|
||||||
if header:
|
if header:
|
||||||
|
|
@ -730,7 +734,7 @@ class SelectMenu[ValueT](AbstractCurses[ValueT]):
|
||||||
self._visible_entries: list[ViewportEntry] = []
|
self._visible_entries: list[ViewportEntry] = []
|
||||||
self._max_height, self._max_width = Tui.t().max_yx
|
self._max_height, self._max_width = Tui.t().max_yx
|
||||||
|
|
||||||
self._help_vp: Viewport | None = None
|
self._title_vp: Viewport | None = None
|
||||||
self._header_vp: Viewport | None = None
|
self._header_vp: Viewport | None = None
|
||||||
self._footer_vp: Viewport | None = None
|
self._footer_vp: Viewport | None = None
|
||||||
self._menu_vp: Viewport | None = None
|
self._menu_vp: Viewport | None = None
|
||||||
|
|
@ -787,8 +791,8 @@ class SelectMenu[ValueT](AbstractCurses[ValueT]):
|
||||||
self._preview_vp.erase()
|
self._preview_vp.erase()
|
||||||
if self._footer_vp:
|
if self._footer_vp:
|
||||||
self._footer_vp.erase()
|
self._footer_vp.erase()
|
||||||
if self._help_vp:
|
if self._title_vp:
|
||||||
self._help_vp.erase()
|
self._title_vp.erase()
|
||||||
|
|
||||||
def _footer_entries(self) -> list[ViewportEntry]:
|
def _footer_entries(self) -> list[ViewportEntry]:
|
||||||
if self._active_search:
|
if self._active_search:
|
||||||
|
|
@ -801,7 +805,7 @@ class SelectMenu[ValueT](AbstractCurses[ValueT]):
|
||||||
footer_height = 2 # possible filter at the bottom
|
footer_height = 2 # possible filter at the bottom
|
||||||
y_offset = 0
|
y_offset = 0
|
||||||
|
|
||||||
self._help_vp = Viewport(self._max_width, 2, 0, y_offset)
|
self._title_vp = Viewport(self._max_width, 2, 0, y_offset)
|
||||||
y_offset += 2
|
y_offset += 2
|
||||||
|
|
||||||
if self._header_entries:
|
if self._header_entries:
|
||||||
|
|
@ -933,8 +937,15 @@ class SelectMenu[ValueT](AbstractCurses[ValueT]):
|
||||||
items = self._items_state.get_view_items()
|
items = self._items_state.get_view_items()
|
||||||
vp_entries = self._item_to_vp_entry(items)
|
vp_entries = self._item_to_vp_entry(items)
|
||||||
|
|
||||||
if self._help_vp:
|
if self._title_vp:
|
||||||
self._update_viewport(self._help_vp, [self.help_entry()])
|
title_text = self.help_text()
|
||||||
|
|
||||||
|
if self._additional_title is not None:
|
||||||
|
title_text += f' {self._additional_title}'
|
||||||
|
|
||||||
|
title_vp_entry = ViewportEntry(title_text, 0, 0, STYLE.NORMAL)
|
||||||
|
|
||||||
|
self._update_viewport(self._title_vp, [title_vp_entry])
|
||||||
|
|
||||||
if self._header_vp:
|
if self._header_vp:
|
||||||
self._update_viewport(self._header_vp, self._header_entries)
|
self._update_viewport(self._header_vp, self._header_entries)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue