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