Skip to content

Commit 4023cfe

Browse files
authored
Fix 3412 - Take optional repositories into account (#3427)
1 parent 9a939d8 commit 4023cfe

5 files changed

Lines changed: 72 additions & 31 deletions

File tree

archinstall/lib/global_menu.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu
66
from archinstall.lib.disk.encryption_menu import DiskEncryptionMenu
77
from archinstall.lib.models.device_model import DiskEncryption, DiskLayoutConfiguration, DiskLayoutType, EncryptionType, FilesystemType, PartitionModification
8+
from archinstall.lib.packages import list_available_packages
89
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
910

1011
from .args import ArchConfig
@@ -29,9 +30,11 @@
2930
from .models.locale import LocaleConfiguration
3031
from .models.mirrors import MirrorConfiguration
3132
from .models.network_configuration import NetworkConfiguration, NicType
33+
from .models.packages import Repository
3234
from .models.profile_model import ProfileConfiguration
3335
from .models.users import Password, User
3436
from .output import FormattedOutput
37+
from .pacman.config import PacmanConfig
3538
from .translationhandler import Language, translation_handler
3639
from .utils.util import get_password
3740

@@ -168,7 +171,7 @@ def _get_menu_options(self) -> list[MenuItem]:
168171
),
169172
MenuItem(
170173
text=str(_('Additional packages')),
171-
action=ask_additional_packages_to_install,
174+
action=self._select_additional_packages,
172175
value=[],
173176
preview_action=self._prev_additional_pkgs,
174177
key='packages'
@@ -536,13 +539,38 @@ def _select_profile(self, current_profile: ProfileConfiguration | None):
536539
profile_config = ProfileMenu(preset=current_profile).run()
537540
return profile_config
538541

542+
def _select_additional_packages(self, preset: list[str]) -> list[str]:
543+
config: MirrorConfiguration | None = self._item_group.find_by_key('mirror_config').value
544+
545+
repositories: set[Repository] = set()
546+
if config:
547+
repositories = set(config.optional_repositories)
548+
549+
packages = ask_additional_packages_to_install(
550+
preset,
551+
repositories=repositories
552+
)
553+
554+
return packages
555+
539556
def _create_user_account(self, preset: list[User] | None = None) -> list[User]:
540557
preset = [] if preset is None else preset
541558
users = ask_for_additional_users(defined_users=preset)
542559
return users
543560

544561
def _mirror_configuration(self, preset: MirrorConfiguration | None = None) -> MirrorConfiguration | None:
545562
mirror_configuration = MirrorMenu(preset=preset).run()
563+
564+
if mirror_configuration:
565+
if mirror_configuration.optional_repositories:
566+
# reset the package list cache in case the repository selection has changed
567+
list_available_packages.cache_clear()
568+
569+
# enable the repositories in the config
570+
pacman_config = PacmanConfig(None)
571+
pacman_config.enable(mirror_configuration.optional_repositories)
572+
pacman_config.apply()
573+
546574
return mirror_configuration
547575

548576
def _prev_mirror_config(self, item: MenuItem) -> str | None:

archinstall/lib/installer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
from .models.users import User
4545
from .output import debug, error, info, log, warn
4646
from .pacman import Pacman
47-
from .pacman.config import Config
47+
from .pacman.config import PacmanConfig
4848
from .plugins import plugins
4949
from .storage import storage
5050

@@ -847,7 +847,7 @@ def minimal_installation(
847847
debug(f'Optional repositories: {optional_repositories}')
848848

849849
# This action takes place on the host system as pacstrap copies over package repository lists.
850-
pacman_conf = Config(self.target)
850+
pacman_conf = PacmanConfig(self.target)
851851
pacman_conf.enable(optional_repositories)
852852
pacman_conf.apply()
853853

archinstall/lib/interactions/general_conf.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,14 @@ def ask_additional_packages_to_install(
178178
preset: list[str] = [],
179179
repositories: set[Repository] = set()
180180
) -> list[str]:
181-
Tui.print(str(_('Loading packages...')), clear_screen=True)
182-
183181
repositories |= {Repository.Core, Repository.Extra}
182+
183+
respos_text = ', '.join([r.value for r in repositories])
184+
output = str(_('Repositories: {}')).format(respos_text) + '\n'
185+
186+
output += str(_('Loading packages...'))
187+
Tui.print(output, clear_screen=True)
188+
184189
packages = list_available_packages(tuple(repositories))
185190
package_groups = PackageGroup.from_available_packages(packages)
186191

archinstall/lib/pacman/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from ..general import SysCommand
88
from ..output import error, info, warn
99
from ..plugins import plugins
10-
from .config import Config
10+
from .config import PacmanConfig
1111

1212
if TYPE_CHECKING:
1313
from archinstall.lib.translationhandler import DeferredTranslation
@@ -89,6 +89,6 @@ def strap(self, packages: str | list[str]) -> None:
8989

9090

9191
__all__ = [
92-
'Config',
9392
'Pacman',
93+
'PacmanConfig',
9494
]

archinstall/lib/pacman/config.py

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
from ..models.packages import Repository
66

77

8-
class Config:
9-
def __init__(self, target: Path):
10-
self.path = Path("/etc") / "pacman.conf"
11-
self.chroot_path = target / "etc" / "pacman.conf"
8+
class PacmanConfig:
9+
def __init__(self, target: Path | None):
10+
self._config_path = Path("/etc") / "pacman.conf"
11+
12+
if target:
13+
self._config_remote_path = target / "etc" / "pacman.conf"
14+
1215
self._repositories: list[Repository] = []
1316

1417
def enable(self, repo: Repository | list[Repository]) -> None:
@@ -21,26 +24,31 @@ def apply(self) -> None:
2124
if not self._repositories:
2225
return
2326

24-
if Repository.Testing in self._repositories:
25-
if Repository.Multilib in self._repositories:
26-
repos_pattern = f'({Repository.Multilib.value}|.+-{Repository.Testing.value})'
27+
repos_to_enable = []
28+
for repo in self._repositories:
29+
if repo == Repository.Testing:
30+
repos_to_enable.extend(['core-testing', 'extra-testing', 'multilib-testing'])
2731
else:
28-
repos_pattern = f'(?!{Repository.Multilib.value}).+-{Repository.Testing.value}'
29-
else:
30-
repos_pattern = Repository.Multilib.value
31-
32-
pattern = re.compile(rf"^#\s*\[{repos_pattern}\]$")
33-
lines = iter(self.path.read_text().splitlines(keepends=True))
34-
35-
with open(self.path, 'w') as f:
36-
for line in lines:
37-
if pattern.match(line):
38-
# Uncomment this line and the next.
39-
f.write(line.lstrip('#'))
40-
f.write(next(lines).lstrip('#'))
41-
else:
42-
f.write(line)
32+
repos_to_enable.append(repo.value)
33+
34+
content = self._config_path.read_text().splitlines(keepends=True)
35+
36+
for row, line in enumerate(content):
37+
# Check if this is a commented repository section that needs to be enabled
38+
match = re.match(r'^#\s*\[(.*)\]', line)
39+
40+
if match and match.group(1) in repos_to_enable:
41+
# uncomment the repository section line, properly removing # and any spaces
42+
content[row] = re.sub(r'^#\s*', '', line)
43+
44+
# also uncomment the next line (Include statement) if it exists and is commented
45+
if row + 1 < len(content) and content[row + 1].lstrip().startswith('#'):
46+
content[row + 1] = re.sub(r'^#\s*', '', content[row + 1])
47+
48+
# Write the modified content back to the file
49+
with open(self._config_path, 'w') as f:
50+
f.writelines(content)
4351

4452
def persist(self) -> None:
45-
if self._repositories:
46-
copy2(self.path, self.chroot_path)
53+
if self._repositories and self._config_remote_path:
54+
copy2(self._config_path, self._config_remote_path)

0 commit comments

Comments
 (0)