fix(snapshots): un-break the GUI — polkit agent + launcher, not an override
All checks were successful
Check / eval (push) Successful in 3m4s
All checks were successful
Check / eval (push) Successful in 3m4s
Re-diagnosis of the "btrfs-assistant 2.2 segfaults on launch" bug, and the fix is not the planned nixpkgs override: 1. gdb: the crash is btrfs_util_subvolume_iterator_next() — libbtrfsutil's UNPRIVILEGED subvolume-iteration path in btrfs-progs 6.17.1 (upstream-fixed after 6.17.1, kdave/btrfs-progs 886571653). Symbol versions were checked and match: not ABI/link drift. 2. VM A/B on real btrfs: as root it works (exit 0); as a user it segfaults (139). The pkexec launcher runs it as root — so the GUI path was fine all along, except… 3. …the distro shipped NO polkit authentication agent: every pkexec prompt in the session failed silently. That is the actual root cause of "the GUI doesn't open". Shipped: hyprpolkitagent (Hyprland's Qt agent — the prompt is Stylix-themed) via exec-once in hyprland.nix; `nomarchy-menu snapshot` prefers btrfs-assistant-launcher again, with the nomarchy-snapshots fzf flow kept as fallback (and for SSH); checks.snapshot-gui guards the root path + offscreen GUI event loop on a real btrfs volume so a lock bump can't silently regress it. No btrfs-progs patch: all our flows are root-side; the unprivileged fix arrives with a lock bump. Verified: V0 (flake check) + V2 (snapshot-gui check, executed green) + V1 (HM generation builds; hyprland.conf carries the agent exec-once; generated menu passes bash -n with the launcher wiring). Remaining V3 queued: first on-hardware themed polkit prompt. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
29
flake.nix
29
flake.nix
@@ -254,6 +254,35 @@
|
||||
'';
|
||||
};
|
||||
|
||||
# Snapshot GUI canary: btrfs-assistant crashes in libbtrfsutil's
|
||||
# UNPRIVILEGED subvolume iteration (btrfs-progs 6.17.1, fixed
|
||||
# upstream after 6.17.1) but runs fine as root — which is how the
|
||||
# menu launches it (pkexec launcher). Guard the root path on a
|
||||
# real btrfs volume so a lock bump that breaks it fails here, not
|
||||
# on a user's machine. The GUI event loop is exercised offscreen
|
||||
# (survives a 5s timeout = no startup crash past the Btrfs scan).
|
||||
snapshot-gui = pkgs.testers.runNixOSTest {
|
||||
name = "nomarchy-snapshot-gui";
|
||||
nodes.machine = { pkgs, ... }: {
|
||||
environment.systemPackages = [ pkgs.btrfs-assistant pkgs.btrfs-progs ];
|
||||
virtualisation.emptyDiskImages = [ 512 ];
|
||||
};
|
||||
testScript = ''
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
machine.succeed(
|
||||
"mkfs.btrfs /dev/vdb && mkdir -p /mnt && mount /dev/vdb /mnt "
|
||||
"&& btrfs subvolume create /mnt/sub1"
|
||||
)
|
||||
# Root (the launcher's effective context): must work.
|
||||
machine.succeed("QT_QPA_PLATFORM=offscreen btrfs-assistant-bin --version")
|
||||
# The GUI proper survives startup (timeout kill = alive → 124).
|
||||
machine.succeed(
|
||||
"set +e; timeout 5 env QT_QPA_PLATFORM=offscreen btrfs-assistant-bin; "
|
||||
"[ $? -eq 124 ]"
|
||||
)
|
||||
'';
|
||||
};
|
||||
|
||||
# The distroId question (roadmap "Distro branding"): set
|
||||
# distroId = "nomarchy" so /etc/os-release is honest (ID=nomarchy,
|
||||
# ID_LIKE=nixos). The risk is switch-to-configuration's "is this
|
||||
|
||||
Reference in New Issue
Block a user