runtime.go 2.8 KB

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