aur_info.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package query
  2. import (
  3. "context"
  4. "sync"
  5. "github.com/Jguer/aur"
  6. "github.com/leonelquinteros/gotext"
  7. "github.com/Jguer/yay/v10/pkg/intrange"
  8. "github.com/Jguer/yay/v10/pkg/multierror"
  9. "github.com/Jguer/yay/v10/pkg/text"
  10. )
  11. type Pkg = aur.Pkg
  12. // Queries the aur for information about specified packages.
  13. // All packages should be queried in a single aur request except when the number
  14. // of packages exceeds the number set in config.RequestSplitN.
  15. // If the number does exceed config.RequestSplitN multiple aur requests will be
  16. // performed concurrently.
  17. func AURInfo(aurClient *aur.Client, names []string, warnings *AURWarnings, splitN int) ([]*Pkg, error) {
  18. info := make([]*Pkg, 0, len(names))
  19. seen := make(map[string]int)
  20. var mux sync.Mutex
  21. var wg sync.WaitGroup
  22. var errs multierror.MultiError
  23. makeRequest := func(n, max int) {
  24. defer wg.Done()
  25. tempInfo, requestErr := aurClient.Info(context.Background(), names[n:max])
  26. errs.Add(requestErr)
  27. if requestErr != nil {
  28. return
  29. }
  30. mux.Lock()
  31. for i := range tempInfo {
  32. info = append(info, &tempInfo[i])
  33. }
  34. mux.Unlock()
  35. }
  36. for n := 0; n < len(names); n += splitN {
  37. max := intrange.Min(len(names), n+splitN)
  38. wg.Add(1)
  39. go makeRequest(n, max)
  40. }
  41. wg.Wait()
  42. if err := errs.Return(); err != nil {
  43. return info, err
  44. }
  45. for k, pkg := range info {
  46. seen[pkg.Name] = k
  47. }
  48. for _, name := range names {
  49. i, ok := seen[name]
  50. if !ok && !warnings.Ignore.Get(name) {
  51. warnings.Missing = append(warnings.Missing, name)
  52. continue
  53. }
  54. pkg := info[i]
  55. if pkg.Maintainer == "" && !warnings.Ignore.Get(name) {
  56. warnings.Orphans = append(warnings.Orphans, name)
  57. }
  58. if pkg.OutOfDate != 0 && !warnings.Ignore.Get(name) {
  59. warnings.OutOfDate = append(warnings.OutOfDate, name)
  60. }
  61. }
  62. return info, nil
  63. }
  64. func AURInfoPrint(aurClient *aur.Client, names []string, splitN int) ([]*Pkg, error) {
  65. text.OperationInfoln(gotext.Get("Querying AUR..."))
  66. warnings := &AURWarnings{}
  67. info, err := AURInfo(aurClient, names, warnings, splitN)
  68. if err != nil {
  69. return info, err
  70. }
  71. warnings.Print()
  72. return info, nil
  73. }