Add preview_markup opt-in field to MenuItem with automatic Rich markup
escaping for all existing previews. Show missing configs and bootloader
errors in red, network warning in yellow, "Ready to install" in green.
Move network warning from confirmation dialog to install preview so it
is visible earlier.
* Make network configuration mandatory with explicit "No network" option
* Add network configuration recommendation hint and disable sorting
* Warn when network selection was skipped instead of making it mandatory
Replace the mandatory network_config menu requirement with a yellow
warning on the final confirmation screen, shown only when the user
skipped the network menu entirely. Explicitly picking "No network
configuration" is treated as a conscious choice and does not trigger
the warning.
- Drop mandatory=True from the network_config global menu item
- Rename NicType.NONE menu label from "No network" to
"No network configuration" (an installed system still has an NIC;
only the install-time configuration is absent)
- Add ConfigurationOutput.get_install_warnings() and render them in
confirm_config when show_install_warnings=True
- guided.py and minimal.py enable the warning on the confirm screen
- Reuse the existing "No network configuration" msgid in .pot; add the
warning string; update Ukrainian translations accordingly
* Drop NicType.NONE from this PR
The NONE option introduced earlier in this branch is being removed per
review feedback (#4408). Whether to add explicit "None" options across
multiple menus (greeter, gfx driver, network, bootloader) is now being
discussed in #4464 and should land as a separate change there.
This PR keeps only the warning-on-confirm behaviour: when the user
skipped the network menu entirely (network_config is None), a yellow
warning is shown on the final confirmation screen.
* Show install summary when configuration is valid
Previously the Install menu preview was empty when everything was valid,
leaving the user with no "ready" signal. Now show "Ready to install"
plus a two-column summary of the current configuration.
- New _install_summary() composes an aligned key/value table with rows
for disks+FS+LUKS, bootloader, kernel, profile, greeter, package
count, network, locale and timezone. Column width adapts to the
longest translated label so translations keep the alignment.
- Rows whose underlying config is not set are skipped rather than
rendered as empty.
- base.pot / uk base.po: add new msgids for summary labels.
* Move install summary into ConfigurationOutput
The summary helper that renders the install preview's two-column
configuration overview lived in GlobalMenu. Move it to
ConfigurationOutput.as_summary() so it sits alongside the JSON
output methods that share the same role. The preview now syncs
menu state to ArchConfig and delegates rendering.
* Edit text menu
* Fix alignment
* Scroll functionality
* Fix flake8
* Migrate locales menu
* Fix language translation
* Fix interrupt
* Fix flake8
* Edit mode preset
* Convert print to tui prints
* Fix mypy
* Fix cycling through long menu
* Fix profile view
* Fix scrolling
* Fix scrolling
* Fix mypy
* Fix swiss script
* Display asterisk for passwords
* Corrected a variable usage in the local mirror parsing
* Made sure that curses menu selection on mirrors use url object from mirror.url instead of the class instance
* Fixed mypy type on mirror list
---------
Co-authored-by: Torxed <torxed@archlinux.org>
* fix: refactor clear_vt100_escape_codes
* fix: check for structure being a dict after handling potential parsing errors
* refactor: use short circuit logic than if-elif-else chains
* fix: use or for nullish moutpoint attribute
* fix: better error handling for JSON from urls and paths
* chore: json_stream_to_structure documentation
* refactor: dry up relative and chroot path for custom command scripts
* refactor: use write_text for pathlib.Path object
* refactor: use sets to find intersection instead of filter and list
* refactor: replace loop with dictionary comprehension in preparing luks partition
* refactor: use walrus operator to check if luks_handler exists
* refactor: use read_text and splitlines for potential Path object
* fix: use keepends in splitlines for compatibility
* fix: use keepends in splitlines for compatibility
* feat: set pacman_conf Path as an attribute of installer
* fix: empty string is a part of any string, avoid tuples
* refactor: use iterator patterns to uncomment multilib and testing blocks
* fix: don't json.loads an already loaded structure
* fix: use fstab_path uniformly in genfstab
* fix: remove unused variable matched
* refactor: create separate class to modify pacman.conf in a single pass
* fix: remove unused attribute pacman_conf from installer
* fix: remove unused attribute pacman_conf from installer
* feat: add persist method for pacman.conf, rewrite only when needed
* fix: use path.write_text for locale.conf
* use `or` operator for nullish new_conf
* refactor: Installer.target is always a pathlib.Path object, do not check for string type
* fix: use Optional[str] in function type definition instead of sumtype of str and None
* fix: mypy type annotation
* fix: make flake8 happy
* chore: move pacman config and repo into pacman module
* refactor: use Pacman object instead of Installer's pacstrap method
* fix: break after first sync
* fix: keep old build script for now
* use nullish operator for base_packages and disk_encryption of Installer
* feat: use shutil.which instead of rolling our own implementation
* fix: check for binary only if list is not empty
* fix: import Enum and fix mypy errors
* refactor: use nullish operator for default values
* refactor: linear search for key in Installer._trace_log only once
* fix: use logs instead of the entirety of self._trace_log when searching for key
* refactor: do not copy slice of bytes for search
* refactor: use rfind only once to iterate over logs, do not raise ValueError in clear_vt100_escape_codes since TYPE_CHECKING will take care of it.
* refactor: try decoding trace log before falling back to strigification
* refactor: use an empty dict as default for callbacks in SysCommand.__init__
* refactor: use nullish or operator for slice start and end when not specified
* refactor: use nullish or operator for SysCommand session
* refactor: use pre-existing decode method in __repr__ for SysCommand
* fix: overindentation
* fix: use shallow copy of callbacks to prevent mutating the key-value relationships of the argument dict
* refactor: use truthy value of self.session is not None for json encoding SysCommand
* refactor: directly assign to SysCommand.session in create_session since it short circuits to True if already present
* refactor: use dict.items() instead of manually retrieving the value using the key
* refactor: user_config_to_json method sounds pretty self explanatory
* refactor: store path validity as boolean for return
* refactor: use pathlib.Path.write_text to write configs to destinations
* fix: cannot use assignment expressions with expression
* fix: use config_output.save for saving both config and creds
* refactor: switch dictionary keys and values for options to avoid redundancy
* refactor: use itertools.takewhile to collect locale.gen entries until the empty line
* refactor: use iterative approach for nvidia driver fix
* refactor: install packages if not nvidia
* refactor: return early if no profile is selected
* refactor: use strip to remove commented lines
* fix: install additional packages only when we have a driver
* fix: path with one command is matched as relative to '.'
* fix: remove translation for debug log
---------
Co-authored-by: Anton Hvornum <anton@hvornum.se>
* align with newly merged master
* retry save config
* fix mypy error with str type - this menu with allows return a string
* Removed unused import
---------
Co-authored-by: Anton Hvornum <anton@hvornum.se>
* Save encryption configuration
* Fix deserialization problem
* Added .part_uuid to MapperDev
---------
Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
Co-authored-by: Anton Hvornum <anton@hvornum.se>
Co-authored-by: Anton Hvornum <anton.feeds+github@gmail.com>
* Changed permissions on the logs stored in /var/log/archinstall. Also cleaned up one of the saves to have the same syntax as the others
* Tweaked secondary encryption password detection logic, as it wouldn't take it from the main arguments[] otherwise.
* Changed permission on cmd_output.txt
* Changed permission on cmd_history.txt
* Added a HSM menu entry, but also a safety check to make sure a FIDO device is connected
* flake8 complaints
* Adding FIDO lookup using cryptenroll listing
* Added systemd-cryptenroll --fido2-device=list
* Removed old _select_hsm call
* Fixed flake8 complaints
* Added support for locking and unlocking with a HSM
* Removed hardcoded paths in favor of PR merge
* Removed hardcoded paths in favor of PR merge
* Fixed mypy complaint
* Flake8 issue
* Added sd-encrypt for HSM and revert back to encrypt when HSM is not used (stability reason)
* Added /etc/vconsole.conf and tweaked fido2_enroll() to use the proper paths
* Spelling error
* Using UUID instead of PARTUUID when using HSM. I can't figure out how to get sd-encrypt to use PARTUUID instead. Added a Partition().part_uuid function. Actually renamed .uuid to .part_uuid and created a .uuid instead.
* Adding missing package libfido2 and removed tpm2-device=auto as it overrides everything and forces password prompt to be used over FIDO2, no matter the order of the options.
* Added some notes to clarify some choices.
* Had to move libfido2 package install to later in the chain, as there's not even a base during mounting :P
* Add new save config menu option
* Update
* Fixed issue with merging
* Fixed merge issue (I think)
Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
Co-authored-by: Anton Hvornum <anton.feeds@gmail.com>
* Created a standard function to show/save the config parameters
* flake8 complains
* Correct definition of btrfs standard layout
* Solve issue #936
* Moved output_configs to lib/configuration.py