123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package query
- import (
- "context"
- "sync"
- "github.com/Jguer/aur"
- "github.com/Jguer/aur/rpc"
- "github.com/leonelquinteros/gotext"
- "github.com/Jguer/yay/v11/pkg/intrange"
- "github.com/Jguer/yay/v11/pkg/multierror"
- "github.com/Jguer/yay/v11/pkg/text"
- )
- type Pkg = aur.Pkg
- // Queries the aur for information about specified packages.
- // All packages should be queried in a single aur request except when the number
- // of packages exceeds the number set in config.RequestSplitN.
- // If the number does exceed config.RequestSplitN multiple aur requests will be
- // performed concurrently.
- func AURInfo(ctx context.Context, aurClient rpc.ClientInterface, names []string, warnings *AURWarnings, splitN int) ([]Pkg, error) {
- info := make([]Pkg, 0, len(names))
- seen := make(map[string]int)
- var (
- mux sync.Mutex
- wg sync.WaitGroup
- errs multierror.MultiError
- )
- makeRequest := func(n, max int) {
- defer wg.Done()
- text.Debugln("AUR RPC:", names[n:max])
- tempInfo, requestErr := aurClient.Info(ctx, names[n:max])
- if requestErr != nil {
- errs.Add(requestErr)
- return
- }
- mux.Lock()
- info = append(info, tempInfo...)
- mux.Unlock()
- }
- for n := 0; n < len(names); n += splitN {
- max := intrange.Min(len(names), n+splitN)
- wg.Add(1)
- go makeRequest(n, max)
- }
- wg.Wait()
- if err := errs.Return(); err != nil {
- return info, err
- }
- for k := range info {
- seen[info[k].Name] = k
- }
- for _, name := range names {
- i, ok := seen[name]
- if !ok && !warnings.Ignore.Get(name) {
- warnings.Missing = append(warnings.Missing, name)
- continue
- }
- pkg := info[i]
- if pkg.Maintainer == "" && !warnings.Ignore.Get(name) {
- warnings.Orphans = append(warnings.Orphans, name)
- }
- if pkg.OutOfDate != 0 && !warnings.Ignore.Get(name) {
- warnings.OutOfDate = append(warnings.OutOfDate, name)
- }
- }
- return info, nil
- }
- func AURInfoPrint(ctx context.Context, aurClient rpc.ClientInterface, names []string, splitN int) ([]Pkg, error) {
- text.OperationInfoln(gotext.Get("Querying AUR..."))
- warnings := &AURWarnings{}
- info, err := AURInfo(ctx, aurClient, names, warnings, splitN)
- if err != nil {
- return info, err
- }
- warnings.Print()
- return info, nil
- }
|