From 3f892b66057981c6a959bef18d09b24e011ad51f Mon Sep 17 00:00:00 2001 From: nekohepott Date: Wed, 17 Jun 2026 04:16:28 +0300 Subject: [PATCH] goroutines --- src/providers/packages.go | 45 +++++++++++++++++++++++++----------- src/providers/systemstats.go | 31 ++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/src/providers/packages.go b/src/providers/packages.go index 4b33823..095e52f 100644 --- a/src/providers/packages.go +++ b/src/providers/packages.go @@ -6,6 +6,7 @@ import ( "os/exec" "strconv" "strings" + "sync" ) func pathExists(path string) bool { @@ -44,28 +45,46 @@ func getPmPackages(packagerName string, packagerPath string) string { } func GetPkgs() string { - rawPkgs := []string{ - getPmPackages("pacman", "/var/lib/pacman/local"), - getPmPackages("apt", "/var/lib/apt"), - getPmPackages("dnf", "/var/lib/dnf"), - 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/"), - getPmPackages("flatpak", "/var/lib/flatpak/app"), + managers := []struct { + name, path string + }{ + {"pacman", "/var/lib/pacman/local"}, + {"nix-user", "~/.nix-profile/lib/nix/profiles/per-user"}, + {"nix", "/nix/store"}, + {"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 rawPkgs { + for _, p := range results { if p != "" { pkgsList = append(pkgsList, p) } } + if len(pkgsList) == 0 { return "unknown package manager" } - return strings.Join(pkgsList[:], ", ") + return strings.Join(pkgsList, ", ") } diff --git a/src/providers/systemstats.go b/src/providers/systemstats.go index 40cfb84..5af60ee 100644 --- a/src/providers/systemstats.go +++ b/src/providers/systemstats.go @@ -15,6 +15,8 @@ import ( var id, prettyName string +const gpuCacheFile = "/tmp/gogofetch_gpu_cache" + func GetDist() (string, string) { f, _ := os.Open("/etc/os-release") defer func(f *os.File) { @@ -96,10 +98,28 @@ func GetCpu() string { return strings.TrimSpace(cpu) } +func readGpuCache() (string, bool) { + data, err := os.ReadFile(gpuCacheFile) + if err != nil { + return "", false + } + return strings.TrimSpace(string(data)), true +} + +func writeGpuCache(gpuData string) { + _ = os.WriteFile(gpuCacheFile, []byte(gpuData), 0644) +} + func GetGpu() string { + if cached, ok := readGpuCache(); ok && cached != "" { + return cached + } + out, err := exec.Command("sh", "-c", `lspci -mm | awk -F'"' '$2=="VGA compatible controller" || $2=="3D controller" || $2=="Display controller"'`).Output() if err != nil || len(out) == 0 { - return "unknown GPU" + result := "unknown GPU" + writeGpuCache(result) + return result } lines := strings.Split(strings.TrimSpace(string(out)), "\n") @@ -118,10 +138,15 @@ func GetGpu() string { } } + var result string if len(gpus) > 0 { - return strings.Join(gpus, " / ") + result = strings.Join(gpus, " / ") + } else { + result = "GPU not found" } - return "GPU not found" + + writeGpuCache(result) + return result } func cleanGpuString(raw string) string {