feat(PikaOS): add official support & installer options

Fixes #2772
This commit is contained in:
purian23 committed 2026-10-20 02:38:30 -04:00
1 parent 8be08999ca
commit bdc6a5d214
4 files changed
+95

No files matched your search

+4
View File
@@ -53,6 +53,10 @@ func greeterPackageInstallHint() string {
return "Install package: dms-greeter"
}
if config.ID == "pika" {
return "Install with 'sudo apt install dms-greeter'"
}
switch config.Family {
case distros.FamilyDebian:
return "Install with 'sudo apt install dms-greeter' (requires DankLinux OBS repo — see " + site.Docs + "/dankgreeter/installation#debian)"
+8
View File
@@ -70,6 +70,11 @@ func (d *DebianDistribution) DetectDependenciesWithTerminal(ctx context.Context,
dependencies = append(dependencies, d.detectXwaylandSatellite())
}
if wm == deps.WindowManagerHyprland && d.isPika() {
dependencies = append(dependencies, d.detectHyprlandTools()...)
dependencies = append(dependencies, d.detectHyprlandGuiutils())
}
dependencies = append(dependencies, d.detectMatugen())
dependencies = append(dependencies, d.detectDanksearch())
dependencies = append(dependencies, withGitVariant(d.detectDankCalendar(), d.packageInstalled("dankcalendar-git")))
@@ -140,6 +145,9 @@ func (d *DebianDistribution) GetPackageMapping(wm deps.WindowManager) map[string
}
func (d *DebianDistribution) GetPackageMappingWithVariants(wm deps.WindowManager, variants map[string]deps.PackageVariant) map[string]PackageMapping {
if d.isPika() {
return d.pikaPackageMapping(wm, variants)
}
packages := map[string]PackageMapping{
// Standard APT packages
"git": {Name: "git", Repository: RepoTypeSystem},
+50
View File
@@ -0,0 +1,50 @@
package distros
import (
"github.com/AvengeMedia/DankMaterialShell/core/internal/deps"
)
// PikaOS carries the whole DMS stack in its own apt repo, so no OBS repos or backports.
func init() {
Register("pika", "#FFDE34", FamilyDebian, func(config DistroConfig, logChan chan<- string) Distribution {
return NewDebianDistribution(config, logChan)
})
}
func (d *DebianDistribution) isPika() bool {
return d.config.ID == "pika"
}
func (d *DebianDistribution) pikaPackageMapping(wm deps.WindowManager, variants map[string]deps.PackageVariant) map[string]PackageMapping {
system := func(name string) PackageMapping {
return PackageMapping{Name: name, Repository: RepoTypeSystem}
}
packages := map[string]PackageMapping{
"git": system("git"),
"kitty": system("kitty"),
"alacritty": system("alacritty"),
"ghostty": system("ghostty"),
"xdg-desktop-portal-gtk": system("xdg-desktop-portal-gtk"),
"accountsservice": system("accountsservice"),
"dms (DankMaterialShell)": variantMapping("dms", variants["dms (DankMaterialShell)"], RepoTypeSystem, ""),
"quickshell": variantMapping("quickshell", variants["quickshell"], RepoTypeSystem, ""),
"dms-greeter": variantMapping("dms-greeter", variants["dms-greeter"], RepoTypeSystem, ""),
"matugen": system("matugen"),
"danksearch": system("danksearch"),
"dankcalendar": variantMapping("dankcalendar", variants["dankcalendar"], RepoTypeSystem, ""),
}
switch wm {
case deps.WindowManagerHyprland:
packages["hyprland"] = system("hyprland")
packages["hyprctl"] = system("hyprland")
packages["jq"] = system("jq")
// Debian's hyprland-guiutils breaks the hyprland-qtutils PikaOS's hyprland depends on.
packages["hyprland-guiutils"] = system("hyprland-qtutils")
case deps.WindowManagerNiri:
packages["niri"] = variantMapping("niri", variants["niri"], RepoTypeSystem, "")
packages["xwayland-satellite"] = variantMapping("xwayland-satellite", variants["niri"], RepoTypeSystem, "")
}
return packages
}
+33
View File
@@ -0,0 +1,33 @@
package distros
import (
"testing"
"github.com/AvengeMedia/DankMaterialShell/core/internal/deps"
)
func TestPikaPackageMapping_SystemRepoOnly(t *testing.T) {
d := NewDebianDistribution(Registry["pika"], nil)
variants := map[string]deps.PackageVariant{
"quickshell": deps.VariantGit,
"dms (DankMaterialShell)": deps.VariantGit,
}
for _, wm := range []deps.WindowManager{deps.WindowManagerNiri, deps.WindowManagerHyprland} {
packages := d.GetPackageMappingWithVariants(wm, variants)
for name, pkg := range packages {
if pkg.Repository != RepoTypeSystem {
t.Errorf("%v: pika maps %s to %s, want system repo", wm, name, pkg.Repository)
}
}
if packages["dms (DankMaterialShell)"].Name != "dms-git" {
t.Errorf("%v: dms git variant = %s, want dms-git", wm, packages["dms (DankMaterialShell)"].Name)
}
}
hypr := d.GetPackageMapping(deps.WindowManagerHyprland)
if _, ok := hypr["hyprland"]; !ok {
t.Error("pika offers hyprland but maps no package for it")
}
if hypr["hyprland-guiutils"].Name != "hyprland-qtutils" {
t.Errorf("hyprland-guiutils = %s, want hyprland-qtutils", hypr["hyprland-guiutils"].Name)
}
}