diff options
Diffstat (limited to 'brewcheck.go')
| -rw-r--r-- | brewcheck.go | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/brewcheck.go b/brewcheck.go new file mode 100644 index 0000000..b811fa6 --- /dev/null +++ b/brewcheck.go @@ -0,0 +1,76 @@ +package main + +import ( + "encoding/json" + "errors" + "os" + "os/exec" + "path/filepath" + "time" + "fmt" + + "github.com/fatih/color" +) + +type BrewCache struct { + Found bool `json:"found"` + Timestamp time.Time `json:"timestamp"` +} + +// Don't check Homebrew installation for a week +const cacheTTL = 7 * 24 * time.Hour + +func EnsureBrewAvailable() { + ok, err := isBrewAvailable() + if err != nil { + color.Red("⚠️ Error checking Homebrew: %v", err) + os.Exit(1) + } + + if !ok { + color.Red("🍺 Homebrew not installed.") + fmt.Println("This tool works only with Homebrew formulae and casks.") + os.Exit(1) + } +} + +func isBrewAvailable() (bool, error) { + cachePath, err := getCacheFile() + if err != nil { + return false, err + } + + // Try to read cache + if data, err := os.ReadFile(cachePath); err == nil { + var cache BrewCache + if json.Unmarshal(data, &cache) == nil { + if time.Since(cache.Timestamp) < cacheTTL { + return cache.Found, nil + } + } + } + + // Perform actual check + _, err = exec.LookPath("brew") + found := err == nil + + // Save to cache + _ = os.MkdirAll(filepath.Dir(cachePath), 0o755) + cache := BrewCache{Found: found, Timestamp: time.Now()} + data, _ := json.Marshal(cache) + _ = os.WriteFile(cachePath, data, 0o644) + + return found, nil +} + +func getCacheFile() (string, error) { + base := os.Getenv("XDG_CACHE_HOME") + if base == "" { + home, err := os.UserHomeDir() + if err != nil { + return "", errors.New("cannot determine user home") + } + base = filepath.Join(home, ".cache") + } + return filepath.Join(base, "wthis", "brew-check.json"), nil +} |
