xdg-desktop-portal 1.20.1 added support for searching all
directories in XDG_DATA_DIRS for portals:
https://github.com/flatpak/xdg-desktop-portal/commit/bb37e260db3f91b93227cb559745468922ca29fd
This made the NIX_XDG_DESKTOP_PORTAL_DIR patch redundant, since
NixOS already ensures /run/current-system/sw/share is on
XDG_DATA_DIRS.
The patch also does not compose well: it hardcodes a single
portal directory, so when both NixOS and home-manager set it,
home-manager's value overwrote NixOS's, breaking portal
discovery for anything only registered by NixOS (e.g. Cosmic
alongside a home-manager-configured Hyprland).
Those options mapped to the deprecated V1 format,
and didn't allow using the newer format.
If any of the older options are used,
a warning is displayed,
and the generated registries.conf file follows the old V1 format.
For more information about the new format,
see https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md
Fixes several correctness bugs primarily around modular services' recent
reload/notification options (#535695) and adds compliance coverage to guard them.
Fixes:
- `lib/services/service.nix`:
- the reload-conflict assertion had inverted polarity, so it fired on the
default configuration
- the `mkIf` guard on `process.reloadCommand` had a misplaced paren, applying
`!= null` to the `mkIf` result rather than to the condition
- `process.reloadSignal` derives `process.reloadCommand`, so the assertion
could not check `reloadCommand != null` -- that fired on every signal-only
service. The command is now derived at `mkDefault` priority and the
assertion is gated on `options.process.reloadCommand.highestPrio`, firing
only when the user also set `reloadCommand` explicitly.
- change `notificationProtocol` to a sub-module type
- `nixos/modules/system/service/systemd/service.nix`:
- `systemd.mainExecReload`'s default ran `escapeSystemdExecArgs` (a list
escaper) on the `nullOr str` `process.reloadCommand`; this threw
`expected a list but found a string` and would have mangled `$MAINPID`. It
now uses `process.reloadCommand` verbatim.
- the `Type` default read a non-existent
`config.serviceManager.notificationProtocol` instead of
`config.notificationProtocol`.
Tests:
Extend the modular-service compliance suite to guard the above:
- Portable (manager-agnostic) eval assertions: `reloadSignal` derives
`reloadCommand`, the conflict assertion does not fire on signal-only services
but does when both are set explicitly, and `notificationProtocol.systemd`/`.s6`
default to `false`.
- systemd-specific eval assertions: `serviceConfig.Type` (simple/notify) and
`serviceConfig.ExecReload` are asserted on the resolved host units. This
directly guards the `mainExecReload` fix, which threw before it.
- Runtime reload compliance test: a nested reloadable sub-service is started and
reloaded, asserting the service observed the reload (recorded a SIGHUP marker).
`callReload` receives the service's name path (the list of names from the
top-level service down to the target sub-service); each integration joins it
per its own unit-naming convention (NixOS dash-joins to the systemd unit name,
e.g. `reload-inner.service`). Keeping it a path list rather than a read-only
submodule option keeps the suite manager-agnostic.
- `doc/build-helpers/testers.chapter.md`: document `callReload`.
Follow-up to #535695.
Signed-off-by: cinereal <cinereal@riseup.net>
Assisted-by: Claude:claude-opus-4-8
xdg-document-portal mounts a FUSE filesystem and libfuse expects /run/wrappers/bin/fusermount3. Enable programs.fuse with the portal now that FUSE is no longer enabled globally.
Closes#542790
Assisted-by: pi coding agent / Mika (OpenAI gpt-5.6-sol)
Suggested-by: Audrey Dutcher <audrey@rhelmot.io>