From f489dc062f4f91b0222427326109575969b8d95e Mon Sep 17 00:00:00 2001 From: bbedward Date: Thu, 13 Nov 2025 17:31:02 -0500 Subject: [PATCH] dankinstall: fix variant passing --- core/internal/distros/arch.go | 9 +-- core/internal/distros/debian.go | 17 +++-- core/internal/distros/fedora.go | 8 +- core/internal/distros/gentoo.go | 8 +- core/internal/distros/manual_packages.go | 96 ++++++++++++------------ core/internal/distros/nixos.go | 11 ++- core/internal/distros/opensuse.go | 24 +++--- core/internal/distros/ubuntu.go | 19 +++-- 8 files changed, 100 insertions(+), 92 deletions(-) diff --git a/core/internal/distros/arch.go b/core/internal/distros/arch.go index 48ca5c87..f4c7f4f1 100644 --- a/core/internal/distros/arch.go +++ b/core/internal/distros/arch.go @@ -321,7 +321,7 @@ func (a *ArchDistribution) InstallPackages(ctx context.Context, dependencies []d return fmt.Errorf("failed to install prerequisites: %w", err) } - systemPkgs, aurPkgs, manualPkgs := a.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) + systemPkgs, aurPkgs, manualPkgs, variantMap := a.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) // Phase 3: System Packages if len(systemPkgs) > 0 { @@ -361,7 +361,7 @@ func (a *ArchDistribution) InstallPackages(ctx context.Context, dependencies []d IsComplete: false, LogOutput: fmt.Sprintf("Building from source: %s", strings.Join(manualPkgs, ", ")), } - if err := a.InstallManualPackages(ctx, manualPkgs, sudoPassword, progressChan); err != nil { + if err := a.InstallManualPackages(ctx, manualPkgs, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install manual packages: %w", err) } } @@ -387,7 +387,7 @@ func (a *ArchDistribution) InstallPackages(ctx context.Context, dependencies []d return nil } -func (a *ArchDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []string, []string) { +func (a *ArchDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []string, []string, map[string]deps.PackageVariant) { systemPkgs := []string{} aurPkgs := []string{} manualPkgs := []string{} @@ -410,7 +410,6 @@ func (a *ArchDistribution) categorizePackages(dependencies []deps.Dependency, wm pkgInfo, exists := packageMap[dep.Name] if !exists { - // If no mapping exists, treat as manual build manualPkgs = append(manualPkgs, dep.Name) continue } @@ -425,7 +424,7 @@ func (a *ArchDistribution) categorizePackages(dependencies []deps.Dependency, wm } } - return systemPkgs, aurPkgs, manualPkgs + return systemPkgs, aurPkgs, manualPkgs, variantMap } func (a *ArchDistribution) installSystemPackages(ctx context.Context, packages []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error { diff --git a/core/internal/distros/debian.go b/core/internal/distros/debian.go index 8e45afa7..c6009240 100644 --- a/core/internal/distros/debian.go +++ b/core/internal/distros/debian.go @@ -238,7 +238,7 @@ func (d *DebianDistribution) InstallPackages(ctx context.Context, dependencies [ return fmt.Errorf("failed to install prerequisites: %w", err) } - systemPkgs, manualPkgs := d.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) + systemPkgs, manualPkgs, variantMap := d.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) if len(systemPkgs) > 0 { progressChan <- InstallProgressMsg{ @@ -273,7 +273,7 @@ func (d *DebianDistribution) InstallPackages(ctx context.Context, dependencies [ IsComplete: false, LogOutput: fmt.Sprintf("Building from source: %s", strings.Join(manualPkgs, ", ")), } - if err := d.InstallManualPackages(ctx, manualPkgs, sudoPassword, progressChan); err != nil { + if err := d.InstallManualPackages(ctx, manualPkgs, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install manual packages: %w", err) } } @@ -297,10 +297,15 @@ func (d *DebianDistribution) InstallPackages(ctx context.Context, dependencies [ return nil } -func (d *DebianDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []string) { +func (d *DebianDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []string, map[string]deps.PackageVariant) { systemPkgs := []string{} manualPkgs := []string{} + variantMap := make(map[string]deps.PackageVariant) + for _, dep := range dependencies { + variantMap[dep.Name] = dep.Variant + } + packageMap := d.GetPackageMapping(wm) for _, dep := range dependencies { @@ -326,7 +331,7 @@ func (d *DebianDistribution) categorizePackages(dependencies []deps.Dependency, } } - return systemPkgs, manualPkgs + return systemPkgs, manualPkgs, variantMap } func (d *DebianDistribution) installAPTPackages(ctx context.Context, packages []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error { @@ -513,7 +518,7 @@ func (d *DebianDistribution) installGhosttyDebian(ctx context.Context, sudoPassw return nil } -func (d *DebianDistribution) InstallManualPackages(ctx context.Context, packages []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error { +func (d *DebianDistribution) InstallManualPackages(ctx context.Context, packages []string, variantMap map[string]deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { if len(packages) == 0 { return nil } @@ -527,7 +532,7 @@ func (d *DebianDistribution) InstallManualPackages(ctx context.Context, packages return fmt.Errorf("failed to install ghostty: %w", err) } default: - if err := d.ManualPackageInstaller.InstallManualPackages(ctx, []string{pkg}, sudoPassword, progressChan); err != nil { + if err := d.ManualPackageInstaller.InstallManualPackages(ctx, []string{pkg}, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install %s: %w", pkg, err) } } diff --git a/core/internal/distros/fedora.go b/core/internal/distros/fedora.go index 8e48db4e..8d439a0c 100644 --- a/core/internal/distros/fedora.go +++ b/core/internal/distros/fedora.go @@ -314,7 +314,7 @@ func (f *FedoraDistribution) InstallPackages(ctx context.Context, dependencies [ return fmt.Errorf("failed to install prerequisites: %w", err) } - dnfPkgs, coprPkgs, manualPkgs := f.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) + dnfPkgs, coprPkgs, manualPkgs, variantMap := f.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) // Phase 2: Enable COPR repositories if len(coprPkgs) > 0 { @@ -369,7 +369,7 @@ func (f *FedoraDistribution) InstallPackages(ctx context.Context, dependencies [ IsComplete: false, LogOutput: fmt.Sprintf("Building from source: %s", strings.Join(manualPkgs, ", ")), } - if err := f.InstallManualPackages(ctx, manualPkgs, sudoPassword, progressChan); err != nil { + if err := f.InstallManualPackages(ctx, manualPkgs, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install manual packages: %w", err) } } @@ -395,7 +395,7 @@ func (f *FedoraDistribution) InstallPackages(ctx context.Context, dependencies [ return nil } -func (f *FedoraDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []PackageMapping, []string) { +func (f *FedoraDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []PackageMapping, []string, map[string]deps.PackageVariant) { dnfPkgs := []string{} coprPkgs := []PackageMapping{} manualPkgs := []string{} @@ -432,7 +432,7 @@ func (f *FedoraDistribution) categorizePackages(dependencies []deps.Dependency, } } - return dnfPkgs, coprPkgs, manualPkgs + return dnfPkgs, coprPkgs, manualPkgs, variantMap } func (f *FedoraDistribution) extractPackageNames(packages []PackageMapping) []string { diff --git a/core/internal/distros/gentoo.go b/core/internal/distros/gentoo.go index f973d771..aea037b2 100644 --- a/core/internal/distros/gentoo.go +++ b/core/internal/distros/gentoo.go @@ -391,7 +391,7 @@ func (g *GentooDistribution) InstallPackages(ctx context.Context, dependencies [ return fmt.Errorf("failed to install prerequisites: %w", err) } - systemPkgs, guruPkgs, manualPkgs := g.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) + systemPkgs, guruPkgs, manualPkgs, variantMap := g.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) g.log(fmt.Sprintf("CATEGORIZED PACKAGES: system=%d, guru=%d, manual=%d", len(systemPkgs), len(guruPkgs), len(manualPkgs))) @@ -447,7 +447,7 @@ func (g *GentooDistribution) InstallPackages(ctx context.Context, dependencies [ IsComplete: false, LogOutput: fmt.Sprintf("Building from source: %s", strings.Join(manualPkgs, ", ")), } - if err := g.InstallManualPackages(ctx, manualPkgs, sudoPassword, progressChan); err != nil { + if err := g.InstallManualPackages(ctx, manualPkgs, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install manual packages: %w", err) } } @@ -471,7 +471,7 @@ func (g *GentooDistribution) InstallPackages(ctx context.Context, dependencies [ return nil } -func (g *GentooDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]PackageMapping, []PackageMapping, []string) { +func (g *GentooDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]PackageMapping, []PackageMapping, []string, map[string]deps.PackageVariant) { systemPkgs := []PackageMapping{} guruPkgs := []PackageMapping{} manualPkgs := []string{} @@ -508,7 +508,7 @@ func (g *GentooDistribution) categorizePackages(dependencies []deps.Dependency, } } - return systemPkgs, guruPkgs, manualPkgs + return systemPkgs, guruPkgs, manualPkgs, variantMap } func (g *GentooDistribution) extractPackageNames(packages []PackageMapping) []string { diff --git a/core/internal/distros/manual_packages.go b/core/internal/distros/manual_packages.go index d7ddcef5..e5dce460 100644 --- a/core/internal/distros/manual_packages.go +++ b/core/internal/distros/manual_packages.go @@ -7,6 +7,8 @@ import ( "os/exec" "path/filepath" "strings" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/deps" ) // ManualPackageInstaller provides methods for installing packages from source @@ -42,8 +44,7 @@ func (m *ManualPackageInstaller) getLatestQuickshellTag(ctx context.Context) str return m.parseLatestTagFromGitOutput(string(tagOutput)) } -// InstallManualPackages handles packages that need manual building -func (m *ManualPackageInstaller) InstallManualPackages(ctx context.Context, packages []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error { +func (m *ManualPackageInstaller) InstallManualPackages(ctx context.Context, packages []string, variantMap map[string]deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { if len(packages) == 0 { return nil } @@ -51,9 +52,10 @@ func (m *ManualPackageInstaller) InstallManualPackages(ctx context.Context, pack m.log(fmt.Sprintf("Installing manual packages: %s", strings.Join(packages, ", "))) for _, pkg := range packages { + variant := variantMap[pkg] switch pkg { case "dms (DankMaterialShell)", "dms": - if err := m.installDankMaterialShell(ctx, sudoPassword, progressChan); err != nil { + if err := m.installDankMaterialShell(ctx, variant, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install DankMaterialShell: %w", err) } case "dgop": @@ -69,7 +71,7 @@ func (m *ManualPackageInstaller) InstallManualPackages(ctx context.Context, pack return fmt.Errorf("failed to install niri: %w", err) } case "quickshell": - if err := m.installQuickshell(ctx, sudoPassword, progressChan); err != nil { + if err := m.installQuickshell(ctx, variant, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install quickshell: %w", err) } case "hyprland": @@ -294,7 +296,7 @@ func (m *ManualPackageInstaller) installNiri(ctx context.Context, sudoPassword s return nil } -func (m *ManualPackageInstaller) installQuickshell(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error { +func (m *ManualPackageInstaller) installQuickshell(ctx context.Context, variant deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { m.log("Installing quickshell from source...") homeDir := os.Getenv("HOME") @@ -322,10 +324,9 @@ func (m *ManualPackageInstaller) installQuickshell(ctx context.Context, sudoPass } var cloneCmd *exec.Cmd - if forceQuickshellGit { + if forceQuickshellGit || variant == deps.VariantGit { cloneCmd = exec.CommandContext(ctx, "git", "clone", "https://github.com/quickshell-mirror/quickshell.git", tmpDir) } else { - // Get latest tag from repository latestTag := m.getLatestQuickshellTag(ctx) if latestTag != "" { m.log(fmt.Sprintf("Using latest quickshell tag: %s", latestTag)) @@ -642,7 +643,7 @@ func (m *ManualPackageInstaller) installMatugen(ctx context.Context, sudoPasswor return nil } -func (m *ManualPackageInstaller) installDankMaterialShell(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error { +func (m *ManualPackageInstaller) installDankMaterialShell(ctx context.Context, variant deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { m.log("Installing DankMaterialShell (DMS)...") if err := m.installDMSBinary(ctx, sudoPassword, progressChan); err != nil { @@ -671,24 +672,26 @@ func (m *ManualPackageInstaller) installDankMaterialShell(ctx context.Context, s return fmt.Errorf("failed to clone DankMaterialShell: %w", err) } - if !forceDMSGit { - tagCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "describe", "--tags", "--abbrev=0", "origin/master") - tagOutput, err := tagCmd.Output() - if err != nil { - m.log("Using default branch (no tags found)") - return nil - } - - latestTag := strings.TrimSpace(string(tagOutput)) - checkoutCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "checkout", latestTag) - if err := checkoutCmd.Run(); err != nil { - m.logError(fmt.Sprintf("Failed to checkout tag %s", latestTag), err) - return nil - } - - m.log(fmt.Sprintf("Checked out latest tag: %s", latestTag)) + if forceDMSGit || variant == deps.VariantGit { + m.log("Using git variant (master branch)") + return nil } + tagCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "describe", "--tags", "--abbrev=0", "origin/master") + tagOutput, err := tagCmd.Output() + if err != nil { + m.log("Using default branch (no tags found)") + return nil + } + + latestTag := strings.TrimSpace(string(tagOutput)) + checkoutCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "checkout", latestTag) + if err := checkoutCmd.Run(); err != nil { + m.logError(fmt.Sprintf("Failed to checkout tag %s", latestTag), err) + return nil + } + + m.log(fmt.Sprintf("Checked out latest tag: %s", latestTag)) m.log("DankMaterialShell cloned successfully") return nil } @@ -707,47 +710,44 @@ func (m *ManualPackageInstaller) installDankMaterialShell(ctx context.Context, s return nil } - tagCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "describe", "--exact-match", "--tags", "HEAD") - onTag := tagCmd.Run() == nil - - if onTag && !forceDMSGit { - latestTagCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "describe", "--tags", "--abbrev=0", "origin/master") - tagOutput, err := latestTagCmd.Output() + if forceDMSGit || variant == deps.VariantGit { + branchCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "rev-parse", "--abbrev-ref", "HEAD") + branchOutput, err := branchCmd.Output() if err != nil { - m.logError("Failed to get latest tag", err) + m.logError("Failed to get current branch", err) return nil } - latestTag := strings.TrimSpace(string(tagOutput)) - checkoutCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "checkout", latestTag) - if err := checkoutCmd.Run(); err != nil { - m.logError(fmt.Sprintf("Failed to checkout tag %s", latestTag), err) + branch := strings.TrimSpace(string(branchOutput)) + if branch == "" { + branch = "master" + } + + pullCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "pull", "origin", branch) + if err := pullCmd.Run(); err != nil { + m.logError("Failed to pull updates", err) return nil } - m.log(fmt.Sprintf("Updated to tag: %s", latestTag)) + m.log("DankMaterialShell updated successfully (git variant)") return nil } - branchCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "rev-parse", "--abbrev-ref", "HEAD") - branchOutput, err := branchCmd.Output() + latestTagCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "describe", "--tags", "--abbrev=0", "origin/master") + tagOutput, err := latestTagCmd.Output() if err != nil { - m.logError("Failed to get current branch", err) + m.logError("Failed to get latest tag", err) return nil } - branch := strings.TrimSpace(string(branchOutput)) - if branch == "" { - branch = "master" - } - - pullCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "pull", "origin", branch) - if err := pullCmd.Run(); err != nil { - m.logError("Failed to pull updates", err) + latestTag := strings.TrimSpace(string(tagOutput)) + checkoutCmd := exec.CommandContext(ctx, "git", "-C", dmsPath, "checkout", latestTag) + if err := checkoutCmd.Run(); err != nil { + m.logError(fmt.Sprintf("Failed to checkout tag %s", latestTag), err) return nil } - m.log("DankMaterialShell updated successfully") + m.log(fmt.Sprintf("Updated to tag: %s", latestTag)) return nil } diff --git a/core/internal/distros/nixos.go b/core/internal/distros/nixos.go index 9f876e7d..fbbdcaf1 100644 --- a/core/internal/distros/nixos.go +++ b/core/internal/distros/nixos.go @@ -308,7 +308,7 @@ func (n *NixOSDistribution) InstallPackages(ctx context.Context, dependencies [] return fmt.Errorf("failed to install prerequisites: %w", err) } - nixpkgsPkgs, flakePkgs := n.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) + nixpkgsPkgs, flakePkgs, _ := n.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) // Phase 2: Nixpkgs Packages if len(nixpkgsPkgs) > 0 { @@ -362,10 +362,15 @@ func (n *NixOSDistribution) InstallPackages(ctx context.Context, dependencies [] return nil } -func (n *NixOSDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []string) { +func (n *NixOSDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []string, map[string]deps.PackageVariant) { nixpkgsPkgs := []string{} flakePkgs := []string{} + variantMap := make(map[string]deps.PackageVariant) + for _, dep := range dependencies { + variantMap[dep.Name] = dep.Variant + } + packageMap := n.GetPackageMapping(wm) for _, dep := range dependencies { @@ -391,7 +396,7 @@ func (n *NixOSDistribution) categorizePackages(dependencies []deps.Dependency, w } } - return nixpkgsPkgs, flakePkgs + return nixpkgsPkgs, flakePkgs, variantMap } func (n *NixOSDistribution) installNixpkgsPackages(ctx context.Context, packages []string, progressChan chan<- InstallProgressMsg) error { diff --git a/core/internal/distros/opensuse.go b/core/internal/distros/opensuse.go index b86c84dc..11c1bc94 100644 --- a/core/internal/distros/opensuse.go +++ b/core/internal/distros/opensuse.go @@ -294,7 +294,7 @@ func (o *OpenSUSEDistribution) InstallPackages(ctx context.Context, dependencies return fmt.Errorf("failed to install prerequisites: %w", err) } - systemPkgs, manualPkgs := o.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) + systemPkgs, manualPkgs, variantMap := o.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) // Phase 2: System Packages (Zypper) if len(systemPkgs) > 0 { @@ -320,7 +320,7 @@ func (o *OpenSUSEDistribution) InstallPackages(ctx context.Context, dependencies IsComplete: false, LogOutput: fmt.Sprintf("Building from source: %s", strings.Join(manualPkgs, ", ")), } - if err := o.InstallManualPackages(ctx, manualPkgs, sudoPassword, progressChan); err != nil { + if err := o.InstallManualPackages(ctx, manualPkgs, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install manual packages: %w", err) } } @@ -346,7 +346,7 @@ func (o *OpenSUSEDistribution) InstallPackages(ctx context.Context, dependencies return nil } -func (o *OpenSUSEDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []string) { +func (o *OpenSUSEDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []string, map[string]deps.PackageVariant) { systemPkgs := []string{} manualPkgs := []string{} @@ -380,7 +380,7 @@ func (o *OpenSUSEDistribution) categorizePackages(dependencies []deps.Dependency } } - return systemPkgs, manualPkgs + return systemPkgs, manualPkgs, variantMap } func (o *OpenSUSEDistribution) installZypperPackages(ctx context.Context, packages []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error { @@ -406,8 +406,7 @@ func (o *OpenSUSEDistribution) installZypperPackages(ctx context.Context, packag return o.runWithProgress(cmd, progressChan, PhaseSystemPackages, 0.40, 0.60) } -// installQuickshell overrides the base implementation to set openSUSE-specific CFLAGS -func (o *OpenSUSEDistribution) installQuickshell(ctx context.Context, sudoPassword string, progressChan chan<- InstallProgressMsg) error { +func (o *OpenSUSEDistribution) installQuickshell(ctx context.Context, variant deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { o.log("Installing quickshell from source (with openSUSE-specific build flags)...") homeDir := os.Getenv("HOME") @@ -435,10 +434,9 @@ func (o *OpenSUSEDistribution) installQuickshell(ctx context.Context, sudoPasswo } var cloneCmd *exec.Cmd - if forceQuickshellGit { + if forceQuickshellGit || variant == deps.VariantGit { cloneCmd = exec.CommandContext(ctx, "git", "clone", "https://github.com/quickshell-mirror/quickshell.git", tmpDir) } else { - // Get latest tag from repository latestTag := o.getLatestQuickshellTag(ctx) if latestTag != "" { o.log(fmt.Sprintf("Using latest quickshell tag: %s", latestTag)) @@ -573,15 +571,13 @@ func (o *OpenSUSEDistribution) installRust(ctx context.Context, sudoPassword str return nil } -// InstallManualPackages overrides the base implementation to use openSUSE-specific builds -func (o *OpenSUSEDistribution) InstallManualPackages(ctx context.Context, packages []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error { +func (o *OpenSUSEDistribution) InstallManualPackages(ctx context.Context, packages []string, variantMap map[string]deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { if len(packages) == 0 { return nil } o.log(fmt.Sprintf("Installing manual packages: %s", strings.Join(packages, ", "))) - // Install Rust if needed for matugen for _, pkg := range packages { if pkg == "matugen" { if err := o.installRust(ctx, sudoPassword, progressChan); err != nil { @@ -592,13 +588,13 @@ func (o *OpenSUSEDistribution) InstallManualPackages(ctx context.Context, packag } for _, pkg := range packages { + variant := variantMap[pkg] if pkg == "quickshell" { - if err := o.installQuickshell(ctx, sudoPassword, progressChan); err != nil { + if err := o.installQuickshell(ctx, variant, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install quickshell: %w", err) } } else { - // Use the base ManualPackageInstaller for other packages - if err := o.ManualPackageInstaller.InstallManualPackages(ctx, []string{pkg}, sudoPassword, progressChan); err != nil { + if err := o.ManualPackageInstaller.InstallManualPackages(ctx, []string{pkg}, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install %s: %w", pkg, err) } } diff --git a/core/internal/distros/ubuntu.go b/core/internal/distros/ubuntu.go index e4a30d97..41daacb0 100644 --- a/core/internal/distros/ubuntu.go +++ b/core/internal/distros/ubuntu.go @@ -263,7 +263,7 @@ func (u *UbuntuDistribution) InstallPackages(ctx context.Context, dependencies [ return fmt.Errorf("failed to install prerequisites: %w", err) } - systemPkgs, ppaPkgs, manualPkgs := u.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) + systemPkgs, ppaPkgs, manualPkgs, variantMap := u.categorizePackages(dependencies, wm, reinstallFlags, disabledFlags) // Phase 2: Enable PPA repositories if len(ppaPkgs) > 0 { @@ -329,7 +329,7 @@ func (u *UbuntuDistribution) InstallPackages(ctx context.Context, dependencies [ IsComplete: false, LogOutput: fmt.Sprintf("Building from source: %s", strings.Join(manualPkgs, ", ")), } - if err := u.InstallManualPackages(ctx, manualPkgs, sudoPassword, progressChan); err != nil { + if err := u.InstallManualPackages(ctx, manualPkgs, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install manual packages: %w", err) } } @@ -355,11 +355,16 @@ func (u *UbuntuDistribution) InstallPackages(ctx context.Context, dependencies [ return nil } -func (u *UbuntuDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []PackageMapping, []string) { +func (u *UbuntuDistribution) categorizePackages(dependencies []deps.Dependency, wm deps.WindowManager, reinstallFlags map[string]bool, disabledFlags map[string]bool) ([]string, []PackageMapping, []string, map[string]deps.PackageVariant) { systemPkgs := []string{} ppaPkgs := []PackageMapping{} manualPkgs := []string{} + variantMap := make(map[string]deps.PackageVariant) + for _, dep := range dependencies { + variantMap[dep.Name] = dep.Variant + } + packageMap := u.GetPackageMapping(wm) for _, dep := range dependencies { @@ -387,7 +392,7 @@ func (u *UbuntuDistribution) categorizePackages(dependencies []deps.Dependency, } } - return systemPkgs, ppaPkgs, manualPkgs + return systemPkgs, ppaPkgs, manualPkgs, variantMap } func (u *UbuntuDistribution) extractPackageNames(packages []PackageMapping) []string { @@ -729,8 +734,7 @@ func (u *UbuntuDistribution) installGhosttyUbuntu(ctx context.Context, sudoPassw return nil } -// Override InstallManualPackages for Ubuntu to handle Ubuntu-specific installations -func (u *UbuntuDistribution) InstallManualPackages(ctx context.Context, packages []string, sudoPassword string, progressChan chan<- InstallProgressMsg) error { +func (u *UbuntuDistribution) InstallManualPackages(ctx context.Context, packages []string, variantMap map[string]deps.PackageVariant, sudoPassword string, progressChan chan<- InstallProgressMsg) error { if len(packages) == 0 { return nil } @@ -744,8 +748,7 @@ func (u *UbuntuDistribution) InstallManualPackages(ctx context.Context, packages return fmt.Errorf("failed to install ghostty: %w", err) } default: - // Use the base ManualPackageInstaller for other packages - if err := u.ManualPackageInstaller.InstallManualPackages(ctx, []string{pkg}, sudoPassword, progressChan); err != nil { + if err := u.ManualPackageInstaller.InstallManualPackages(ctx, []string{pkg}, variantMap, sudoPassword, progressChan); err != nil { return fmt.Errorf("failed to install %s: %w", pkg, err) } }