package providers import ( "fmt" "os" "os/exec" "strconv" "strings" ) 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 { rawPkgs := []string{ getPmPackages("pacman", "/var/lib/pacman/local"), getPmPackages("apt", "/var/lib/apt"), getPmPackages("dnf", "/var/lib/dnf"), getPmPackages("flatpak", "/var/lib/flatpak"), getPmPackages("zypper", "/var/lib/zypp"), getPmPackages("xbps", "/var/db/xbps"), getPmPackages("emerge", "/var/lib/portage"), getPmPackages("nix-user", "~/.nix-profile/lib/nix/profiles/per-user"), getPmPackages("nix", "/nix/store"), getPmPackages("apk", "/etc/apk/"), } var pkgsList []string for _, p := range rawPkgs { if p != "" { pkgsList = append(pkgsList, p) } } if len(pkgsList) == 0 { return "unknown package manager" } return strings.Join(pkgsList[:], ", ") }