runtime.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package settings
  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/db"
  10. "github.com/Jguer/yay/v12/pkg/query"
  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. QueryBuilder query.Builder
  23. PacmanConf *pacmanconf.Config
  24. VCSStore vcs.Store
  25. CmdBuilder exe.ICmdBuilder
  26. HTTPClient *http.Client
  27. AURClient *rpc.Client
  28. VoteClient *vote.Client
  29. AURCache aur.QueryClient
  30. DBExecutor db.Executor
  31. Logger *text.Logger
  32. }
  33. func BuildRuntime(cfg *Configuration, cmdArgs *parser.Arguments, version string) (*Runtime, error) {
  34. logger := text.NewLogger(os.Stdout, os.Stdin, cfg.Debug, "runtime")
  35. cmdBuilder := cfg.CmdBuilder(nil)
  36. httpClient := &http.Client{
  37. CheckRedirect: func(req *http.Request, via []*http.Request) error {
  38. return http.ErrUseLastResponse
  39. },
  40. }
  41. userAgent := fmt.Sprintf("Yay/%s", version)
  42. voteClient, errVote := vote.NewClient(vote.WithUserAgent(userAgent),
  43. vote.WithHTTPClient(httpClient))
  44. if errVote != nil {
  45. return nil, errVote
  46. }
  47. voteClient.SetCredentials(
  48. os.Getenv("AUR_USERNAME"),
  49. os.Getenv("AUR_PASSWORD"))
  50. userAgentFn := func(ctx context.Context, req *http.Request) error {
  51. req.Header.Set("User-Agent", userAgent)
  52. return nil
  53. }
  54. var aurCache aur.QueryClient
  55. aurCache, errAURCache := metadata.New(
  56. metadata.WithHTTPClient(httpClient),
  57. metadata.WithCacheFilePath(filepath.Join(cfg.BuildDir, "aur.json")),
  58. metadata.WithRequestEditorFn(userAgentFn),
  59. metadata.WithBaseURL(cfg.AURURL),
  60. metadata.WithDebugLogger(logger.Debugln),
  61. )
  62. if errAURCache != nil {
  63. return nil, fmt.Errorf(gotext.Get("failed to retrieve aur Cache")+": %w", errAURCache)
  64. }
  65. aurClient, errAUR := rpc.NewClient(
  66. rpc.WithHTTPClient(httpClient),
  67. rpc.WithBaseURL(cfg.AURRPCURL),
  68. rpc.WithRequestEditorFn(userAgentFn),
  69. rpc.WithLogFn(logger.Debugln))
  70. if errAUR != nil {
  71. return nil, errAUR
  72. }
  73. if cfg.UseRPC {
  74. aurCache = aurClient
  75. }
  76. vcsStore := vcs.NewInfoStore(
  77. cfg.VCSFilePath, cmdBuilder,
  78. logger.Child("vcs"))
  79. if err := vcsStore.Load(); err != nil {
  80. return nil, err
  81. }
  82. runtime := &Runtime{
  83. QueryBuilder: nil,
  84. PacmanConf: nil,
  85. VCSStore: vcsStore,
  86. CmdBuilder: cmdBuilder,
  87. HTTPClient: &http.Client{},
  88. AURClient: aurClient,
  89. VoteClient: voteClient,
  90. AURCache: aurCache,
  91. DBExecutor: nil,
  92. Logger: text.NewLogger(os.Stdout, os.Stdin, cfg.Debug, "runtime"),
  93. }
  94. return runtime, nil
  95. }