Tags

Tags give the ability to mark specific points in history as being important
  • 3.11.1

    130b89d3 · Prepare 3.11.1 release ·
    Release 3.11.1
    
    Oliver Smith (2):
          pmb.parse: DeviceinfoSchema: remove broken @Cache
          Prepare 3.11.1 release
    
    Stefan Hansson (1):
          docs: Add stability policy
    
  • 3.11.0

    ba9ddd21 · Prepare 3.11.0 release ·
    Release 3.11.0
    
    Thanks to everybody who contributed to this release!
    
    Aelin (23):
          pmb.config: Set correct permissions on /dev/random and /dev/urandom
          pmb.core: Default to 512MB for /boot
          envkernel: Run envkernel.sh with bash
          envkernel: Strip alias prefix from aliases
          pmb.commands.qemu: Allow booting any device package in QEMU
          pmb.core.arch: 32-bit capable aarch64 CPUs can run armhf
          pmb.core.arch: Fix-up armhf emulation logic
          pmb.build: Make strict the default behavior
          pmb.build: Use the best provider to resolve a dependency
          pmb.build: Set PMB_CROSS when building a package
          pmb.build: Don't traverse subpackage depends
          pmb.build.other: Check enabled architectures before binary repo
          envkernel: Install pahole
          pmb.parse.kconfig: Support integer values
          pmb.install: Re-initialize native chroot if zapped by package builds
          pmb.chroot.shutdown: Don't remove in-pmbootstrap marker from rootfs when zapping buildroots
          pmb.commands.build: Don't zap chroots when packaging with envkernel
          pmb.build: Improve and fix Rust cross compilation
          pmb.build.kconfig: Always pass defconfig if _defconfig is unset
          pmb.chroot.shutdown: Fix the check for the rootfs marker
          pmb.helpers.pmaports: Remove legacy channel translation
          pmb.parse.deviceinfo: Add deviceinfo schema parsing helpers
          pmb.install: Get default boot filesystem from deviceinfo schema
    
    Aster Boese (11):
          pmb.aportgen: generate gcc packages with the "toolchain" option
          pmb.config: don't install build-base
          pmb.build: fix installing native compilers
          Revert "pmb.config: don't install build-base"
          pmb.build: set HOSTLDFLAGS when building with LLVM
          pmb.aportgen: make device APKBUILD match output of newapkbuild and cleanup
          pmb.config: remove pmb:systemd-never support
          pmb: explicitly support systemd and openrc
          pmb.config: support legacy pmb:systemd option
          pmb.helpers: add function to validate UI package options
          pmb.helpers: remove reference to pmb:systemd
    
    Clayton Craft (4):
          pmb.helpers.run_core: fix fd leak in foreground_pipe()
          pmb.aportgen: gcc: support multiple host archs for cross compilers
          pmb.chroot.apk: fix locally built pkgs causing conflicts during install
          test.chroot.test_apk: add regression test for locally built pkg provider conflict
    
    Jakob Hauser (1):
          pmb.commands.qemu: Remove function "create_gdk_loader_cache"
    
    Oliver Smith (18):
          pmb.config.apk_tools_min_version: update for v26.06
          pmb.helpers.args: Pmbootstrap -> pmbootstrap
          pmb.helpers.logging: fix duplicate pmb in argv log
          pmb.build.package: use NonBugError for --src error
          pmb.build.package: move --no-depends check
          pmb.helpers.args: fix build --no-depends
          CI: add no_depends_build integration test
          pmb.commands.repo_missing: remove --built argument
          pmb.build.package: better msg for --no-depends err
          pmb.build: tweak zapping buildroots message
          Revert "pmb.build: fix installing native compilers"
          pmb.install.format: set bytes-per-inode to 8192
          pmb.build: run linux32 where needed
          pmb.install: wait for each loop subpartition
          pmb.helpers.file.wait_until_exists: wait for 15s
          pmb.commands.qemu: fix mypy error
          Update Casey's name
          pmb.config.other.is_systemd_selected: remove Cache
    
    Pablo Correa Gómez (18):
          pmb.parse.apkindex: mark "parse_next_block" as private
          pmb.parse.apkindex: don't use elif not when we have a boolean
          pmb.parse.apkindex: replace alias variable with provide
          pmb.install._install: remove unused "cat" invocation
          pmb.helpers.apk: remove recursive call to "update_repository_list"
          pmb.helpers.apk: remove unused argument from "update_repository_list"
          pmb.helpers.repo: reorder some logic to simplify understanding
          pmb.helpers: rename repo.urls to repo.get_repos_from_config
          pmb.helpers.repo: fix type in get_repos_from_config
          pmb.chroot.apk: don't add repositories
          pmb.helpers.apk: don't write repo outside hierarchy to repositories file
          pmb.helpers.apk: don't cache update_repository_list
          pmb.helpers.package: remove unused replace_subpkgnames option
          pmb.helpers.package: don't check for recursive dependencies in other arches
          pmb.helpers.package: remove unused try_other_arches option
          pmb.helpers.ui: only check for arches enabled in pmaports
          pmb.helpers.package: remove check_arch
          pmb.helpers.package: simplify get logic
    
    Paul Adam (12):
          pmb: Migrate install away from legacy frontend
          pmb: Remove args from create_zip
          pmb: Remove args from install_recovery_zip
          pmb: Remove args from install_system_image
          pmb: Remove args from _install
          pmb: Remove args from install
          pmb: move _parse_suffix to commands/__init__
          pmb: Remove deprecated command format logic
          pmb: Remove args from _parse_suffix
          pmb: Use getattr more sensibly in _parse_suffix
          pmb.parse: Fix parsed arguments being typecasted
          pmb: Use getattr more sensibly in flasher
    
    Radnos (1):
          pmb.flasher.frontend: fix header_version error msg
    
    Sicelo A. Mhlongo (1):
          pmb.install._install: Make setup-keymap step succeed
    
    Sonya Sireneva (1):
          aportgen/gcc: provide cmd:$CTARGET-gcc
    
    Stefan Hansson (66):
          pmb.flasher: Update deviceinfo reference links
          pmb.commands: Clean up imports
          pmb.flasher.variables: Fix fastboot variable used in mtkclient block
          pmb.flasher.variables: Default to "vendor_boot" in mtkclient too
          pmb.aportgen.device: Catch RuntimeError in ask_for_bootimg()
          pmb.config.init: Only catch exceptions that mkdir() normally raise
          pyproject.toml: Remove blanket ignore for BLE001
          pmb: Replace multiple print statements with single one
          pmb.flasher.run: Reformat strings
          pmb.helpers.apk_static: Use pathlib for sigkey_path
          pmb: Use NonBugError for "don't run pmbootstrap as root"
          pmb.chroot.initfs: Remove unreachable code
          pmb.aportgen: Remove os import from __init__.py
          pmb.helpers.device: Remove unnecessary _ matches
          pmb.aportgen: Return generated aport path
          pmb.config.init: Rework device handling
          pmb.config.init: Avoid device_category possibly being undefined
          pmb.build.kconfig: Be less clever about avoiding repetition
          pyproject.toml: Enable "possibly-undefined" error code for mypy
          pmb.config.init: Use NamedTuple for ask_for_device()
          CI: Build lk2nd for cross-native test
          pmb.helpers.git: Also consider "master" to be an official branch
          pmb.parse.apkindex: Remove redundant cast
          pyproject.toml: Set warn_redundant_casts = true for mypy
          pyproject.toml: Set warn_unused_ignores = true for mypy
          test.helpers.test_git: Add test for branch_looks_official()
          envkernel: Warn if building U-Boot with LLVM
          pmb.helpers: Mark uses of hashlib with usedforsecurity=False
          pyproject.toml: Enable S3 rules
          pmb: Replace assertions with exceptions
          pyproject.toml: Enable all S (Bandit) rules
          pmb.parse.deviceinfo: Add FIXME about test-specific code
          pmb.parse.cpuinfo: Use open() method from pathlib
          pmb.commands.qemu: Remove broken code
          pmb.helpers.run: Add overloads for user()
          pmb.helpers.run: Remove unnecessary assertion
          pmb.helpers.git: Remove dead code from get_topdir()
          pmb.build: Remove unused BootstrapStage re-export
          pmb, test: Refer to canonical ApkindexBlock module
          pmb.commands.stats: Refer to canonical Arch module
          pmb.helpers.run_core: Explicitly import which_sudo()
          pmb.parse.kconfigcheck: Improt load_toml_file from canonical path
          pyproject.toml: Set no_implicit_reexport = true for mypy
          pmb: Remove dead code
          pmb.parse.apkindex: Add overload for package()
          pmb.commands.sideload: Allow installing local apks
          pmb: Make WithExtraRepos an enum
          pyproject.toml: Ignore RUF076 in conftest files
          pmb.install._install: Inline setup_timezone()
          pmb.commands.install: Validate that password is not empty
          pmb.install.partition: Remove extra "M"
          pmb.commands.sideload: Use SSH multiplexing
          pmb.commands.status: Move all related functions into module
          pmb.helpers.git: Improve channels.cfg typing
          pmb.commands.status: Add missing call to print_status()
          treewide: Format all shellscripts with shfmt
          CI: Add shfmt check
          pmb.helpers.file: Use pathlib
          pmb, test: Mark unused arguments as such for signature restrictions
          pmb.install._install: Remove unused arch argument from print_firewall_info()
          pmb.helpers: Fix --quiet not working
          pmb.commands.status: Remove unused config argument from print_channel()
          pmb: Remove references to qemu_video
          pmb: Remove --cmdline argument from qemu subcommand
          pyproject.toml: Enable "ARG" checks
          pmb: Remove --efi argument
    
    dabao1955 (1):
          pmb: Suggest --as-root when pmbootstrap is run as root
    
  • 3.10.3

    845cda03 · Prepare 3.10.3 release ·
    Release 3.10.3
    
    Aelin (2):
          envkernel: Run envkernel.sh with bash
          envkernel: Strip alias prefix from aliases
    
    Oliver Smith (1):
          pmb.config.apk_tools_min_version: update for v26.06
    
    Pablo Correa Gómez (1):
          pmb.install._install: remove unused "cat" invocation
    
    Stefan Hansson (4):
          pmb: Use NonBugError for "don't run pmbootstrap as root"
          CI: Build lk2nd for cross-native test
          pmb.helpers.git: Also consider "master" to be an official branch
          Prepare 3.10.3 release
    
    dabao1955 (1):
          pmb: Suggest --as-root when pmbootstrap is run as root
  • 3.10.2

    021ed2f5 · Prepare 3.10.2 release ·
    Release 3.10.2
    
    Aelin (1):
          pmb.config: Set correct permissions on /dev/random and /dev/urandom
    
    Aster Boese (1):
          pmb.aportgen: generate gcc packages with the "toolchain" option
    
    Clayton Craft (1):
          pmb.helpers.run_core: fix fd leak in foreground_pipe()
    
    Stefan Hansson (4):
          pmb.flasher: Update deviceinfo reference links
          pmb.flasher.variables: Fix fastboot variable used in mtkclient block
          pmb.flasher.variables: Default to "vendor_boot" in mtkclient too
          Prepare 3.10.2 release
  • 3.10.1

    a72d80ee · Prepare 3.10.1 release ·
    Release 3.10.1
    
    Casey Connolly (1):
          aportgen: correct carch string when generating kernel package
    
    Max Harmathy (1):
          pmb.qemu.run: Install efi image unconditionally for qemu
    
    Stefan Hansson (13):
          pmb.parse.arguments: Add missing choices parameter for sideload arch
          pmb.types: Properly type action_kconfig
          pmb: Make match statements exhaustive
          pmb: Add error code to all type error ignores
          pyproject.toml: Enable various mypy error codes
          CI: Add newapkbuild test
          pmb: Add additional overload for root()
          pmb: Remove pigz zombie code
          CI: Run mypy if any Python file has changed
          pmb.commands.qemu: Clean up host executable not found error
          pmb.commands.qemu: Log that postmarketOS is running after installing EFI
          pmb.build.autodetect: Remove arch from deviceinfo logic
          Prepare 3.10.1 release
  • 3.10.0

    6ccc1cb9 · Prepare 3.10.0 release ·
    Release 3.10.0
    
    Aelin (4):
          pmb.qemu: Remove support for direct kernel boot
          pmb.build: If clang is used, don't install GCC
          pmb.qemu: Remove QEMU dep handling for Alpine 3.12
          pmb.sideload: Fix sudo detection
    
    Anri Dellal (1):
          pmb.helpers.ui: Do not fail if UI APKBUILD is missing
    
    Aster Boese (5):
          pmb.chroot.init: bootstrap the bin-merge by creating symlinks
          gitlab-ci: change ci-common pull from master to main
          pmb: add run0 support
          docs: add run0 support to documentation
          treewide: replace 'master' strings with 'main'
    
    Casey Connolly (2):
          remove ondev support
          pmb.build.autodetect: Use cross-native2 for noarch packages
    
    Clayton Craft (1):
          pmb.helpers.run_core: fix 100% cpu busy loop
    
    Gregory Kietzman (2):
          pmb.install: Fix broken parameters
          pmb.parse, pmb.helpers: Fix docstrings
    
    Hugo Osvaldo Barrera (2):
          pmb.helpers.aportupgrade: remove obsolete command
          docs: explain how to install keys for mirrors
    
    Hugo Posnic (5):
          pmb: Migrate status away from legacy frontend
          pmb: Migrate update away from legacy frontend
          pmb: Migrate initfs away from legacy frontend
          pmb: Migrate work_migrate away from legacy frontend
          pmb: Migrate repo_missing away from legacy frontend
    
    Newbyte (1):
          pmb: Remove lint subcommand
    
    Pablo Correa Gómez (9):
          pmb.helpers.package: do not add packages to the queue that are already there
          pmb.helpers.package: use sets for queue and ret in depends_recurse
          pmb.helpers.package: do not queue providers of packages we have seen
          test.helpers.test_package: add test for remove_operators
          pmb.helpers.pmaports: make check_version_constraints more generic
          pmb.helpers: move check_version_constraints from pmaports to package
          pmb.helpers.package: also track the original names of the packages
          pmb.helpers.package: remove unused import
          pmb.parse.apkindex: only select provider if it matches constraints
    
    Paul Adam (7):
          docs: fix order of command modules
          pmb: Migrate stats away from legacy frontend
          pmb: Migrate build_init away from legacy frontend
          pmb: Migrate newapkbuild away from legacy frontend
          pmb: Migrate apkindex_parse away from legacy frontend
          pmb: Migrate bootimg_analyze away from legacy frontend
          pmb: Migrate chroot away from legacy frontend
    
    Rakshit Kumar Singh (1):
          pmb: Migrate apkbuild_parse away from legacy frontend
    
    Rudraksha Gupta (1):
          pmb.qemu.run: Add armv7 display support
    
    Stefan Hansson (143):
          pmb.helpers.pkgrel_bump: Remove unnecessary type check
          pmb.parse.kconfigcheck: Simplify get_path()
          pmb.config.init: Simpify ask_for_work_path() using is_relative_to()
          pmb.config.init: Avoid unnecessary string concatenation in get_locales()
          pmb.config.pmaports: Modernise check_version_pmbootstrap() using pathlib
          pmb.parse._apkbuild: Remove attr-defined disable
          pmb.chroot.initfs_hooks: Rename list_aports() to list_hook_packages()
          pmb.chroot.initfs_hooks: Use NonBugError
          envkernel: Add better hint if installing build dependencies fails
          pmb.helpers: Raise CommandFailedError on failed command
          pmb.helpers.frontend: Handle CommandFailedError in chroot()
          pmb.install._install: Use NonBugError for nonexistent kernel
          pmb: Introduce PackagingError
          pmb.chroot.initfs: Use PackagingError if mkinitfs fails
          pmb: Guess checksum package based on cwd if none is specified
          pmb.chroot.apk: Replace Sequence and list with Collection in inputs
          pmb.build._package: Don't needlessly turn set into list
          pmb.chroot.initfs_hooks: Print hook descriptions when listing them
          pmb.aportgen.core: Try to be more helpful on nonexistent aport
          pmb.install._install: Remove args from setup_login_chpasswd_user_from_arg()
          pmb.install._install: Remove args from setup_login()
          pmb.install._install: Remove args from print_sshd_info()
          pmb.install._install: Remove args from generate_binary_list()
          pmb.install._install: Remove args from embed_firmware()
          pmb.install._install: Remove args from write_cgpt_kpart()
          pmb.install._install: Remove args from sanity_check_disk()
          pmb.install._install: Remove args from sanity_check_disk_size()
          pmb.install._install: Remove args from get_ondev_pkgver()
          pmb.install._install: Remove args from sanity_check_ondev_version()
          pmb.install._install: Remove args from create_fstab()
          pmb.install.format: Remove args from format()
          pmb.install._install: Remove args from get_selected_providers()
          pmb.install._install: Remove args from get_recommends()
          pmb.install._install: Remove args from create_device_rootfs()
          pmb.qemu.run: Remove args from create_second_storage()
          pmb.qemu.run: Remove args from install_depends()
          pmb.qemu.run: Remove args from create_gdk_loader_cache()
          pmb.types: Remove qemu_redir_stdio from PmbArgs
          pmb.types: Make PmbArgs.port an int
          pmb.types: Add memory to PmbArgs
          pmb.args: Make some arguments optional
          pmb.qemu.run: Remove PmbArgs
          pmb.export.frontend: Remove PmbArgs from frontend()
          pmb.sideload: Remove PmbArgs from ssh_install_apks()
          pmb.sideload: Remove PmbArgs from ssh_find_arch()
          pmb.sideload: Remove PmbArgs from scp_abuild_key()
          pmb.sideload: Remove PmbArgs from sideload()
          pmb.chroot.initfs: Refactor frontend()
          pmb.helpers.repo_missing: Simplify generate()
          pmb.commands: Use functions intead of classes for most commands
          pmb.build._package: Catch CommandFailedError when build fails
          pmb: Migrate sideload away from legacy frontend
          pmb.meta: Simplify build_key() slightly
          pmb.build._package: Fix instance of cross compile literal
          pmb.helpers.mount: Fix str being compared to Path
          pmb.install.format: Fix sector_size comparison
          pyproject.toml: Set strict_equality = true
          pmb.parse.deviceinfo: Remove validation code
          pmb, test: Remove references to deviceinfo_external_storage
          pmb: Migrate export away from legacy backend
          pmb.parse.deviceinfo: Trim down Deviceinfo class docstring
          pmb: Migrate netboot away from legacy frontend
          pmb.aportgen.core: Properly type replace_simple in rewrite()
          pmb: Migrate build away from legacy frontend
          pmb.helpers.git: Fix infinite loop in get_changed_packages()
          pmb.build.autodetect: Remove dead code
          pmb.helpers.git: Fix always False expression
          pmb.types: Mark disk as optional in PmbArgs
          pmb.install._install: Ignore truthy-bool error in setup_appstream()
          pmb.commands.export: Fix rootfs export hint never appearing
          pyproject.toml: Enable "truthy-bool" error code for mypy
          pmb.build.autodetect: Fix automatic arch detection
          pmb: Migrate checksum away from legacy frontend
          pmb.helpers.logging: Avoid undocumented logging.WARN
          pmb.chroot.test_apk: Remove unnecessary return statement
          pmb.commands.test: Use from keyword to import logging
          pmb.parse.arguments: Simplify package_completer()
          pmb.parse.kconfig: Avoid redundant exception naming
          pmb.parse.arguments: Simplify arguments_status()
          pmb.install.losetup: Avoid redundant exception naming
          pmb.build._package: Simplify get_depends()
          pmb.build._package: Remove unncessary global declaration
          pmb.build.envkernel: Avoid redundant exception naming
          pmb: Use sys.exit() instead of exit()
          pmb.commands.netboot: Avoid redundant exception naming
          pmb.commands.sideload: Simplify ssh_find_arch()
          pmb.core.arch: Remove unncessary global declaration
          pmb.core.chroot: Use dict to avoid repeated equality comparison
          pmb.core.context: Remove unncessary global declaration
          pmb.helpers.other: Simplify folder_size()
          pmb.helpers.pmaports: Simplify _find_apkbuilds()
          pmb.helpers.repo: Avoid redefining "arch" variable
          pmb.helpers.repo_missing: Simplify generate()
          pmb.install._install: Replace if ... else with match
          pmb.install.format: Use dict to avoid repeated equality comparison
          pyproject.toml: Ignore more rules
          pmb.parse.apkindex: Don't bother checking if provides is None
          pmb.build.kernel: Don't bother checking if Match.groups() is None
          pmb.types: Mark name in PmbArgs as optional
          pmb.parse.deviceinfo: Update name validation comment
          pmb.parse.deviceinfo: Make InitfsCompression.from_str() never return None
          pmb.parse.deviceinfo: Reduce setattr() use in Deviceinfo.__init__()
          pmb: Migrate zap away from legacy frontend
          pmb: Migrate qemu away from legacy frontend
          pmb.parse.kconfig: Error on kconfig option not being set correctly
          pmb.commands.kconfig: Raise NonBugError on failed validation
          pmb.core.package_metadata: Use annotations from __future__
          pyproject.toml: Set pretty = true for mypy
          pyproject.toml: Set strict_bytes = true for mypy
          pmb.types: Mark sparse in PmbArgs as optional
          pmb.install._install: Don't bother checking if config.keymap is None
          pmb.types: Mark value in PmbArgs as optional
          pmb.config.other: Don't bother checking if check_option() returns None
          pmb.install.recovery: Remove flavoured initfs compatiblity
          pmb.build._package: Explicitly annotate cross and prev_cross
          test.core.test_arch: Generalise alpine_triple() assert
          test.config.test_config_serde: Generalise config.mirrors assertion
          pmb.core.chroot: Ignore comparison overlap for deviceinfo arch
          pmb.install: Refactor args.split
          pyproject.toml: Set strict_equality_for_none = true for mypy
          pmb.commands.build: Clean up some strings
          pmb.commands.config: Fix type hint
          pmb.install.blockdevice: Use Path.replace()
          pmb.helpers.frontend: Ask for password early with getpass()
          pmb.install: Mount disk early
          pmb.install._install: Simplify setup_timezone()
          pmb.helpers.args: Replace constant attribute delattr() with del keyword
          pmb.chroot.zap: Improve error message if a chroot fails to umount
          pmb.parse.apkindex: Improve overloads for parse()
          pmb.config.init: Remove unreachable return statement
          pmb: Fix apkindex_parse command
          pyproject.toml: Set warn_unreachable = true for mypy
          pmb.commands: Mark newapkbuild as migrated
          pmb.commands: Use args.package for apkindex_parse
          CI: Add APKINDEX parsing integration test
          pmb.install._install: Re-add disk argument to install_system_image()
          pmb.commands.apkindex_parse: Remove redundant type check
          pyproject.toml: Set local_partial_types = true for mypy
          pmb.helpers.ui: Actually skip UI directories without APKBUILDs
          pmb.parse.kconfig: Don't bother catching RuntimeError for read_categories()
          pmb.install._install: Avoid using undefined variable in exception handler
          pmb.helpers.git: Fix MissingSectionHeaderError handling
          Prepare 3.10.0 release
    
    Yohan Boniface (1):
          pmb: migrate config command away from legacy frontend
    
    kersnazzle kersnazzle (1):
          pmb: Migrate ci away from legacy frontend
    
  • 3.9.0

    888d8b4a · Prepare 3.9.0 release ·
    Release 3.9.0
    
    Headline features:
    * pmb.aportgen.device: Don't require chassis
    * pmb.export.symlinks: add "*.dtb" glob symlinks
    * pmb.install: add XFS filesystem support
    * pmb.kconfig: Allow matching on multiple categories for entries
    * pmb.kconfig: Generate generic kconfig fragment from kconfig-generic.toml
    * pmb.parse.deviceinfo: Don't require chassis
    * pmb: Add --changed argument to checksum subcommand
    
    Features:
    * maintainers.txt: add Aelin
    * maintainers.txt: move from Projects wiki table
    * pmb.commands.kconfig: Use Path instead of string for self.file
    * pmb.helpers.git: Add utilities for getting changed packages and files
    
    Fixes:
    * Added changes rule to deploy-docs
    * flasher/frontend.py: fix "The recovery zip has not been generated yet"
    * pmb, test: Format docstrings consistently with D2 Ruff rules
    * pmb.aportgen.core: Add empty maintainer variable
    * pmb.aportgen.core: Remove empty lines in header
    * pmb.commands.kconfig: Conditionally construct path from args.file
    * pmb.helpers.args: make `--no-ccache` actually work
    * pmb.helpers.other: Check for 0-character hostnames in validate_hostname()
    * pmb.install.format: fix xfs mkfs command
    * pmb.parse.deviceinfo: Fix deviceinfo_drm being a str rather than a bool
    * pmb.types: Fix type hint for PmbArgs.file
    * pmb/install/format: f2fs: Add recommended robustness options
    * pmb: Fix whitespace in docstrings
    * pyproject.toml: Don't ignore FURB101
    * pyproject.toml: Don't ignore FURB103
    * pyproject.toml: Use ignore instead of extend-ignore
    
    Other:
    * pmb.build.kconfig: Modernise using pathlib
    * pmb.config.init: Clean up a string
    * pmb.config.init: Modernise ask_for_mirror() using pathlib
    * pmb.config.init: Modernise ask_for_work_path() with pathlib
    * pmb.export.symlinks: rename target directory to "target"
    * pmb.helpers.other: Clean up some strings
    * pmb.helpers.other: Modernise migrate_success() using pathlib
    * pmb.helpers.other: Modernise migrate_work_folder() using pathlib
    * pmb.helpers: Remove __init__.py
    * pmb.install._install: Modernise sanity_check_disk(), sanity_check_disk_size() using pathlib
    * pmb.install._install: Modernise setup_locale() using pathlib
    * pmb.install._install: Modernise setup_login_chpasswd_user_from_arg() using pathlib
    * pmb.install.format: consolidate mkfs formatting into a function
    * pmb.install.format: Modernise format_luks_root() using pathlib
    * pmb.parse.bootimg: Modernise bootimg() using pathlib
    * pmb.parse.kconfig: Modernise check_config(), extract_arch() using pathlib
    * pmb.parse.test_apkbuild: Modernise using pathlib
    * pmb: Enable B checks
    * pmb: Enable I checks
    * pyproject.toml: Ignore RUF067 for now
    * test.helpers.test_other: New test
    * test.parse.test_bootimg: Modernise using pathlib
  • 3.8.0

    747951d7 · Prepare 3.8.0 release ·
    Release 3.8.0
    
    Features:
    * pmb.chroot: set up PTY support and std I/O nodes
    * pmb.qemu.run: Add armv7 support
    
    Fixes:
    * kconfigcheck: fix x64_64 typo
    * pmb.helpers.pmaports: skip provider search when subpkg definition is empty
    
    Other:
    * README.md: Document required git version
    * pmb.config.pmaports: automatically switch pmaports branch from master to main
    
  • 3.7.0

    da52a5d6 · Prepare 3.7.0 release ·
    Release 3.7.0
    
    Features:
    * envkernel: Add --llvm flag to use LLVM
    * kconfig: Reintroduce command line argument to check for categories
    * pmb.install: Support PowerPC PReP boot partitions
    * pmb.qemu: Support booting with OpenFirmware
    * pmb.helpers.run_core: Better handle invalid timeout values
    * pmb.build.kconfig: Use LLVM for kconfig where applicable
    * setup_keymap: support systemd
    * kconfig: print option value pref. in warning about missing config
    * pmb.shutdown: Add timeout to kill request sockets
    * pmb: Make command timeout opt-in
    * pmb.build.kconfig: add a "generate" cmd to build kconfig from fragments
    * pmb.build.kconfig: edit: add kernel fragment support
    * pmb.aportgen: Add empty maintainer fields to generated APKBUILDS
    * pmb.aportgen.device: Add postmarketos-base-downstream by default if relevant
    * pmb.config.init: Automatically switch to Edge if creating a new port
    * envkernel: Add support for RISC-V
    * pmb.build: Support architecture-specific fragments
    * pmb.qemu: Add UEFI support on RISC-V
    * envkernel: Make LLVM the default
    * pmb: Parse supported binary architectures from pmaports.cfg
    * pmb: Default PMB_APK_FORCE_MISSING_REPOSITORIES=1 on unsupported binary architectures
    * pmb.config.init: Rewrite message for new port creation
    * pmb.aportgen.linux: Add mainline kernel aport generation
    * pmb.config: add provider select prompting for pmos-usb-moded
    * pmb.parse._apkbuild: Add support for parsing maintainer fields
    * envkernel: Install required packages for Rust
    * pmb.parse.kconfigcheck: check correctness of arches
    
    Fixes:
    * Honor version constraints in makedepends
    * kconfig: strip quotes when checking string values
    * kconfig: refactor tristate value checking
    * pmb.config.init: Gracefully handle there not being any providrs for _pmb_select
    * pmb: Remove execute bit from config file mode
    * pmb.install: Fix `Unable to find the first partition of /dev/loop0`
    * pmb.parse.bootimg: Fix crash with non-default Exynos QCDT values
    * pmb.aportgen: Use NonBugError to inform that there is no generator
    * pmb.config.init: Use NonBugError for nonexistent devices
    * pmb.parse.deviceinfo: Use NonBugError for nonexistent devices
    * envkernel: enable word splitting for zsh
    * pmb: Fix kernel architecture logic
    * pmb.build: arch=all is not a single architecture
    * pmb.build.kconfig: Hardcode native chroot even more
    * pmb.helpers.git: Make upstream remote finding more robust
    * sideload: skip unnecessary apkindex updates
    * pmb.build: Fix bootstrap of systemd repo
    * pmb.parse: Don't prefer exact package match over other providers
    * pmb.chroot.apk: Reduce repetition in apk package check
    * pmb.build.envkernel: Use NonBugError for invalid package count
    * pmb.helpers.repo: Skip nonexistent APK indexes
    * pmb.core.context: Re-enable ccache by default
    * pmb.aportgen: Use NonBugError for cancelling an overwrite
    * pmb.build.init: Initialise chroot when initialising compiler
    * pmb.config.workdir: Use NonBugError for channel mismatch message
    
    Other:
    * pmb.arch: Differentiate between qemu-user and qemu-system names
    * pmb.parse.cpuinfo: Allow overriding cpuinfo path
    * test.parse.test_cpuinfo: New test
    * pmb: Remove unused imports
    * kconfig: soften the INFO msg for preferred kconfig option values
    * pmb: Clean up some instances of type:ignore
    * kconfig: Rename components_list to categories
    * kconfig: Take base kconfig categories from function argument for check
    * pmb.install: Remove mentions of ondev-prepare-internal-storage.sh
    * docs: use new docs.postmarketos.org theme
    * docs: rework index page
    * docs: tweak headlines
    * gitlab-ci: deploy: trigger docs.postmarketos.org
    * docs: remove sphinxext.opengraph
    * docs: remove requirments.txt file
    * gitlab-ci: fix trigger on changes in docs dir
    * docs: remove the version number
    * docs: remove initial comments, duplicated info from theme
    * docs.conf: re-add extensions
    * .gitignore: Add mypyc section
    * pmb: Enable C4 checks
    * docs: use postmarketOS contributors in copyright, remove author
    * pmb.build: package: replace map() with generator expression
    * pmb.build: package: rewrite list literal as set literal
    * docs.conf: Reformat with Ruff
    * pmb.parse.bootimg: Improve type hints
    * test/pytest.ini: Remove
    * README.md: Add note about /tmp with noexec causing problems
    * pmb.aportgen: Get rid of AportGenEntry
    * pmb.aportgen: Clean up a string
    * pmb.aportgen: Use f-string for "no generator" error message
    * pmb.build.envkernel: Clean up some strings
    * test.build.test_envkernel: New test
    * pyproject.toml: Override default norecursedirs for Pytest
    * pmb.build.kconfig: allow bypassing .config check in get_outputdir
    * pmb.build.kconfig: allow passing outputdir into _make
    * pmb.build.kconfig: _make: accept a list of make commands
    * pmb.config: add _defconfig as valid apkbuild var
    * pmb.parse.kconfig: add function to generate a fragment from kccheck.toml
    * test.parse.test_kconfig_generation: new test
    * test.build.test_kconfig_fragments: new test
    * pmb.aportgen.device: Clean up some strings
    * pmb.qemu.run: Make sigterm_handler() private
    * pmb.config.pmaports: Add DEVELOPMENT_CHANNEL constant
    * pmb.parse.deviceinfo: Clean up nonexistent device string
    * pmb.config.init: Replace manual induction variable handling
    * test.helpers.test_git: Add test for remote_to_name_and_clean_url()
    * tests: add missing type annotation
    * ci: check all scripts with mypy
    * pmb/config: update apk_tools_min_version
    * pmb: Remove more instances of args
    * pmb.helpers.apk: Use Sequence instead of list in inputs
    * pmb.helpers.pmaports.find: simplify condition
    * pmb.aportgen.linux: Do not require kernel package name to match existing device
    * COMMITSTYLE.md: New file
    * pmb.helpers.apk: Remove action_msg argument from check_outdated()
    * test.parse.test_apkbuild_private: New test
    * pmb.aportgen.core: Skip maintainer fields too, not just comments
    * pmb.aportgen: Don't specify # Maintainer and # Contributor in rewrite() call
    * test: add check kconfigcheck sanity_check
    
  • 3.6.0

    e847f1a4 · Prepare 3.6.0 release ·
    Release 3.6.0
    
    Features:
    * pmb: Only disable metadata_csum for ext4 on downstream ports
    * bootimg: exynos: extract platform and subtype from dt.img header
    * aportgen: device: set bootimg_qcdt_exynos_{platform,subtype}
    * pmb.core.pkgrepo:pkgrepo_iter_package_dirs: speed up finding pkg dirs
    * pmb.config.init: Add warning for kernels supposedly not supported by systemd
    * pmb.config.init: Add check for recommended kernel version
    * pmb.parse.arguments: Default to 8 GB for --second-storage
    * chroot: make sure that we bootstrap the chroot /usr-merged
    * pmb: support bootimg v3/v4 and `vendor_boot`
    * envkernel: install gnutls-dev as well (for u-boot)
    * Add ppc64le to machine type mapping
    * pmb.ci: Add new "with-dot-git" option
    * pmb.arch: Check whether CPU is 32-bit capable
    * pmb.chroot.init: bootstrap the /usr-merge by creating symlinks
    * kconfig: support tristate values for options
    * Add PMB_CHANNELS_CFG environment variable
    * pmb: Add --shallow-initial-clone argument to init
    * pmb.parse.deviceinfo: Handle deviceinfo_initfs_compression
    * pmb.chroot.initfs: Support more compression formats
    * pmb, test: Use git switch instead of git checkout
    * pmb.aportgen: Ask whether a new device port is upstream or downstream
    * pmb: Add support for loongarch64
    * pmb.qemu: Allow using EFI on non-native architectures
    * pmb.qemu: Add support for loongarch64
    
    Fixes:
    * treewide: switch back to bootimg_qcdt{,_type}
    * aportgen: re-add bootimg_qcdt variable
    * Fix crash in "zap -a" and "zap -o" with apk3
    * Don't set esp flag for msdos boot partitions
    * pmb.parse._apkbuild: Use NonBugError for all errors
    * pmb: Also apply ext4 metadata_csum workaround for archived ports
    * pmb.chroot.mount: Fix pmb chroot --image for single-partition rootfs
    * pmb.chroot.initfs: Fix initfs commands
    * pmb.core.pkgrepo:pkgrepo_iter_package_dirs: allow following symlinks
    * package.get_depends: use makedepends_{build,host}
    * aportgen/gcc: don't remove cross prefix in package
    * aportgen/gcc: don't use tracedeps
    * test.core.test_chroot: fix on aarch64 hosts
    * pmb.build.kconfig: test cross type in conditions
    * pmb.flasher.variables: fix typo
    * Use SPDX identifier for busybox-static-* packages
    * pmb.build.package: re-run init_compiler in strict mode
    * Only do the usr merge for supported binary architectures
    * Revert "pmb.qemu: set default image size of 4G (!1886)"
    * pmb.helpers.frontend: Initialise chroot in stats()
    * fix(flasher): Support vendor boot for devices flashed with rkdeveloptool
    * pmb.install._install: Initialise chroot in install_recovery_zip()
    * pmb.flasher.init: Explicitly initialise chroot when installing depends
    * Fix /usr merge breaking stable branches
    * pmb: checksum: fail if verification fails
    * pmb.parse.deviceinfo: Correctly convert header_version to an int
    
    Other:
    * Revert "pmb.helpers.repo: Always update APKINDEX if it doesn't exist"
    * CI: Only run most pipelines when they actually are necessary
    * test: Move test_devices to where it should be
    * pmb.helpers.devices: Use get_device_category_by_directory_path()
    * CI: fix running deploy job on master
    * pmb.core.context: Properly type get_context()
    * docs: Add automodule for pmb.commands.test
    * CI: Skip removing files that start with test in docs check
    * Revert "pmb.config: add the full hexdump to the list of installed build packages (MR 2454)"
    * pmb: Make RunOutputTypeDefault and RunOutputTypePopen enums
    * test: aportgen: device: add tests for boot img with exynos qcdt
    * pmb: Use inspect.get_annotations()
    * pmb.helpers.locale: Mark XkbLayout.primary_locales as Final
    * CI: Add basic chroot test
    * CI: Only build packages on install in bump_autobuild job
    * initfs: drop support for initramfs flavor
    * export: drop support for initramfs flavor
    * pmb.config.init: Change warning texts
    * pmb/helpers/repo_missing: skip device/archived
    * Use standard `requires-python` field
    * pmb: Remove exception for RUF021
    * pmb: Remove exception for RUF052
    * aportgen/gcc: disable libsanitizer
    * pmb.chroot: drop custom usr-merge implementation
    * config.apkbuild_attributes: add _pkgrel
    * CI: run docs job with alpine stable
    * pmb: Use Arch type instead of str
    * docs: add POSIX-shell requirement
    * ci: trigger also on changes in docs
    * pmb: Enable Simplify checks
    * doc: link to rules for merging
    * .ci/pytest.sh: do not exit on first error or failed test
    * pmb: Make header_version an int in Bootimg and Deviceinfo
    * pmb, test: Add missing type annotations
    * pmb: Enable Perflint checks
    * pmb, tests: Enable Refurb checks
    * pmb.config.pmaports: Fix typo
    * pmb.helpers.args: Implement simplification found by SIM118
    * pmb.helpers.frontend: Deprecate 'pmbootstrap lint'
    * kconfig: Allow printing non-fatal warnings
    * pmb.chroot.initfs: Improve error handling and clean up code
    * CI: Add initramfs inspection test
    * pmb.parse.deviceinfo: Use __annotations__ from future instead of quoted type
    * pmb.parse.deviceinfo: Convert if ... else block to match
    * CONTRIBUTING.md: Suggest git switch instead of git checkout
    * aportgen: Move target folder handling logic from config to aportgen
    
  • 3.5.2

    799140da · Prepare 3.5.2 release ·
    Release 3.5.2
    
    I forgot to bump the version in the code, so pmbootstrap 3.5.1 would
    still report itself as version 3.5.0. This release fixes that and only
    that.
    
    Fixes:
    * Prepare 3.5.2 release
  • 3.5.1

    Release 3.5.1
    
    Emergency release to fix compatibility with apk v3!
    
    Fixes:
    * pmb: drop unused import
    * pmb.helpers.apk: fix crash computing progress from apk3
    * pmb.helpers.apk_static: fix version check for apk3
    * pmb.helpers.repo: Always update APKINDEX if it doesn't exist
    * pmb.helpers.apk_static: Update "malicious server" message
    * export: allow to export vmlinuz files which have any suffix
    
    Other:
    * export: drop support for flavor in export
    
    Tests:
    * test: add small test for argument parsing
  • 3.5.0

    562e6519 · Prepare 3.5.0 release ·
    Release 3.5.0
    
    Features:
    * pmb: Split devices by category during codename selection
    * pmb: Warn users about downstream ports
    
    Fixes:
    * pmb.helpers.logging: Fix type for args
    * pmb.qemu.run: fix x86_64 CPU check for EFI support
    * init: systemd: fix always switching pma to edge
    * pmb.aportgen.core: Initialize chroot properly
    
    Other:
    * pmb.helpers.pmaports: Clean up some strings
    * pmb.config.__init__: Add escape sequence for magenta text
    * pmb.config.apk_tools_min_version: add v3.22
    * pmb/helpers/other: fix typo found by codespell
    * Remove "pmbootstrap repo_bootstrap"
    * pmb.aportgen: Match aportgen prefixes explicitly
    * pmb.aportgen: Add default value to fork_alpine parameter
    
  • 3.4.2

    0c6de7ab · Prepare 3.4.2 release ·
    Release 3.4.2
    
    This release only fixes a minor bug introduced in 3.4.1 that broke QEMU
    EFI boot for x86-64.
    
    Fixes:
    * pmb.qemu.run: fix x86_64 CPU check for EFI support
  • 3.4.1

    5783d1c5 · Prepare 3.4.1 release ·
    Release 3.4.1
    
    This release primarily fixes an important bug related to cache handling
    for the find() function inside of pmb/helpers/pmaports.py. This bug
    could cause strange an unexpected behaviour in some circumstances.
    
    Fixes:
    * CONTRIBUTING.md, README.md: Use descriptive links
    * Revert "CI: ruff: use 0.11.0 (Cannot use star annotation)"
    * CI: fix coverage regex
    * pmb.arch: Add support for s390x
    * pmb.config.init: Use heapq for sorting timings
    * pmb.helpers.apk: Avoid concatenation
    * pmb.helpers.pmaports: Add must_exist to cache signature for find()
    * pmb.qemu.run: Use NonBugError for invalid device selection error
    
    Other:
    * ci: add test coverage to the GitLab UI
    * ci: only run integration tests when there are code changes
    * ci: only run markdown lint if markdown files are changed
    * pmb.qemu.run: use virgl on aarch64 hosts
    * pmb.qemu.run: add support for EFI on aarch64
    * pmb.qemu.run: command_qemu: refactor applying arch-specific options
    
    Docs:
    * docs/index: introduce local deploy example
    * docs/index: update local deploy example with pmb.ci
    * docs/mirrors: mention env variables example
  • 3.4.0

    aebf99e9 · Prepare 3.4.0 release ·
    Release 3.4.0
    
    Notably, this release adds cross-native2, a new way to
    cross-compile packages. See the new Cross Compiling documentation page
    for more information about it.
    
    Features:
    * pmb.ci: choose multiple scripts at once interactively
    * build: add pmb:cross-native2 (MR 2474)
    * config: add pigz to build_packages (MR 2561)
    * pmb.install.format: add support for setting FDE passphrase
    * Add option to auto-select the best mirror
    * pmb.helpers.apk: support PMB_APK_NO_CACHE
    * pmb/install: Add option to create single combined boot/root partition
    
    Fixes:
    * Log only if config was really changed
    * install: Do not fail on invalid SSH key
    * install: remove redundant package musl-locales
    * core: Arch: define supported arches as a set (MR 2474)
    * build: backend: remove trailing spaces (MR 2474)
    * build: envkernel: build for the correct channel
    * build: package: install rsync even when package has no makedepends
    * build: fix cross-compile without CPU emulation
    * build: fix duplicate install messages
    * pmb.build: install checkdepends when building (MR 2563)
    * pmb.build: fix internal cross compiling names
    * pmb.build.package: fix strict mode
    * cross-native2: set CGO_CFLAGS, CGO_LDFLAGS (MR 2565)
    * pmb.netboot: Initialize chroot before checking path in chroot
    * pmb.netboot: Only attempt to install nbd after rootfs existance check (MR 2540)
    * pmb.netboot: Use NonBugError for nonexistent rootfs code path (MR 2540)
    * pmb.flasher: fix "flasher boot" crash if cmdline is empty
    * pmb.flasher.frontend: Use NonBugError for nonexistent rootfs code path (MR 2540)
    * pmb.qemu.run: Use NonBugError for nonexistent rootfs code path (MR 2540)
    * pmb.lint: Don't try to lint apkbuild paths that are empty
    * sideload: get channel from package not from global pmaports (MR 2569)
    * pmb.core.config: remove +1 from nproc defaults
    * pmb.config: Add pmb:cross-native2 to custom valid options (MR 2564)
    * pmb.parse.apkindex: account for provider_priority when locating packages
    * init: fix currently checked out channel detection
    * chroot: don't depende on alpine-base
    
    Other:
    * pmb: Rename pmb:gpu-accel and deviceinfo_gpu_accelerated
    * core: Arch: add .supported_binary() (MR 2474)
    * core: Arch: add method to map to Go arch (MR 2474)
    * core: small typing improvement
    * FIXUP: build: abstract CrossCompile type logic
    * build: print !tracedeps warning for cross-native 1
    * build.package: makedeps warning only for c-n2
    * pmb/build/autodetect: remove deprecated comment
    * pmb.build.backend.run_abuild: remove cross default
    * pmb.types.CrossCompileType: split up None
    * pmb.build.package: log the cross compile type
    * CI: test different cross compilation methods
    * CI: ruff: use 0.11.0 (Cannot use star annotation)
    * CI: test build for x86 pkg on x86_64 machine
    * pmb.install._install: remove installation of lang
    * pmb.install._install: write lang configuration to /etc/locale.conf
    * pmb.install._install: install locale config on default lang aswell
    * lint: adjust comment for empty apkbuild_paths
    
    Docs:
    * docs/cross_compiling: new page (MR 2562)
    * docs/cross_compiling: fix makedeps host/build desc
    * docs/env_variables: document PMB_FDE_PASSWORD
  • 3.3.2

    86ca58f1 · Prepare 3.3.2 release ·
    Release 3.3.2
    
    Usually we follow semver and don't put features in releases. But current
    master could use some more testing before tagging a new release, so it
    was decided to backport the feature that adds support for setting FDE
    passphrases via env var to the last stable version. This is required for
    making the os-installer work with FDE (see pmaports MR 6320).
    
    Features:
    * pmb.install.format: add support for setting FDE passphrase via env var
    
    Other:
    * CI: ruff: use 0.11.0 (Cannot use star annotation)
    * docs/env_variables: document PMB_FDE_PASSWORD
    
  • 3.3.1

    c74735ea · Prepare 3.3.1 release ·
    Release 3.3.1
    
    Fixes:
    * pyproject.toml: fix tests getting installed
    
  • 3.3.0

    60a4ed7f · Prepare 3.3.0 release ·
    Release 3.3.0
    
    Features:
    * chroot: add --usb flag to make usb devices available (MR 2554)
    * install: log space/inodes used in image (MR 2558)
    * pmb.config.init: prompt for pmaports path (MR 2502)
    * pmb.config.init: Improve message when "Archived:" header is missing (MR 2535)
    
    Fixes:
    * helpers.cli: Fix regex validation (MR 2557)
    * pmbootstrap chroot: fix --image bugs (MR 2556)
    * pmb.install.format: set bytes-per-inode to 16384 (MR 2558) (MR 2555) (MR 2552)
    * ci/markdown: fix shellcheck errors (MR 2485)
    * pmbootstrap config: Fix setting attribute value to False (MR 2546)
    * test: move all tests into separate module (MR 2551)
    * pmb.flasher: Fix passing command line flags (MR 2543)
    * install: create_device_rootfs: check if ui extras package exists (MR 2534)
    
    Other:
    * pmb.parse.apkindex: Improve parse_add_block() type hint (MR 2515)
    * pmb.chroot.run: Add another overload for root() (MR 2515)
    * pyproject.toml: Remove ignore for F401 in __init__.py files (MR 2545)
    * pmb.chroot: Rename exists() to user_exists() (MR 2545)
    * pmb: Use explicit re-exports (MR 2545)
    * pmb: Remove unused imports (MR 2545)
    * ci/markdown: don't run "npm install" as root (MR 2485)
    * add pre-commit hook for ruff (MR 2485)
    * CONTRIBUTING: document markdown linting (MR 2485)
    * treewide: lint markdown files (MR 2485)
    * CI: add markdown lint (MR 2485)
    * pmb.config.init: resolve double-negation (MR 2502)
    * pmb.config.init: Reformat some strings (MR 2535)
    * CI: use new runner where necessary (MR 2548)
    * pyproject.toml: Enable all N checks (MR 2537)
    * pmb.helpers.logging: Use PEP 8-compliant naming (MR 2537)
    * pmb.conftest: Use PEP 8-compliant naming (MR 2537)
    * pyproject.toml: Enable all PIE checks (MR 2537)
    * pmb.install.losetup: Remove unnecessary range start (MR 2537)
    * pmb: Remove unnecessary pass statements (MR 2537)
    * pmb.aportgen.core: Combine startswith(...) calls into one (MR 2537)
    
  • 3.2.0

    afecbb15 · Prepare 3.2.0 release ·
    Release 3.2.0
    
    This release or newer is required for postmarketOS + systemd, now that
    it has been merged into master:
    https://postmarketos.org/edge/2025/01/09/systemd-soon/
    
    Besides systemd related changes, notably "pmbootstrap flasher boot" now
    works for fastboot-bootpart. Also the android recovery zip and aportgen
    features have been fixed, along with some smaller fixes and a LOT of
    code quality improvements that will make future maintenance easier.
    
    Huge thanks to everybody who has contributed to this release! <3
    
    Features:
    * install: support systemd for disabling services (MR 2529)
    * pmb.config.pmaports: Make pmbootstrap automatically switch away from
      master_staging_systemd (MR 2528)
    * Rewrite repo_missing for bpo + systemd split repo (MR 2410)
    * pmb/config: enable "flasher boot" for fastboot-bootpart (MR 2508)
    
    Fixes:
    * pmb.chroot.binfmt: Initialise chroot before installing packages in register() (MR 2526)
    * pmb.parse.bootimg: Initialise chroot before installing packages in bootimg() (MR 2526)
    * pmb.config.other: Don't require selected UI package to exist (MR 2530)
    * Fix pmbootstrap install --android-recovery-zip (MR 2527)
    * helpers.run.core.add_proxy_env_vars: fix variables (MR 2525)
    * pmb.build.other: Fix broken f-string (MR 2525)
    * repo_missing: if abuild is forked, add it as dep (MR 2410)
    * pmb.aportgen: Update APKINDEX for relevant arch before parsing it (MR 2509)
    * pmb.flasher.frontend: detect lk2nd as subpackage dependency (MR 2511)
    
    Other:
    * pmb.helpers.ui: Add must_exist argument to check_option() (MR 2530)
    * pmb.qemu.run: Remove FIXME and type ignore stuff from command_qemu() (MR 2522)
    * pmb.types: Fix type for PmbArgs.output (MR 2522)
    * pmb.build.autodetect: Remove FIXME about type hinting arch (MR 2522)
    * CI: Install Ruff from PyPi instead of Alpine (MR 2525)
    * pmb: Reformat with Ruff 0.9 (MR 2525)
    * pmb.install: Remove unnecessary calls to round() (MR 2525)
    * pmb.config.init: Simplify removal of select from providers_cfg (MR 2525)
    * pmb.helpers.aportupgrade: Remove unnecessary regex (MR 2525)
    * pmb: Use raw strings for regexes (MR 2525)
    * pmb.chroot.apk: Use unpacking operator to create command in install_run_apk() (MR 2525)
    * pyproject.toml: Enable most RUF checks (MR 2525)
    * pmb: Use unpacking operator to concatenate collections (MR 2525)
    * pmb.core.config: Add note about aports variable being class variable (MR 2525)
    * pmb.core.config: Mark mirrors and providers as class variables (MR 2525)
    * pmb.helpers.locale: Use frozenset for primary_layouts (MR 2525)
    * pmb.build._package: Replace sum() with functools.reduce() (MR 2525)
    * pmb.commands.repo_bootstrap: Remove unnecessary noqa comment (MR 2525)
    * pmb.helpers.run_core: Remove unnecessary str(...) (MR 2525)
    * pmb: Replace list(...)[0] with next(iter(...)) (MR 2525)
    * install: merge disable_sshd(), disable_firewall() (MR 2529)
    * Cosmetic: pmb/install/_install.py: tweak strings (MR 2529)
    * Update systemd repo URL
    * pmb.core.test_pkgrepo: Remove reference to master_staging_systemd (MR 2528)
    * docs: use pmOS green color in html output (MR 2520)
    * editorconfig: new file (MR 2520)
    * pyproject.toml: Enable Ruff preview (MR 2516)
    * pyproject.toml: Add CPY001 to Ruff linting (MR 2516)
    * docs, pmb: Add missing copyright headers (MR 2516)
    * pmb.parse.version: Use _ for "value" variable in validate() (MR 2516)
    * CI: Simplify Ruff check (MR 2517)
    * pmb.parse.version: Replace token_value() with Token enum (MR 2518)
    * pmb.config.pmaports: Get rid of cast hack for SectionProxy (MR 2519)
    * pyproject.toml: Set disallow_untyped_calls = true (MR 2514)
    * pyproject.toml: Set disallow_untyped_defs = true (MR 2514)
    * pmb: Add more types and fix type errors (MR 2514)
    * pmb.parse.arguments: Type hint and remove unused arguments from add_kernel_arg() (MR 2514)
    * pmb.parse.arguments: Ignore attr-defined on arg.completer (MR 2514)
    * pmb.parse.test_version: Add unit tests for version.py (MR 2514)
    * pmb.parse.version: Convert rest[0] to integer before storing it in value (MR 2514)
    * pmb.parse.version: Link to older apk-tools (MR 2514)
    * pmb: Add more type hints (MR 2513)
    * pmb.qemu.run: Fix odd strings (MR 2513)
    * docs: fix typos (MR 2510)
    * pmb.aportgen: Unify tempdir preparation and checksum generation (MR 2509)
    * pmb: Add more type hints (MR 2490)
    * pmb.aportgen: Annotate <options> as AportGenEntry in generate() (MR 2490)
    * pmb.helpers.repo_missing: Use f-string in get_relevant_packages() (MR 2490)
    * pmb/helpers/repo_missing: Remove <arch> from filter_aport_packages() docstring (MR 2490)
    * pmb.commands.pull: Remove bool return type from run() (MR 2490)
    * pmb.config.init: Use separate answer variable for sudo timer (MR 2490)
    * pmb.config.init: Explicitly convert string to int for config.extra_space (MR 2490)
    * pmb.config.init: Fix types in ask_for_systemd() (MR 2490)
    * pmb.config.init: Fix types in ask_for_work_path() (MR 2490)
    * pmb.parse.kconfig: Rename options to arch_options in check_config_options_set (MR 2490)
    * pmb.parse.kconfig.check_config_options_set: Update docstring (MR 2490)
    * pmb.helpers.http: Simplify retrieve_json() (MR 2490)
    * Fix spelling "infront" -> "in front"