yay/pkg/query/aur_info.go

102 lines
2.1 KiB
Go
Raw Normal View History

2020-07-10 00:36:45 +00:00
package query
import (
2021-05-13 05:27:24 +00:00
"context"
2020-07-10 00:36:45 +00:00
"sync"
2021-05-13 05:27:24 +00:00
"github.com/Jguer/aur"
"github.com/Jguer/aur/rpc"
2020-07-10 00:36:45 +00:00
"github.com/leonelquinteros/gotext"
"github.com/Jguer/yay/v12/pkg/intrange"
"github.com/Jguer/yay/v12/pkg/multierror"
"github.com/Jguer/yay/v12/pkg/text"
2020-07-10 00:36:45 +00:00
)
2021-05-13 05:27:24 +00:00
type Pkg = aur.Pkg
2021-02-16 15:10:04 +00:00
2020-07-10 00:36:45 +00:00
// Queries the aur for information about specified packages.
2021-05-13 05:27:24 +00:00
// All packages should be queried in a single aur request except when the number
2020-07-10 00:36:45 +00:00
// of packages exceeds the number set in config.RequestSplitN.
2021-05-13 05:27:24 +00:00
// If the number does exceed config.RequestSplitN multiple aur requests will be
2020-07-10 00:36:45 +00:00
// performed concurrently.
func AURInfo(ctx context.Context, aurClient rpc.ClientInterface, names []string, warnings *AURWarnings, splitN int) ([]Pkg, error) {
info := make([]Pkg, 0, len(names))
2020-07-10 00:36:45 +00:00
seen := make(map[string]int)
2021-08-11 18:13:28 +00:00
var (
mux sync.Mutex
wg sync.WaitGroup
errs multierror.MultiError
)
2020-07-10 00:36:45 +00:00
makeRequest := func(n, max int) {
defer wg.Done()
2021-08-11 18:13:28 +00:00
2022-11-13 22:53:37 +00:00
text.Debugln("AUR RPC:", names[n:max])
2022-11-15 14:44:50 +00:00
2021-08-12 16:56:23 +00:00
tempInfo, requestErr := aurClient.Info(ctx, names[n:max])
2020-07-10 00:36:45 +00:00
if requestErr != nil {
2021-08-11 18:13:28 +00:00
errs.Add(requestErr)
2020-07-10 00:36:45 +00:00
return
}
2021-08-11 18:13:28 +00:00
2020-07-10 00:36:45 +00:00
mux.Lock()
info = append(info, tempInfo...)
2020-07-10 00:36:45 +00:00
mux.Unlock()
}
for n := 0; n < len(names); n += splitN {
max := intrange.Min(len(names), n+splitN)
2021-08-11 18:13:28 +00:00
2020-07-10 00:36:45 +00:00
wg.Add(1)
2021-08-11 18:13:28 +00:00
2020-07-10 00:36:45 +00:00
go makeRequest(n, max)
}
wg.Wait()
if err := errs.Return(); err != nil {
return info, err
}
for k := range info {
seen[info[k].Name] = k
2020-07-10 00:36:45 +00:00
}
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)
}
2021-08-11 18:13:28 +00:00
2020-07-10 00:36:45 +00:00
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) {
2020-07-10 00:36:45 +00:00
text.OperationInfoln(gotext.Get("Querying AUR..."))
warnings := NewWarnings(nil)
2021-08-11 18:13:28 +00:00
2021-08-12 16:56:23 +00:00
info, err := AURInfo(ctx, aurClient, names, warnings, splitN)
2020-07-10 00:36:45 +00:00
if err != nil {
return info, err
}
warnings.Print()
return info, nil
}