123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- 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")
- }
|