runtime.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package runtime
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "path/filepath"
  8. "github.com/leonelquinteros/gotext"
  9. "github.com/Jguer/go-alpm/v2"
  10. "github.com/Jguer/yay/v12/pkg/db"
  11. "github.com/Jguer/yay/v12/pkg/db/ialpm"
  12. "github.com/Jguer/yay/v12/pkg/dep"
  13. "github.com/Jguer/yay/v12/pkg/query"
  14. "github.com/Jguer/yay/v12/pkg/settings"
  15. "github.com/Jguer/yay/v12/pkg/settings/exe"
  16. "github.com/Jguer/yay/v12/pkg/settings/parser"
  17. "github.com/Jguer/yay/v12/pkg/text"
  18. "github.com/Jguer/yay/v12/pkg/vcs"
  19. "github.com/Jguer/aur"
  20. "github.com/Jguer/aur/metadata"
  21. "github.com/Jguer/aur/rpc"
  22. "github.com/Jguer/votar/pkg/vote"
  23. "github.com/Morganamilo/go-pacmanconf"
  24. )
  25. type Runtime struct {
  26. Cfg *settings.Configuration
  27. DB db.Executor
  28. QueryBuilder query.Builder
  29. PacmanConf *pacmanconf.Config
  30. VCSStore vcs.Store
  31. CmdBuilder exe.ICmdBuilder
  32. HTTPClient *http.Client
  33. VoteClient *vote.Client
  34. AURClient aur.QueryClient
  35. Logger *text.Logger
  36. Grapher *dep.Grapher
  37. }
  38. func NewRuntime(cfg *settings.Configuration, cmdArgs *parser.Arguments, version string) (*Runtime, error) {
  39. logger := text.NewLogger(os.Stdout, os.Stderr, os.Stdin, cfg.Debug, "runtime")
  40. runner := exe.NewOSRunner(logger.Child("runner"))
  41. httpClient := &http.Client{
  42. CheckRedirect: func(req *http.Request, via []*http.Request) error {
  43. return http.ErrUseLastResponse
  44. },
  45. }
  46. userAgent := fmt.Sprintf("Yay/%s", version)
  47. voteClient, errVote := vote.NewClient(vote.WithUserAgent(userAgent),
  48. vote.WithHTTPClient(httpClient))
  49. if errVote != nil {
  50. return nil, errVote
  51. }
  52. voteClient.SetCredentials(
  53. os.Getenv("AUR_USERNAME"),
  54. os.Getenv("AUR_PASSWORD"))
  55. userAgentFn := func(ctx context.Context, req *http.Request) error {
  56. req.Header.Set("User-Agent", userAgent)
  57. return nil
  58. }
  59. var aurCache aur.QueryClient
  60. aurCache, errAURCache := metadata.New(
  61. metadata.WithHTTPClient(httpClient),
  62. metadata.WithCacheFilePath(filepath.Join(cfg.BuildDir, "aur.json")),
  63. metadata.WithRequestEditorFn(userAgentFn),
  64. metadata.WithBaseURL(cfg.AURURL),
  65. metadata.WithDebugLogger(logger.Debugln),
  66. )
  67. if errAURCache != nil {
  68. return nil, fmt.Errorf(gotext.Get("failed to retrieve aur Cache")+": %w", errAURCache)
  69. }
  70. aurClient, errAUR := rpc.NewClient(
  71. rpc.WithHTTPClient(httpClient),
  72. rpc.WithBaseURL(cfg.AURRPCURL),
  73. rpc.WithRequestEditorFn(userAgentFn),
  74. rpc.WithLogFn(logger.Debugln))
  75. if errAUR != nil {
  76. return nil, errAUR
  77. }
  78. if cfg.UseRPC {
  79. aurCache = aurClient
  80. }
  81. pacmanConf, useColor, err := retrievePacmanConfig(cmdArgs, cfg.PacmanConf)
  82. if err != nil {
  83. return nil, err
  84. }
  85. dbExecutor, err := ialpm.NewExecutor(pacmanConf, logger.Child("db"))
  86. if err != nil {
  87. return nil, err
  88. }
  89. // FIXME: get rid of global
  90. text.UseColor = useColor
  91. cmdBuilder := exe.NewCmdBuilder(cfg, runner, logger.Child("cmdbuilder"), pacmanConf.DBPath)
  92. vcsStore := vcs.NewInfoStore(
  93. cfg.VCSFilePath, cmdBuilder,
  94. logger.Child("vcs"))
  95. if err := vcsStore.Load(); err != nil {
  96. return nil, err
  97. }
  98. queryBuilder := query.NewSourceQueryBuilder(
  99. aurClient,
  100. logger.Child("mixed.querybuilder"), cfg.SortBy,
  101. cfg.Mode, cfg.SearchBy,
  102. cfg.BottomUp, cfg.SingleLineResults, cfg.SeparateSources)
  103. grapher := dep.NewGrapher(logger.Child("grapher"))
  104. run := &Runtime{
  105. Cfg: cfg,
  106. DB: dbExecutor,
  107. QueryBuilder: queryBuilder,
  108. PacmanConf: pacmanConf,
  109. VCSStore: vcsStore,
  110. CmdBuilder: cmdBuilder,
  111. HTTPClient: &http.Client{},
  112. VoteClient: voteClient,
  113. AURClient: aurCache,
  114. Logger: logger,
  115. Grapher: grapher,
  116. }
  117. return run, nil
  118. }
  119. func RegisterHandlers(grapher *dep.Grapher) {
  120. grapher.RegisterSourceHandler(&AllSyncHandler{
  121. log: logger,
  122. db: dbExecutor,
  123. foundTargets: []alpm.IPackage{},
  124. }, "")
  125. grapher.RegisterSourceHandler(&AllSyncGroupHandler{
  126. db: dbExecutor,
  127. foundTargets: []Target{},
  128. }, "")
  129. grapher.RegisterSourceHandler(&SRCINFOHandler{
  130. log: logger,
  131. db: dbExecutor,
  132. cmdBuilder: cmdBuilder,
  133. foundTargets: []string{},
  134. }, sourceCacheSRCINFO)
  135. aurHandler := &AURHandler{
  136. log: logger,
  137. db: dbExecutor,
  138. }
  139. grapher.RegisterSourceHandler(aurHandler, "")
  140. for _, repo := range grapher.dbExecutor.Repos() {
  141. grapher.RegisterSourceHandler(&SyncHandler{
  142. log: logger,
  143. db: dbExecutor,
  144. foundPkgs: []alpm.IPackage{},
  145. foundGroups: []Target{},
  146. }, repo)
  147. }
  148. grapher.RegisterSourceHandler(aurHandler, "aur")
  149. }