package main import ( "context" "fmt" "log" "os" "github.com/fatih/color" "github.com/urfave/cli/v3" ) var NoCache, DoClearCache bool var ListAscend, ListDescend, ListNoDep bool func main() { EnsureBrewAvailable() cmd := &cli.Command{ Name: "wthis", Usage: "Fetch information of a Homebrew formulae or cask, like how it got installed, reverse dependencies, etc.", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "no-cache", Aliases: []string{"nc"}, Usage: "Disable caching", Value: false, Destination: &NoCache, }, }, Action: func(ctx context.Context, cmd *cli.Command) error { if DoClearCache { ClearCache() fmt.Println("Cache cleared.") os.Exit(0) } if cmd.Args().Len() == 0 { printErrorAndExit("Please provide a formulae/cask name.") } pkgName := cmd.Args().First() stat := fetchAndDisplay(pkgName) if !NoCache { stat.Cache() } return nil }, Commands: []*cli.Command{ { Name: "list", Aliases: []string{"l", "ls"}, Usage: "Better brew list.", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "ascending", Aliases: []string{"a"}, Usage: "Sort list ascendingly, based on dependency count.", Value: false, Destination: &ListAscend, }, &cli.BoolFlag{ Name: "descending", Aliases: []string{"d"}, Usage: "Sort list descendingly, based on dependency count.", Value: false, Destination: &ListDescend, }, &cli.BoolFlag{ Name: "no-dependency", Aliases: []string{"n", "nd"}, Usage: "Only show packages installed on request, with no dependency list.", Value: false, Destination: &ListNoDep, }, }, Action: func(ctx context.Context, cmd *cli.Command) error { return runList() }, }, { Name: "clean", Aliases: []string{"c", "cache"}, Usage: "Delete all cache files.", Action: func(ctx context.Context, cmd *cli.Command) error { ClearCache() fmt.Println("Cache cleared.") return nil }, }, }, } if err := cmd.Run(context.Background(), os.Args); err != nil { log.Fatal(err) } } func fetchData(pkgName string, fmlChan chan *FormulaInfo, caskChan chan *CaskInfo, rvsChan chan []string) { go func() { formula, cask := GetBrewInfo(pkgName) fmlChan <- formula caskChan <- cask }() go func() { fmlChan <- GetFormulaFromAPI(pkgName) }() go func() { caskChan <- GetCaskFromAPI(pkgName) }() go func() { rvsChan <- GetBrewUses(pkgName) }() } func printErrorAndExit(msg string) { hideLoadingPrompt() color.Red("❌ %s", msg) os.Exit(1) }