package main import ( "bytes" "fmt" "io" "os" "slices" "sort" "strings" "sync" "github.com/fatih/color" ) func fetchAndDisplay(pkgName string) *statistics { showLoadingPrompt(fmt.Sprintf("What the heck is \"%s\"", pkgName)) stat := initStat(pkgName) fmlChan := make(chan *FormulaInfo) caskChan := make(chan *CaskInfo) rvsChan := make(chan []string) fetchData(pkgName, fmlChan, caskChan, rvsChan) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() var fml *FormulaInfo var cask *CaskInfo var rvs []string prevLines := 0 for i := 0; i < 5; i++ { select { case v := <-fmlChan: fml = v case v := <-caskChan: cask = v case v := <-rvsChan: rvs = v } if i == 0 { hideLoadingPrompt() } else { for j := 0; j < prevLines; j++ { fmt.Print("\033[F\033[K") } } stat = NewStatistics(fml, cask, pkgName, rvs) prevLines = capturePrint(stat) } }() wg.Wait() return stat } func capturePrint(s *statistics) int { r, w, err := os.Pipe() if err != nil { s.Print() return 0 } oldStdout := os.Stdout oldColor := color.Output os.Stdout = w color.Output = w s.Print() w.Close() os.Stdout = oldStdout color.Output = oldColor var buf bytes.Buffer io.Copy(&buf, r) output := buf.String() os.Stdout.WriteString(output) return strings.Count(output, "\n") } func initStat(pkgName string) *statistics { if NoCache { return &statistics{PkgName: pkgName} } stat := NewStatisticsFromCache(pkgName) if stat == nil { return &statistics{PkgName: pkgName} } return stat } func runList() error { depmap := GetBrewDeps() list := GetBrewList() keys := []string{} for k := range depmap { if !slices.Contains(list, k) { delete(depmap, k) } else { keys = append(keys, k) } } if ListAscend { sort.Slice(keys, func(i, j int) bool { return len(depmap[keys[i]]) > len(depmap[keys[j]]) }) } else if ListDescend { sort.Slice(keys, func(i, j int) bool { return len(depmap[keys[i]]) < len(depmap[keys[j]]) }) } else { sort.Strings(keys) } for _, pkg := range keys { deps := depmap[pkg] count := len(deps) color.New(color.FgBlue).Printf("%s", pkg) if count > 1 { fmt.Printf(" (%d dependencies)\n", count) } else { fmt.Printf(" (%d dependency)\n", count) } if ListNoDep { continue } for _, dep := range deps { fmt.Printf(" ► %s\n", dep) } } return nil }