runtime.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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/yay/v12/pkg/query"
  10. "github.com/Jguer/yay/v12/pkg/settings"
  11. "github.com/Jguer/yay/v12/pkg/settings/exe"
  12. "github.com/Jguer/yay/v12/pkg/settings/parser"
  13. "github.com/Jguer/yay/v12/pkg/text"
  14. "github.com/Jguer/yay/v12/pkg/vcs"
  15. "github.com/Jguer/aur"
  16. "github.com/Jguer/aur/metadata"
  17. "github.com/Jguer/aur/rpc"
  18. "github.com/Jguer/votar/pkg/vote"
  19. "github.com/Morganamilo/go-pacmanconf"
  20. )
  21. type Runtime struct {
  22. Cfg *settings.Configuration
  23. QueryBuilder query.Builder
  24. PacmanConf *pacmanconf.Config
  25. VCSStore vcs.Store
  26. CmdBuilder exe.ICmdBuilder
  27. HTTPClient *http.Client
  28. VoteClient *vote.Client
  29. AURClient aur.QueryClient
  30. Logger *text.Logger
  31. }
  32. func NewRuntime(cfg *settings.Configuration, cmdArgs *parser.Arguments, version string) (*Runtime, error) {
  33. logger := text.NewLogger(os.Stdout, os.Stderr, os.Stdin, cfg.Debug, "runtime")
  34. runner := exe.NewOSRunner(logger.Child("runner"))
  35. httpClient := &http.Client{
  36. CheckRedirect: func(req *http.Request, via []*http.Request) error {
  37. return http.ErrUseLastResponse
  38. },
  39. }
  40. userAgent := fmt.Sprintf("Yay/%s", version)
  41. voteClient, errVote := vote.NewClient(vote.WithUserAgent(userAgent),
  42. vote.WithHTTPClient(httpClient))
  43. if errVote != nil {
  44. return nil, errVote
  45. }
  46. voteClient.SetCredentials(
  47. os.Getenv("AUR_USERNAME"),
  48. os.Getenv("AUR_PASSWORD"))
  49. userAgentFn := func(ctx context.Context, req *http.Request) error {
  50. req.Header.Set("User-Agent", userAgent)
  51. return nil
  52. }
  53. var aurCache aur.QueryClient
  54. aurCache, errAURCache := metadata.New(
  55. metadata.WithHTTPClient(httpClient),
  56. metadata.WithCacheFilePath(filepath.Join(cfg.BuildDir, "aur.json")),
  57. metadata.WithRequestEditorFn(userAgentFn),
  58. metadata.WithBaseURL(cfg.AURURL),
  59. metadata.WithDebugLogger(logger.Debugln),
  60. )
  61. if errAURCache != nil {
  62. return nil, fmt.Errorf(gotext.Get("failed to retrieve aur Cache")+": %w", errAURCache)
  63. }
  64. aurClient, errAUR := rpc.NewClient(
  65. rpc.WithHTTPClient(httpClient),
  66. rpc.WithBaseURL(cfg.AURRPCURL),
  67. rpc.WithRequestEditorFn(userAgentFn),
  68. rpc.WithLogFn(logger.Debugln))
  69. if errAUR != nil {
  70. return nil, errAUR
  71. }
  72. if cfg.UseRPC {
  73. aurCache = aurClient
  74. }
  75. pacmanConf, useColor, err := retrievePacmanConfig(cmdArgs, cfg.PacmanConf)
  76. if err != nil {
  77. return nil, err
  78. }
  79. // FIXME: get rid of global
  80. text.UseColor = useColor
  81. cmdBuilder := exe.NewCmdBuilder(cfg, runner, logger.Child("cmdbuilder"), pacmanConf.DBPath)
  82. vcsStore := vcs.NewInfoStore(
  83. cfg.VCSFilePath, cmdBuilder,
  84. logger.Child("vcs"))
  85. if err := vcsStore.Load(); err != nil {
  86. return nil, err
  87. }
  88. queryBuilder := query.NewSourceQueryBuilder(
  89. aurClient,
  90. logger.Child("mixed.querybuilder"), cfg.SortBy,
  91. cfg.Mode, cfg.SearchBy,
  92. cfg.BottomUp, cfg.SingleLineResults, cfg.SeparateSources)
  93. run := &Runtime{
  94. Cfg: cfg,
  95. QueryBuilder: queryBuilder,
  96. PacmanConf: pacmanConf,
  97. VCSStore: vcsStore,
  98. CmdBuilder: cmdBuilder,
  99. HTTPClient: &http.Client{},
  100. VoteClient: voteClient,
  101. AURClient: aurCache,
  102. Logger: logger,
  103. }
  104. return run, nil
  105. }