Skip to content

Commit 063b964

Browse files
authored
Add new version indicator in the title of the main menu (#3587)
* Add new version indicator in the title of the main menu * Update
1 parent 7b3b7c9 commit 063b964

10 files changed

Lines changed: 73 additions & 35 deletions

File tree

archinstall/__init__.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
from archinstall.lib.args import arch_config_handler
1010
from archinstall.lib.disk.utils import disk_layouts
11+
from archinstall.lib.packages.packages import check_package_upgrade
1112

1213
from .lib.hardware import SysInfo
1314
from .lib.output import FormattedOutput, debug, error, info, log, warn
@@ -53,15 +54,15 @@ def _check_new_version() -> None:
5354
info('Checking version...')
5455
upgrade = None
5556

56-
try:
57-
upgrade = Pacman.run('-Qu archinstall').decode()
58-
except Exception as e:
59-
debug(f'Failed determine pacman version: {e}')
57+
upgrade = check_package_upgrade('archinstall')
58+
59+
if upgrade is None:
60+
debug('No archinstall upgrades found')
61+
return None
6062

61-
if upgrade:
62-
text = f'New version available: {upgrade}'
63-
info(text)
64-
time.sleep(3)
63+
text = tr('New version available') + f': {upgrade}'
64+
info(text)
65+
time.sleep(3)
6566

6667

6768
def main() -> int:

archinstall/lib/disk/disk_menu.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ def _define_menu_options(self) -> list[MenuItem]:
9494
]
9595

9696
@override
97-
def run(self) -> DiskLayoutConfiguration | None:
98-
super().run()
97+
def run(self, additional_title: str | None = None) -> DiskLayoutConfiguration | None:
98+
super().run(additional_title=additional_title)
9999

100100
if self._disk_menu_config.disk_config:
101101
self._disk_menu_config.disk_config.lvm_config = self._disk_menu_config.lvm_config

archinstall/lib/disk/encryption_menu.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ def _check_dep_lvm_vols(self) -> bool:
115115
return False
116116

117117
@override
118-
def run(self) -> DiskEncryption | None:
119-
super().run()
118+
def run(self, additional_title: str | None = None) -> DiskEncryption | None:
119+
super().run(additional_title=additional_title)
120120

121121
enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value
122122
enc_password: Password | None = self._item_group.find_by_key('encryption_password').value

archinstall/lib/locale/locale_menu.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,11 @@ def _prev_locale(self, item: MenuItem) -> str:
6060
return temp_locale.preview()
6161

6262
@override
63-
def run(self) -> LocaleConfiguration:
64-
super().run()
63+
def run(
64+
self,
65+
additional_title: str | None = None,
66+
) -> LocaleConfiguration:
67+
super().run(additional_title=additional_title)
6568
return self._locale_conf
6669

6770
def _select_kb_layout(self, preset: str | None) -> str | None:

archinstall/lib/menu/abstract_menu.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ def disable_all(self) -> None:
9494
def _is_config_valid(self) -> bool:
9595
return True
9696

97-
def run(self) -> ValueT | None:
97+
def run(
98+
self,
99+
additional_title: str | None = None,
100+
) -> ValueT | None:
98101
self._sync_from_config()
99102

100103
while True:
@@ -106,6 +109,7 @@ def run(self) -> ValueT | None:
106109
preview_style=PreviewStyle.RIGHT,
107110
preview_size='auto',
108111
preview_frame=FrameProperties('Info', FrameStyle.MAX),
112+
additional_title=additional_title,
109113
).run()
110114

111115
match result.type_:

archinstall/lib/mirrors.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,8 @@ def _prev_custom_servers(self, item: MenuItem) -> str | None:
296296
return output.strip()
297297

298298
@override
299-
def run(self) -> MirrorConfiguration:
300-
super().run()
299+
def run(self, additional_title: str | None = None) -> MirrorConfiguration:
300+
super().run(additional_title=additional_title)
301301
return self._mirror_config
302302

303303

archinstall/lib/packages/packages.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ def validate_package_list(packages: list[str]) -> tuple[list[str], list[str]]:
105105

106106

107107
def installed_package(package: str) -> LocalPackage | None:
108-
package_info = []
109108
try:
110109
package_info = Pacman.run(f'-Q --info {package}').decode().split('\n')
111110
return _parse_package_output(package_info, LocalPackage)
@@ -115,6 +114,17 @@ def installed_package(package: str) -> LocalPackage | None:
115114
return None
116115

117116

117+
@lru_cache
118+
def check_package_upgrade(package: str) -> str | None:
119+
try:
120+
upgrade = Pacman.run(f'-Qu {package}').decode()
121+
return upgrade
122+
except SysCallError:
123+
debug(f'Failed to check for package upgrades: {package}')
124+
125+
return None
126+
127+
118128
@lru_cache
119129
def list_available_packages(
120130
repositories: tuple[Repository],

archinstall/lib/profile/profile_menu.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ def _define_menu_options(self) -> list[MenuItem]:
6464
]
6565

6666
@override
67-
def run(self) -> ProfileConfiguration | None:
68-
super().run()
67+
def run(self, additional_title: str | None = None) -> ProfileConfiguration | None:
68+
super().run(additional_title=additional_title)
6969
return self._profile_config
7070

7171
def _select_profile(self, preset: Profile | None) -> Profile | None:

archinstall/scripts/guided.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
)
1717
from archinstall.lib.models.users import User
1818
from archinstall.lib.output import debug, error, info
19+
from archinstall.lib.packages.packages import check_package_upgrade
1920
from archinstall.lib.profile.profiles_handler import profile_handler
21+
from archinstall.lib.translationhandler import tr
2022
from archinstall.tui import Tui
2123

2224

@@ -27,13 +29,20 @@ def ask_user_questions() -> None:
2729
will we continue with the actual installation steps.
2830
"""
2931

32+
title_text = None
33+
34+
upgrade = check_package_upgrade('archinstall')
35+
if upgrade:
36+
text = tr('New version available') + f': {upgrade}'
37+
title_text = f' ({text})'
38+
3039
with Tui():
3140
global_menu = GlobalMenu(arch_config_handler.config)
3241

3342
if not arch_config_handler.args.advanced:
3443
global_menu.set_enabled('parallel_downloads', False)
3544

36-
global_menu.run()
45+
global_menu.run(additional_title=title_text)
3746

3847

3948
def perform_installation(mountpoint: Path) -> None:

archinstall/tui/curses_menu.py

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ def _confirm_interrupt(self, warning: str) -> bool:
8282

8383
return False
8484

85-
def help_entry(self) -> ViewportEntry:
86-
return ViewportEntry(tr('Press Ctrl+h for help'), 0, 0, STYLE.NORMAL)
85+
def help_text(self) -> str:
86+
return tr('Press Ctrl+h for help')
8787

8888
def _show_help(self) -> None:
8989
help_text = Help.get_help_text()
@@ -488,7 +488,7 @@ def __init__(
488488
title = f'* {title}' if not self._allow_skip else title
489489
self._frame = FrameProperties(title, FrameStyle.MAX)
490490

491-
self._help_vp: Viewport | None = None
491+
self._title_vp: Viewport | None = None
492492
self._header_vp: Viewport | None = None
493493
self._input_vp: EditViewport | None = None
494494
self._info_vp: Viewport | None = None
@@ -507,7 +507,7 @@ def __init__(
507507
def _init_viewports(self) -> None:
508508
y_offset = 0
509509

510-
self._help_vp = Viewport(self._max_width, 2, 0, y_offset)
510+
self._title_vp = Viewport(self._max_width, 2, 0, y_offset)
511511
y_offset += 2
512512

513513
if self._header_entries:
@@ -543,8 +543,8 @@ def resize_win(self) -> None:
543543
self._draw()
544544

545545
def _clear_all(self) -> None:
546-
if self._help_vp:
547-
self._help_vp.erase()
546+
if self._title_vp:
547+
self._title_vp.erase()
548548
if self._header_vp:
549549
self._header_vp.erase()
550550
if self._input_vp:
@@ -572,8 +572,10 @@ def _get_input_text(self) -> str | None:
572572
return text
573573

574574
def _draw(self) -> None:
575-
if self._help_vp:
576-
self._help_vp.update([self.help_entry()], 0)
575+
if self._title_vp:
576+
help_text = self.help_text()
577+
help_entry = ViewportEntry(help_text, 0, 0, STYLE.NORMAL)
578+
self._title_vp.update([help_entry], 0)
577579

578580
if self._header_entries and self._header_vp:
579581
self._header_vp.update(self._header_entries, 0)
@@ -692,6 +694,7 @@ def __init__(
692694
preview_style: PreviewStyle = PreviewStyle.NONE,
693695
preview_size: float | Literal['auto'] = 0.2,
694696
preview_frame: FrameProperties | None = None,
697+
additional_title: str | None = None,
695698
):
696699
super().__init__()
697700

@@ -712,6 +715,7 @@ def __init__(
712715
self._frame = frame
713716
self._interrupt_warning = reset_warning_msg
714717
self._header = header
718+
self._additional_title = additional_title
715719

716720
self._header_entries = []
717721
if header:
@@ -730,7 +734,7 @@ def __init__(
730734
self._visible_entries: list[ViewportEntry] = []
731735
self._max_height, self._max_width = Tui.t().max_yx
732736

733-
self._help_vp: Viewport | None = None
737+
self._title_vp: Viewport | None = None
734738
self._header_vp: Viewport | None = None
735739
self._footer_vp: Viewport | None = None
736740
self._menu_vp: Viewport | None = None
@@ -787,8 +791,8 @@ def _clear_all(self) -> None:
787791
self._preview_vp.erase()
788792
if self._footer_vp:
789793
self._footer_vp.erase()
790-
if self._help_vp:
791-
self._help_vp.erase()
794+
if self._title_vp:
795+
self._title_vp.erase()
792796

793797
def _footer_entries(self) -> list[ViewportEntry]:
794798
if self._active_search:
@@ -801,7 +805,7 @@ def _init_viewports(self, arg_prev_size: float | Literal['auto']) -> None:
801805
footer_height = 2 # possible filter at the bottom
802806
y_offset = 0
803807

804-
self._help_vp = Viewport(self._max_width, 2, 0, y_offset)
808+
self._title_vp = Viewport(self._max_width, 2, 0, y_offset)
805809
y_offset += 2
806810

807811
if self._header_entries:
@@ -933,8 +937,15 @@ def _draw(self) -> None:
933937
items = self._items_state.get_view_items()
934938
vp_entries = self._item_to_vp_entry(items)
935939

936-
if self._help_vp:
937-
self._update_viewport(self._help_vp, [self.help_entry()])
940+
if self._title_vp:
941+
title_text = self.help_text()
942+
943+
if self._additional_title is not None:
944+
title_text += f' {self._additional_title}'
945+
946+
title_vp_entry = ViewportEntry(title_text, 0, 0, STYLE.NORMAL)
947+
948+
self._update_viewport(self._title_vp, [title_vp_entry])
938949

939950
if self._header_vp:
940951
self._update_viewport(self._header_vp, self._header_entries)

0 commit comments

Comments
 (0)