Commit Graph

4819 Commits

Author SHA1 Message Date
Victor f5c9a00ee2 Translate the os-prober label in the bootloader preview
Reuse the existing 'Detect other operating systems' msgid so the
preview matches the menu item label and stays localizable, like the
neighbouring Removable and Plymouth labels. Suggested in PR review.
2026-08-05 19:29:56 -03:00
Victor 54f993c512 Log os-prober enablement during GRUB setup
The os-prober block straps packages and edits /etc/default/grub without
leaving any trace in the install log. Add a debug marker, matching the
logging convention of the surrounding bootloader steps.
2026-08-05 14:58:38 -03:00
Victor 5edf382dd3 Install fuse3 alongside os-prober
Since version 1.77 os-prober probes unmounted partitions exclusively
through grub-mount and silently skips them when it cannot run. The grub
package ships grub-mount but only lists fuse3 as an optional
dependency, so without it os-prober is limited to already-mounted
partitions and misses the common dual-boot case of Windows living on
another disk. Installing fuse3 also lets grub-mount read NTFS in
userspace, keeping detection independent of kernel filesystem modules
inside the installation chroot.
2026-08-05 11:48:33 -03:00
Victor 702e7528d7 Update tests, docs and samples for the os_prober option
Cover os_prober in the config fixture and parsing assertions, and
document the new key in the config options table and sample configs.
2026-08-05 11:32:39 -03:00
Victor 864780da66 Add os-prober toggle to the bootloader menu
Expose the os_prober option in the bootloader submenu. The item is only
enabled when GRUB is selected and is reset when switching to a
bootloader without os-prober support, mirroring the uki and removable
handling. Regenerate the translation template for the new strings.
2026-08-05 11:32:36 -03:00
Victor d5b701347b Enable os-prober during GRUB installation
When the os_prober option is set, install the os-prober package and set
GRUB_DISABLE_OS_PROBER=false in /etc/default/grub so that grub-mkconfig
detects other operating systems such as Windows. The edit runs for both
the UKI and non-UKI paths and handles configs where the option is
commented out, set to another value or missing entirely.

Like the uki and removable options, an unsupported combination is
downgraded with a warning instead of failing the installation.
2026-08-05 11:32:33 -03:00
Victor 27aa94ff2b Add os_prober option to bootloader configuration model
Introduce an os_prober flag on BootloaderConfiguration, defaulting to
false to match the upstream GRUB default of shipping os-prober
disabled. Bootloader.has_os_prober_support() limits the option to GRUB,
the only supported bootloader that consumes os-prober output.
2026-08-05 11:32:31 -03:00
codefiles 9a19e39a25
Use staticmethod for get_type_from_code (#4693)
Addresses the following:

pyright

```
  archinstall/lib/models/device.py:759:11 - error: Type "Literal[PartitionType.PRIMARY]" is not assignable to return type "Self@PartitionType"
    Type "Literal[PartitionType.PRIMARY]" is not assignable to type "Self@PartitionType" (reportReturnType)
  archinstall/lib/models/device.py:762:11 - error: Type "Literal[PartitionType._UNKNOWN]" is not assignable to return type "Self@PartitionType"
    Type "Literal[PartitionType._UNKNOWN]" is not assignable to type "Self@PartitionType" (reportReturnType)
```

pyrefly

```
ERROR Returned type `Literal[PartitionType.PRIMARY]` is not assignable to declared return type `Self@PartitionType` [bad-return]
   --> archinstall/lib/models/device.py:759:11
    |
757 |     def get_type_from_code(cls, code: int) -> Self:
    |                                               ---- declared return type
758 |         if code == parted.PARTITION_NORMAL:
759 |             return cls.PRIMARY
    |                    ^^^^^^^^^^^
    |
ERROR Returned type `Literal[PartitionType._UNKNOWN]` is not assignable to declared return type `Self@PartitionType` [bad-return]
   --> archinstall/lib/models/device.py:762:11
    |
757 |     def get_type_from_code(cls, code: int) -> Self:
    |                                               ---- declared return type
758 |         if code == parted.PARTITION_NORMAL:
759 |             return cls.PRIMARY
760 |         else:
761 |             debug(f'Partition code not supported: {code}')
762 |             return cls._UNKNOWN
    |                    ^^^^^^^^^^^^
    |
```

ty

```
error[invalid-return-type]: Return type does not match returned value
   --> archinstall/lib/models/device.py:757:44
    |
757 |     def get_type_from_code(cls, code: int) -> Self:
    |                                               ---- Expected `Self@get_type_from_code` because of return type
758 |         if code == parted.PARTITION_NORMAL:
759 |             return cls.PRIMARY
    |                    ^^^^^^^^^^^ expected `Self@get_type_from_code`, found `Literal[PartitionType.PRIMARY]`
    |

error[invalid-return-type]: Return type does not match returned value
   --> archinstall/lib/models/device.py:757:44
    |
757 |     def get_type_from_code(cls, code: int) -> Self:
    |                                               ---- Expected `Self@get_type_from_code` because of return type
758 |         if code == parted.PARTITION_NORMAL:
759 |             return cls.PRIMARY
760 |         else:
761 |             debug(f'Partition code not supported: {code}')
762 |             return cls._UNKNOWN
    |                    ^^^^^^^^^^^^ expected `Self@get_type_from_code`, found `Literal[PartitionType._UNKNOWN]`
    |
```
2026-08-04 06:31:06 +10:00
codefiles 34b3cecced
Refactor TranslationHandler locales directory (#4692) 2026-08-03 21:39:22 +10:00
codefiles 0d6ffc3795
Refactor default PartitionTable (#4689)
Addresses the following:

pyright

```
  archinstall/lib/models/device.py:262:10 - error: Type "Literal[PartitionTable.GPT, PartitionTable.MBR]" is not assignable to return type "Self@PartitionTable"
    Type "Literal[PartitionTable.GPT, PartitionTable.MBR]" is not assignable to type "Self@PartitionTable" (reportReturnType)
```

ty

```
error[invalid-return-type]: Return type does not match returned value
   --> archinstall/lib/models/device.py:261:22
    |
261 |     def default(cls) -> Self:
    |                         ---- Expected `Self@default` because of return type
262 |         return cls.GPT if SysInfo.has_uefi() else cls.MBR
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Self@default`, found `PartitionTable`
    |
```
2026-08-03 21:38:20 +10:00
codefiles c7e512a294
Refactor CPUVendor (#4691)
Addresses the following:

pyright

```
  archinstall/lib/hardware.py:25:11 - error: Type "Literal[CpuVendor._Unknown]" is not assignable to return type "Self@CpuVendor"
    Type "Literal[CpuVendor._Unknown]" is not assignable to type "Self@CpuVendor" (reportReturnType)
```

pyrefly

```
ERROR Returned type `Literal[CpuVendor._Unknown]` is not assignable to declared return type `Self@CpuVendor` [bad-return]
  --> archinstall/lib/hardware.py:25:11
   |
20 |     def get_vendor(cls, name: str) -> Self:
   |                                       ---- declared return type
21 |         if vendor := getattr(cls, name, None):
22 |             return vendor
23 |         else:
24 |             debug(f"Unknown CPU vendor '{name}' detected.")
25 |             return cls._Unknown
   |                    ^^^^^^^^^^^^
   |
```

ty

```
error[invalid-return-type]: Return type does not match returned value
  --> archinstall/lib/hardware.py:20:36
   |
20 |     def get_vendor(cls, name: str) -> Self:
   |                                       ---- Expected `Self@get_vendor` because of return type
21 |         if vendor := getattr(cls, name, None):
22 |             return vendor
23 |         else:
24 |             debug(f"Unknown CPU vendor '{name}' detected.")
25 |             return cls._Unknown
   |                    ^^^^^^^^^^^^ expected `Self@get_vendor`, found `Literal[CpuVendor._Unknown]`
   |
```
2026-08-03 21:37:09 +10:00
codefiles c7da3cd8b9
Use staticmethod for Bootloader.get_default (#4690)
Addresses the following:

pyright

```
  archinstall/lib/models/bootloader.py:42:11 - error: Type "Literal[Bootloader.NO_BOOTLOADER]" is not assignable to return type "Self@Bootloader"
    Type "Literal[Bootloader.NO_BOOTLOADER]" is not assignable to type "Self@Bootloader" (reportReturnType)
  archinstall/lib/models/bootloader.py:44:11 - error: Type "Literal[Bootloader.Systemd]" is not assignable to return type "Self@Bootloader"
    Type "Literal[Bootloader.Systemd]" is not assignable to type "Self@Bootloader" (reportReturnType)
  archinstall/lib/models/bootloader.py:46:11 - error: Type "Literal[Bootloader.Grub]" is not assignable to return type "Self@Bootloader"
    Type "Literal[Bootloader.Grub]" is not assignable to type "Self@Bootloader" (reportReturnType)
```

pyrefly

```
ERROR Returned type `Literal[Bootloader.NO_BOOTLOADER]` is not assignable to declared return type `Self@Bootloader` [bad-return]
  --> archinstall/lib/models/bootloader.py:42:11
   |
40 |     def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
   |                                                                  ---- declared return type
41 |         if skip_boot:
42 |             return cls.NO_BOOTLOADER
   |                    ^^^^^^^^^^^^^^^^^
   |
ERROR Returned type `Literal[Bootloader.Systemd]` is not assignable to declared return type `Self@Bootloader` [bad-return]
  --> archinstall/lib/models/bootloader.py:44:11
   |
40 |     def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
   |                                                                  ---- declared return type
41 |         if skip_boot:
42 |             return cls.NO_BOOTLOADER
43 |         elif uefi:
44 |             return cls.Systemd
   |                    ^^^^^^^^^^^
   |
ERROR Returned type `Literal[Bootloader.Grub]` is not assignable to declared return type `Self@Bootloader`
[bad-return]
  --> archinstall/lib/models/bootloader.py:46:11
   |
40 |     def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
   |                                                                  ---- declared return type
41 |         if skip_boot:
42 |             return cls.NO_BOOTLOADER
43 |         elif uefi:
44 |             return cls.Systemd
45 |         else:
46 |             return cls.Grub
   |                    ^^^^^^^^
   |
```

ty

```
error[invalid-return-type]: Return type does not match returned value
  --> archinstall/lib/models/bootloader.py:40:63
   |
40 |     def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
   |                                                                  ---- Expected `Self@get_default` because of return type
41 |         if skip_boot:
42 |             return cls.NO_BOOTLOADER
   |                    ^^^^^^^^^^^^^^^^^ expected `Self@get_default`, found `Literal[Bootloader.NO_BOOTLOADER]`
   |

error[invalid-return-type]: Return type does not match returned value
  --> archinstall/lib/models/bootloader.py:40:63
   |
40 |     def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
   |                                                                  ---- Expected `Self@get_default` because of return type
41 |         if skip_boot:
42 |             return cls.NO_BOOTLOADER
43 |         elif uefi:
44 |             return cls.Systemd
   |                    ^^^^^^^^^^^ expected `Self@get_default`, found `Literal[Bootloader.Systemd]`
   |

error[invalid-return-type]: Return type does not match returned value
  --> archinstall/lib/models/bootloader.py:46:11
   |
46 |             return cls.Grub
   |                    ^^^^^^^^ expected `Self@get_default`, found `Literal[Bootloader.Grub]`
   |
  ::: archinstall/lib/models/bootloader.py:40:63
   |
40 |     def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
   |                                                                  ---- Expected `Self@get_default` because of return type
   |
```
2026-08-03 21:35:39 +10:00
renovate[bot] d43da6a1c2
Update pre-commit hook astral-sh/ruff-pre-commit to v0.16.1 (#4684)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-31 22:15:46 +10:00
renovate[bot] 3c56d9735e
Update dependency ruff to v0.16.1 (#4683)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-31 22:15:25 +10:00
Sanjay Santhanam 0f7c5c58fb
fix(applications): add ghostscript to print service packages (#4670)
* fix(applications): add ghostscript to print service packages

Selecting the print service installs cups, system-config-printer and
cups-pk-helper, but not ghostscript. cups relies on ghostscript for the
PDF/PostScript rendering filter, so driverless (IPP Everywhere) print
jobs fail out of the box with:

  cfFilterGhostscript: Unable to launch Ghostscript: gs: No such file or directory

Add ghostscript to the package list and cover it with a regression test.

Closes #4595

* test: drop low-value print service package assertion
2026-07-31 22:15:00 +10:00
codefiles 3576eec234
Remove unused parameter from _prepare_fs_type (#4685) 2026-07-31 14:46:45 +10:00
codefiles 274f6c2190
Remove superfluous PacmanConfiguration.default (#4682) 2026-07-31 14:44:05 +10:00
codefiles c0affc895c
Remove superfluous underscore variable assignment (#4679) 2026-07-31 14:43:37 +10:00
codefiles 1d66204940
Remove reintroduced __future__ import (#4678) 2026-07-31 14:43:03 +10:00
Matteo a327efcd6d
Update Italian translation (#4675)
* Added new strings
* Updated strings
* Deleted some redundant unused strings
2026-07-28 19:15:01 +10:00
utuhiro78 88e524231b
Update Japanese translation (#4672)
* Update Japanese translation

* Update Japanese translation
2026-07-27 22:10:00 +10:00
codefiles c25589e772
Support AArch64 root partition type GUID (#4671) 2026-07-27 22:07:28 +10:00
codefiles bb0df33556
Deduplicate enabling systemd-resolved stub mode (#4669) 2026-07-27 22:05:20 +10:00
codefiles fe16238983
Refactor run_custom_user_commands (#4668) 2026-07-25 15:33:22 +10:00
codefiles c1dcce8c2c
Add constant for path /sys/class/net (#4667) 2026-07-25 15:32:22 +10:00
correctmost 615c3341dc
Enable flake8-gettext checks in ruff (#4664)
This will help catch incorrect translation placeholders, like those
fixed in commit dccd0c8cc.

This commit also removes custom checking code from the
locales_generator.sh script.
2026-07-25 08:01:39 +10:00
Steev Klimaszewski 3653fbd695
Support aarch64 for GRUB and Limine EFI installation (#4641)
On aarch64 both the GRUB and Limine installers assume x86 and fail.

GRUB names its EFI target 'arm64', but platform.machine() returns
'aarch64', so passing --target=aarch64-efi is rejected. Map aarch64
to the arm64 target name expected by grub-install.

Limine ships architecture-specific default EFI binaries: BOOTAA64.EFI
on aarch64 versus BOOTIA32.EFI and BOOTX64.EFI on x86. Select the
correct binaries in the three places that reference them: when copying
them into the ESP, when building the pacman hook that refreshes them on
update, and when choosing the 64-bit EFI boot menu loader path.

Co-authored-by: Steev Klimaszewski <steev@parrotsec.org>
2026-07-24 21:30:54 +10:00
renovate[bot] 11e45aebeb
Update pre-commit hook astral-sh/ruff-pre-commit to v0.16.0 (#4660)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-24 12:31:30 +10:00
codefiles 4004593852
Refactor MirrorStatusEntryV3 field validator (#4661) 2026-07-24 10:01:03 +10:00
codefiles a68dcd6a28
Return bytes from fetch_data_from_url() (#4653) 2026-07-24 09:59:55 +10:00
renovate[bot] 639de7e953
Update dependency ruff to v0.16.0 (#4659)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-24 09:58:32 +10:00
codefiles 39e0fb39d2
Refactor MirrorStatusListV3 model validator (#4657) 2026-07-23 22:08:31 +10:00
codefiles ed388cab3f
Enable non-empty-init-module ruff rule (#4656) 2026-07-23 22:07:38 +10:00
codefiles 865ff3f65a
Make type field in lsblk required (#4655) 2026-07-23 22:07:05 +10:00
Softer 7fd4b4382b
Extract TUI binding descriptions into base.pot and translate raw widget bindings (#4587)
* Extract binding descriptions into base.pot and translate raw widget bindings (#4584)

xgettext only knew the tr keyword, so binding descriptions - translated
at runtime via tr(b.description) in _translate_bindings() - never made
it into base.pot. The strings added manually in #4363 were wiped by the
regeneration in #4557.

Teach the generator two more keywords: Binding:3 picks up our own
binding definitions, and tr_noop marks strings that only exist inside
the textual package, listed in the new tui/binding_descriptions.py.
The list walks the full MRO of the textual classes used in components.py,
since _translate_bindings() operates on the merged bindings map (e.g.
Scroll Up comes from ScrollView and carries live translations in 18
locales today).

Raw Input and Button widgets never went through _translate_bindings(),
so their help-panel descriptions stayed English regardless of .po
content - subclass them (_Input/_Button) following the _OptionList
pattern to make those translations real.

test_tooling/check_binding_descriptions.py verifies the list against
the installed textual after upgrades (manual, not wired into CI).

* Document key binding descriptions in the locales README
2026-07-23 13:02:22 +10:00
codefiles a633fc5d27
Use run for lsblk command (#4654) 2026-07-22 18:25:55 +10:00
codefiles 6dff8525fd
Remove unused format_cols (#4652) 2026-07-22 10:01:55 +10:00
renovate[bot] b7ad6f7514
Update dependency pre-commit to v4.6.1 (#4650)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-22 10:00:37 +10:00
renovate[bot] 05ceb5789f
Update actions/checkout digest to 3d3c42e (#4649)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-22 10:00:02 +10:00
Franco Castillo fc7dd17ebd
Update Spanish translation (#4651)
Signed-off-by: Franco Castillo <castillofrancodamian@gmail.com>
2026-07-22 09:41:26 +10:00
codefiles 2bf116030b
Fix too-many-statements-in-try-clause violations (#4648)
* Fix too-many-statements-in-try-clause violations

* Remove obsolete _wpa_cli comments

* Refactor _wpa_cli try block
2026-07-22 09:39:42 +10:00
renovate[bot] 389f4cfc64
Update actions/setup-python action to v7 (#4647)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-21 21:03:30 +10:00
Ksan 91d6d4dca1
Add Serbian translation (#4642) 2026-07-21 21:02:55 +10:00
codefiles 2f344a84ff
Remove redundant is_valid_path (#4646) 2026-07-21 20:50:56 +10:00
codefiles 2751716d2e
Set LANG to fully qualified locale name (#4645) 2026-07-21 20:44:10 +10:00
renovate[bot] b6d8fe25a1
Update dependency arch/python-markdown-it-py to v4.2.0 (#4644)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-21 20:39:28 +10:00
renovate[bot] b0bfb43661
Update dependency ruff to v0.15.22 (#4636)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-18 21:17:15 +10:00
renovate[bot] 39dbebf26c
Update pre-commit hook astral-sh/ruff-pre-commit to v0.15.22 (#4637)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-18 21:16:43 +10:00
Jonathan Pichel caff461f0b
Fix Galician locale (#4630)
* Sync Galician translation with template

* Delete all outdated Galician translation entries

* Improve Galician translation
2026-07-14 21:13:26 +10:00
Softer 01c9432afd
Use sentence case for summary labels (#4617)
str.title() title-cased every label word, which is wrong outside
English: it turned the Ukrainian "Ім'я хоста" into "Ім'Я Хоста" and
broke acronyms ("NTP" -> "Ntp"). The source strings and their
translations are already written with the correct casing.

Capitalize only the first letter of each label instead.
2026-07-14 21:12:53 +10:00