( preset: list[str] = [], repositories: set[Repository] = set(), )
| 119 | |
| 120 | |
| 121 | async def select_additional_packages( |
| 122 | preset: list[str] = [], |
| 123 | repositories: set[Repository] = set(), |
| 124 | ) -> list[str]: |
| 125 | repositories |= {Repository.Core, Repository.Extra} |
| 126 | |
| 127 | respos_text = ', '.join(r.value for r in repositories) |
| 128 | output = tr('Repositories: {}').format(respos_text) + '\n' |
| 129 | output += tr('Loading packages...') |
| 130 | |
| 131 | result = await Loading[dict[str, AvailablePackage]]( |
| 132 | header=output, |
| 133 | data_callback=lambda: list_available_packages(tuple(repositories)), |
| 134 | ).show() |
| 135 | |
| 136 | if result.type_ != ResultType.Selection: |
| 137 | debug('Error while loading packages') |
| 138 | return preset |
| 139 | |
| 140 | packages = result.get_value() |
| 141 | |
| 142 | if not packages: |
| 143 | await Notify(tr('No packages found')).show() |
| 144 | return [] |
| 145 | |
| 146 | package_groups = PackageGroup.from_available_packages(packages) |
| 147 | |
| 148 | # Additional packages (with some light weight error handling for invalid package names) |
| 149 | header = tr('Only packages such as base, sudo, linux, linux-firmware, efibootmgr and optional profile packages are installed.') + '\n' |
| 150 | header += tr('Note: base-devel is no longer installed by default. Add it here if you need build tools.') + '\n' |
| 151 | header += tr('Select any packages from the below list that should be installed additionally') + '\n' |
| 152 | |
| 153 | # there are over 15k packages so this needs to be quick |
| 154 | preset_packages: list[AvailablePackage | PackageGroup] = [] |
| 155 | for p in preset: |
| 156 | if p in packages: |
| 157 | preset_packages.append(packages[p]) |
| 158 | elif p in package_groups: |
| 159 | preset_packages.append(package_groups[p]) |
| 160 | |
| 161 | items = [ |
| 162 | MenuItem( |
| 163 | name, |
| 164 | value=pkg, |
| 165 | preview_action=lambda x: x.value.info() if x.value else None, |
| 166 | ) |
| 167 | for name, pkg in packages.items() |
| 168 | ] |
| 169 | |
| 170 | items += [ |
| 171 | MenuItem( |
| 172 | name, |
| 173 | value=group, |
| 174 | preview_action=lambda x: x.value.info() if x.value else None, |
| 175 | ) |
| 176 | for name, group in package_groups.items() |
| 177 | ] |
| 178 |
no test coverage detected