1
0
mirror of https://github.com/Jguer/yay.git synced 2026-05-04 20:06:09 +02:00
yay/pkg/runtime/runtime.go
2023-09-18 09:22:49 +02:00

179 lines
4.4 KiB
Go

package runtime
import (
"context"
"fmt"
"net/http"
"os"
"path/filepath"
"github.com/leonelquinteros/gotext"
"github.com/Jguer/go-alpm/v2"
"github.com/Jguer/yay/v12/pkg/db"
"github.com/Jguer/yay/v12/pkg/db/ialpm"
"github.com/Jguer/yay/v12/pkg/dep"
"github.com/Jguer/yay/v12/pkg/query"
"github.com/Jguer/yay/v12/pkg/settings"
"github.com/Jguer/yay/v12/pkg/settings/exe"
"github.com/Jguer/yay/v12/pkg/settings/parser"
"github.com/Jguer/yay/v12/pkg/text"
"github.com/Jguer/yay/v12/pkg/vcs"
"github.com/Jguer/aur"
"github.com/Jguer/aur/metadata"
"github.com/Jguer/aur/rpc"
"github.com/Jguer/votar/pkg/vote"
"github.com/Morganamilo/go-pacmanconf"
)
type Runtime struct {
Cfg *settings.Configuration
DB db.Executor
QueryBuilder query.Builder
PacmanConf *pacmanconf.Config
VCSStore vcs.Store
CmdBuilder exe.ICmdBuilder
HTTPClient *http.Client
VoteClient *vote.Client
AURClient aur.QueryClient
Logger *text.Logger
Grapher *dep.Grapher
}
func NewRuntime(cfg *settings.Configuration, cmdArgs *parser.Arguments, version string) (*Runtime, error) {
logger := text.NewLogger(os.Stdout, os.Stderr, os.Stdin, cfg.Debug, "runtime")
runner := exe.NewOSRunner(logger.Child("runner"))
httpClient := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}
userAgent := fmt.Sprintf("Yay/%s", version)
voteClient, errVote := vote.NewClient(vote.WithUserAgent(userAgent),
vote.WithHTTPClient(httpClient))
if errVote != nil {
return nil, errVote
}
voteClient.SetCredentials(
os.Getenv("AUR_USERNAME"),
os.Getenv("AUR_PASSWORD"))
userAgentFn := func(ctx context.Context, req *http.Request) error {
req.Header.Set("User-Agent", userAgent)
return nil
}
var aurCache aur.QueryClient
aurCache, errAURCache := metadata.New(
metadata.WithHTTPClient(httpClient),
metadata.WithCacheFilePath(filepath.Join(cfg.BuildDir, "aur.json")),
metadata.WithRequestEditorFn(userAgentFn),
metadata.WithBaseURL(cfg.AURURL),
metadata.WithDebugLogger(logger.Debugln),
)
if errAURCache != nil {
return nil, fmt.Errorf(gotext.Get("failed to retrieve aur Cache")+": %w", errAURCache)
}
aurClient, errAUR := rpc.NewClient(
rpc.WithHTTPClient(httpClient),
rpc.WithBaseURL(cfg.AURRPCURL),
rpc.WithRequestEditorFn(userAgentFn),
rpc.WithLogFn(logger.Debugln))
if errAUR != nil {
return nil, errAUR
}
if cfg.UseRPC {
aurCache = aurClient
}
pacmanConf, useColor, err := retrievePacmanConfig(cmdArgs, cfg.PacmanConf)
if err != nil {
return nil, err
}
dbExecutor, err := ialpm.NewExecutor(pacmanConf, logger.Child("db"))
if err != nil {
return nil, err
}
// FIXME: get rid of global
text.UseColor = useColor
cmdBuilder := exe.NewCmdBuilder(cfg, runner, logger.Child("cmdbuilder"), pacmanConf.DBPath)
vcsStore := vcs.NewInfoStore(
cfg.VCSFilePath, cmdBuilder,
logger.Child("vcs"))
if err := vcsStore.Load(); err != nil {
return nil, err
}
queryBuilder := query.NewSourceQueryBuilder(
aurClient,
logger.Child("mixed.querybuilder"), cfg.SortBy,
cfg.Mode, cfg.SearchBy,
cfg.BottomUp, cfg.SingleLineResults, cfg.SeparateSources)
grapher := dep.NewGrapher(logger.Child("grapher"))
run := &Runtime{
Cfg: cfg,
DB: dbExecutor,
QueryBuilder: queryBuilder,
PacmanConf: pacmanConf,
VCSStore: vcsStore,
CmdBuilder: cmdBuilder,
HTTPClient: &http.Client{},
VoteClient: voteClient,
AURClient: aurCache,
Logger: logger,
Grapher: grapher,
}
return run, nil
}
func RegisterHandlers(grapher *dep.Grapher) {
grapher.RegisterSourceHandler(&AllSyncHandler{
log: logger,
db: dbExecutor,
foundTargets: []alpm.IPackage{},
}, "")
grapher.RegisterSourceHandler(&AllSyncGroupHandler{
db: dbExecutor,
foundTargets: []Target{},
}, "")
grapher.RegisterSourceHandler(&SRCINFOHandler{
log: logger,
db: dbExecutor,
cmdBuilder: cmdBuilder,
foundTargets: []string{},
}, sourceCacheSRCINFO)
aurHandler := &AURHandler{
log: logger,
db: dbExecutor,
}
grapher.RegisterSourceHandler(aurHandler, "")
for _, repo := range grapher.dbExecutor.Repos() {
grapher.RegisterSourceHandler(&SyncHandler{
log: logger,
db: dbExecutor,
foundPkgs: []alpm.IPackage{},
foundGroups: []Target{},
}, repo)
}
grapher.RegisterSourceHandler(aurHandler, "aur")
}