package providers import ( "fmt" "os" "os/exec" "strconv" "strings" "sync" ) func pathExists(path string) bool { _, err := os.Stat(path) return err == nil } func getPmPackages(packagerName string, packagerPath string) string { if pathExists(packagerPath) { pkgs, err := os.ReadDir(packagerPath) if err != nil { return "error reading " + packagerPath } if packagerName == "pacman" { return strconv.Itoa(len(pkgs)-1) + " (pacman)" } if packagerName == "apk" { out, err := exec.Command("apk", "info").Output() if err != nil { return "error reading apk package list" } pkgsRaw := strings.TrimSpace(string(out)) pkgsList := strings.Split(pkgsRaw, "\n") pkgCount := len(pkgsList) if pkgsRaw == "" { pkgCount = 0 } return fmt.Sprintf("%d (apk)", pkgCount) } return strconv.Itoa(len(pkgs)) + " (" + packagerName + ")" } return "" } func GetPkgs() string { managers := []struct { name, path string }{ {"pacman", "/var/lib/pacman/local"}, {"nix-user", os.Getenv("HOME") + "/.local/state/nix/profiles/profile/bin"}, {"nix", "/run/current-system/sw/bin"}, {"apt", "/var/lib/apt"}, {"dnf", "/var/lib/dnf"}, {"zypper", "/var/lib/zypp"}, {"xbps", "/var/db/xbps"}, {"emerge", "/var/lib/portage"}, {"apk", "/etc/apk/"}, {"flatpak", "/var/lib/flatpak/app"}, } results := make([]string, len(managers)) var wg sync.WaitGroup for i, m := range managers { wg.Add(1) go func(idx int, name, path string) { defer wg.Done() if p := getPmPackages(name, path); p != "" { results[idx] = p } }(i, m.name, m.path) } wg.Wait() var pkgsList []string for _, p := range results { if p != "" { pkgsList = append(pkgsList, p) } } if len(pkgsList) == 0 { return "unknown package manager" } return strings.Join(pkgsList, ", ") }