aur_info.go 2.0 KB

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