aur_info.go 2.1 KB

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