From 2ce0f0b4b19ae6e8a6644ad99ee68b84dec9135e Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Fri, 31 Jul 2026 08:02:10 +0530 Subject: [PATCH 1/6] feat(gnome): add minimal GNOME installation flavor option Fixes #4681 Adds a GnomeFlavor enum with two options: - Minimal (recommended default): installs only essential packages gnome-shell, gnome-session, gnome-terminal, gnome-control-center, gnome-settings-daemon, nautilus, xdg-desktop-portal-gnome, gnome-tweaks - Full: installs the entire gnome package group (previous behavior) User is prompted to choose a flavor via an interactive TUI dialog when selecting the GNOME desktop profile, following the same pattern as the KDE Plasma profile. --- .../default_profiles/desktops/gnome.py | 101 +++++++++++++++++- archinstall/default_profiles/profile.py | 1 + 2 files changed, 97 insertions(+), 5 deletions(-) diff --git a/archinstall/default_profiles/desktops/gnome.py b/archinstall/default_profiles/desktops/gnome.py index fe3ca486..9d7e8cf9 100644 --- a/archinstall/default_profiles/desktops/gnome.py +++ b/archinstall/default_profiles/desktops/gnome.py @@ -1,6 +1,64 @@ +from enum import StrEnum from typing import override -from archinstall.default_profiles.profile import DisplayServerType, GreeterType, Profile, ProfileType +from archinstall.default_profiles.profile import CustomSetting, DisplayServerType, GreeterType, Profile, ProfileType +from archinstall.lib.menu.helpers import Selection +from archinstall.lib.translationhandler import tr +from archinstall.tui.menu_item import MenuItem, MenuItemGroup +from archinstall.tui.result import ResultType + + +class GnomeFlavor(StrEnum): + Full = 'gnome' + Minimal = 'gnome-minimal' + + def show(self) -> str: + match self: + case GnomeFlavor.Full: + return f'gnome ({tr("Full")})' + case GnomeFlavor.Minimal: + return f'gnome-minimal ({tr("Recommended")})' + + def description(self) -> str: + match self: + case GnomeFlavor.Full: + return tr( + 'Installs the full gnome package group.\n' + 'Includes all GNOME apps such as Maps, Contacts,\n' + 'Characters, Calendar, Weather, and more.' + ) + case GnomeFlavor.Minimal: + return tr( + 'Installs a minimal GNOME environment.\n' + 'Includes only the essential components:\n' + ' - gnome-shell\n' + ' - gnome-session\n' + ' - gnome-terminal\n' + ' - gnome-control-center\n' + ' - gnome-settings-daemon\n' + ' - nautilus\n' + ' - xdg-desktop-portal-gnome\n' + ' - gnome-tweaks' + ) + + def packages(self) -> list[str]: + match self: + case GnomeFlavor.Full: + return [ + 'gnome', + 'gnome-tweaks', + ] + case GnomeFlavor.Minimal: + return [ + 'gnome-shell', + 'gnome-session', + 'gnome-terminal', + 'gnome-control-center', + 'gnome-settings-daemon', + 'nautilus', + 'xdg-desktop-portal-gnome', + 'gnome-tweaks', + ] class GnomeProfile(Profile): @@ -15,12 +73,45 @@ class GnomeProfile(Profile): @property @override def packages(self) -> list[str]: - return [ - 'gnome', - 'gnome-tweaks', - ] + flavor_str = self.custom_settings.get(CustomSetting.GnomeFlavor) + + if flavor_str is not None: + flavor = GnomeFlavor(flavor_str) + return flavor.packages() + else: + return GnomeFlavor.Minimal.packages() # minimal as the recommended default @property @override def default_greeter_type(self) -> GreeterType: return GreeterType.Gdm + + async def _select_flavor(self) -> None: + header = tr('Select a GNOME installation flavor') + '\n' + + items = [ + MenuItem( + s.show(), + value=s, + preview_action=lambda x: x.value.description() if x.value else None, + ) + for s in GnomeFlavor + ] + group = MenuItemGroup(items, sort_items=False) + + default = self.custom_settings.get(CustomSetting.GnomeFlavor, None) + group.set_default_by_value(default) + + result = await Selection[GnomeFlavor]( + group, + header=header, + allow_skip=False, + preview_location='right', + ).show() + + if result.type_ == ResultType.Selection: + self.custom_settings[CustomSetting.GnomeFlavor] = result.get_value().value + + @override + async def do_on_select(self) -> None: + await self._select_flavor() diff --git a/archinstall/default_profiles/profile.py b/archinstall/default_profiles/profile.py index 6c328a46..1538cd44 100644 --- a/archinstall/default_profiles/profile.py +++ b/archinstall/default_profiles/profile.py @@ -49,6 +49,7 @@ class SelectResult(Enum): class CustomSetting(StrEnum): SeatAccess = 'seat_access' PlasmaFlavor = 'plasma_flavor' + GnomeFlavor = 'gnome_flavor' class Profile: From 6a244eb2c22da8f8b9f48d714fb4eb64a32e3c7a Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:36:29 +0530 Subject: [PATCH 2/6] chore(cockpit): annotate outdated package entries in packages() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The current packages list contains udisks2 and packagekit which are low-level dependenices pulled in by cockpit itself. These should not be explicitly listed — the proper cockpit app components should be used instead. Adding a NOTE comment to flag this for the next step. --- archinstall/default_profiles/servers/cockpit.py | 1 + 1 file changed, 1 insertion(+) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index 7283bad6..35bf6bef 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -13,6 +13,7 @@ class CockpitProfile(Profile): @property @override def packages(self) -> list[str]: + # NOTE: udisks2 and packagekit are raw dependenices, not cockpit app components return ['cockpit', 'udisks2', 'packagekit'] @property From f2d78e5993ab28edccad95da1b4451a2f628d0cc Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:37:08 +0530 Subject: [PATCH 3/6] fix(cockpit): replace udisks2 with cockpit-storaged The cockpit package was split upstream into seperate app components. udisks2 is a low-level D-Bus service (a dependency), whereas cockpit-storaged is the actual Cockpit UI component for storage management. Installing the app component is the correct approach as documented on the Arch Wiki and the cockpit package page. --- archinstall/default_profiles/servers/cockpit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index 35bf6bef..e3ed51d1 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -14,7 +14,7 @@ class CockpitProfile(Profile): @override def packages(self) -> list[str]: # NOTE: udisks2 and packagekit are raw dependenices, not cockpit app components - return ['cockpit', 'udisks2', 'packagekit'] + return ['cockpit', 'cockpit-storaged', 'packagekit'] @property @override From 30791c24820f7c1fd95bb89ef868f76928839ffc Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:41:43 +0530 Subject: [PATCH 4/6] fix(cockpit): replace packagekit with cockpit-packagekit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same reason as previous commit — packagekit is a backend service and not a cockpit component. cockpit-packagekit is the proper frontend app that provides the software update UI inside Cockpit. The split happened upstream in the cockpit packaging repo and is also refferenced in cockpit-project/cockpit#19315. --- archinstall/default_profiles/servers/cockpit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index e3ed51d1..1b3d31f6 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -14,7 +14,7 @@ class CockpitProfile(Profile): @override def packages(self) -> list[str]: # NOTE: udisks2 and packagekit are raw dependenices, not cockpit app components - return ['cockpit', 'cockpit-storaged', 'packagekit'] + return ['cockpit', 'cockpit-storaged', 'cockpit-packagekit'] @property @override From 76db2ce58c627f795461856db43b53e321338936 Mon Sep 17 00:00:00 2001 From: suraj kumar Date: Sun, 2 Aug 2026 14:42:16 +0530 Subject: [PATCH 5/6] chore(cockpit): remove temporary NOTE comment after fix applied The NOTE comment was added to flag the wrong packages during investigation. Now that both udisks2 and packagekit have been replaced with there proper cockpit components, the comment is no longer needed and can be safely removed. --- archinstall/default_profiles/servers/cockpit.py | 1 - 1 file changed, 1 deletion(-) diff --git a/archinstall/default_profiles/servers/cockpit.py b/archinstall/default_profiles/servers/cockpit.py index 1b3d31f6..1e010d44 100644 --- a/archinstall/default_profiles/servers/cockpit.py +++ b/archinstall/default_profiles/servers/cockpit.py @@ -13,7 +13,6 @@ class CockpitProfile(Profile): @property @override def packages(self) -> list[str]: - # NOTE: udisks2 and packagekit are raw dependenices, not cockpit app components return ['cockpit', 'cockpit-storaged', 'cockpit-packagekit'] @property