From f7157f0e9213ea6304af35e1ed361b8c0f4f4ba2 Mon Sep 17 00:00:00 2001 From: purian23 Date: Mon, 13 Jul 2026 00:39:06 -0400 Subject: [PATCH] refactor(debian): prefer native Debian Quickshell stable package support in dankinstall Port 1.5 (cherry picked from commit 63eea012439e2cebfeaccbfe069f2282126e91be) --- core/README.md | 2 +- core/internal/distros/debian.go | 59 ++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/core/README.md b/core/README.md index 1a725ed8a..9ea753ee3 100644 --- a/core/README.md +++ b/core/README.md @@ -206,7 +206,7 @@ Uses COPR repositories (`avengemedia/danklinux`, `avengemedia/dms`). Requires PPA support. Most packages built from source (slow first install). **Debian** -Debian 13+ (Trixie). niri only, no Hyprland support. Builds from source. +Debian 13+ (Trixie), testing, and sid. Stable quickshell from Debian (trixie-backports on 13). Other companions via OBS. **openSUSE** Most packages available in standard repos. Minimal building required. diff --git a/core/internal/distros/debian.go b/core/internal/distros/debian.go index d18f252e8..1c5ac4a10 100644 --- a/core/internal/distros/debian.go +++ b/core/internal/distros/debian.go @@ -161,7 +161,60 @@ func (d *DebianDistribution) getQuickshellMapping(variant deps.PackageVariant) P if forceQuickshellGit || variant == deps.VariantGit { return PackageMapping{Name: "quickshell-git", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"} } - return PackageMapping{Name: "quickshell", Repository: RepoTypeOBS, RepoURL: "home:AvengeMedia:danklinux"} + // Debian 13 ships stable quickshell in trixie-backports only. + if d.debianNeedsQuickshellBackports() { + return PackageMapping{Name: "quickshell/trixie-backports", Repository: RepoTypeSystem} + } + return PackageMapping{Name: "quickshell", Repository: RepoTypeSystem} +} + +func (d *DebianDistribution) debianNeedsQuickshellBackports() bool { + osInfo, err := GetOSInfo() + if err != nil { + return false + } + return osInfo.VersionID == "13" || strings.EqualFold(osInfo.VersionCodename, "trixie") +} + +func (d *DebianDistribution) ensureQuickshellBackports(ctx context.Context, systemPkgs []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error { + needsBackports := false + for _, pkg := range systemPkgs { + if strings.Contains(pkg, "trixie-backports") { + needsBackports = true + break + } + } + if !needsBackports { + return nil + } + + policyOut, err := exec.CommandContext(ctx, "apt-cache", "policy").Output() + if err == nil && strings.Contains(string(policyOut), "trixie-backports") { + d.log("trixie-backports already configured") + return nil + } + + listFile := "/etc/apt/sources.list.d/trixie-backports.list" + repoLine := "deb http://deb.debian.org/debian trixie-backports main contrib non-free non-free-firmware" + + progressChan <- InstallProgressMsg{ + Phase: PhaseSystemPackages, + Progress: 0.30, + Step: "Enabling trixie-backports for quickshell...", + IsComplete: false, + NeedsSudo: true, + CommandInfo: fmt.Sprintf("echo '%s' | sudo tee %s", repoLine, listFile), + LogOutput: "Debian 13 ships quickshell in trixie-backports", + } + + addCmd := privesc.ExecCommand(ctx, sudoPassword, + fmt.Sprintf("bash -c \"echo '%s' | tee %s\"", repoLine, listFile)) + if err := d.runWithProgress(addCmd, progressChan, PhaseSystemPackages, 0.30, 0.31); err != nil { + return err + } + + updateCmd := privesc.ExecCommand(ctx, sudoPassword, "apt-get update") + return d.runWithProgress(updateCmd, progressChan, PhaseSystemPackages, 0.31, 0.33) } func (d *DebianDistribution) getNiriMapping(variant deps.PackageVariant) PackageMapping { @@ -266,6 +319,10 @@ func (d *DebianDistribution) InstallPackages(ctx context.Context, dependencies [ } } + if err := d.ensureQuickshellBackports(ctx, systemPkgs, sudoPassword, progressChan); err != nil { + return fmt.Errorf("failed to enable trixie-backports for quickshell: %w", err) + } + // System Packages if len(systemPkgs) > 0 { progressChan <- InstallProgressMsg{