runtime.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. "golang.org/x/net/proxy"
  21. )
  22. type Runtime struct {
  23. Cfg *settings.Configuration
  24. QueryBuilder query.Builder
  25. PacmanConf *pacmanconf.Config
  26. VCSStore vcs.Store
  27. CmdBuilder exe.ICmdBuilder
  28. HTTPClient *http.Client
  29. VoteClient *vote.Client
  30. AURClient aur.QueryClient
  31. Logger *text.Logger
  32. }
  33. func NewRuntime(cfg *settings.Configuration, cmdArgs *parser.Arguments, version string) (*Runtime, error) {
  34. logger := text.NewLogger(os.Stdout, os.Stderr, os.Stdin, cfg.Debug, "runtime")
  35. runner := exe.NewOSRunner(logger.Child("runner"))
  36. transport := http.DefaultTransport.(*http.Transport).Clone()
  37. if socks5_proxy := os.Getenv("SOCKS5_PROXY"); socks5_proxy != "" {
  38. dialer, err := proxy.SOCKS5("tcp", socks5_proxy, nil, proxy.Direct)
  39. if err != nil {
  40. return nil, err
  41. }
  42. transport = &http.Transport{Dial: dialer.Dial}
  43. }
  44. httpClient := &http.Client{
  45. CheckRedirect: func(req *http.Request, via []*http.Request) error {
  46. return http.ErrUseLastResponse
  47. },
  48. Transport: transport,
  49. }
  50. userAgent := fmt.Sprintf("Yay/%s", version)
  51. voteClient, errVote := vote.NewClient(vote.WithUserAgent(userAgent),
  52. vote.WithHTTPClient(httpClient))
  53. if errVote != nil {
  54. return nil, errVote
  55. }
  56. voteClient.SetCredentials(
  57. os.Getenv("AUR_USERNAME"),
  58. os.Getenv("AUR_PASSWORD"))
  59. userAgentFn := func(ctx context.Context, req *http.Request) error {
  60. req.Header.Set("User-Agent", userAgent)
  61. return nil
  62. }
  63. var aurCache aur.QueryClient
  64. aurCache, errAURCache := metadata.New(
  65. metadata.WithHTTPClient(httpClient),
  66. metadata.WithCacheFilePath(filepath.Join(cfg.BuildDir, "aur.json")),
  67. metadata.WithRequestEditorFn(userAgentFn),
  68. metadata.WithBaseURL(cfg.AURURL),
  69. metadata.WithDebugLogger(logger.Debugln),
  70. )
  71. if errAURCache != nil {
  72. return nil, fmt.Errorf(gotext.Get("failed to retrieve aur Cache")+": %w", errAURCache)
  73. }
  74. aurClient, errAUR := rpc.NewClient(
  75. rpc.WithHTTPClient(httpClient),
  76. rpc.WithBaseURL(cfg.AURRPCURL),
  77. rpc.WithRequestEditorFn(userAgentFn),
  78. rpc.WithLogFn(logger.Debugln))
  79. if errAUR != nil {
  80. return nil, errAUR
  81. }
  82. if cfg.UseRPC {
  83. aurCache = aurClient
  84. }
  85. pacmanConf, useColor, err := retrievePacmanConfig(cmdArgs, cfg.PacmanConf)
  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. run := &Runtime{
  104. Cfg: cfg,
  105. QueryBuilder: queryBuilder,
  106. PacmanConf: pacmanConf,
  107. VCSStore: vcsStore,
  108. CmdBuilder: cmdBuilder,
  109. HTTPClient: &http.Client{},
  110. VoteClient: voteClient,
  111. AURClient: aurCache,
  112. Logger: logger,
  113. }
  114. return run, nil
  115. }