service.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package srcinfo
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "path/filepath"
  7. gosrc "github.com/Morganamilo/go-srcinfo"
  8. "github.com/leonelquinteros/gotext"
  9. "github.com/Jguer/yay/v12/pkg/db"
  10. "github.com/Jguer/yay/v12/pkg/dep"
  11. "github.com/Jguer/yay/v12/pkg/settings"
  12. "github.com/Jguer/yay/v12/pkg/settings/exe"
  13. "github.com/Jguer/yay/v12/pkg/sync/srcinfo/pgp"
  14. "github.com/Jguer/yay/v12/pkg/text"
  15. "github.com/Jguer/yay/v12/pkg/vcs"
  16. )
  17. type Service struct {
  18. dbExecutor db.Executor
  19. cfg *settings.Configuration
  20. cmdBuilder pgp.GPGCmdBuilder
  21. vcsStore vcs.Store
  22. log *text.Logger
  23. pkgBuildDirs map[string]string
  24. srcInfos map[string]*gosrc.Srcinfo
  25. }
  26. func NewService(dbExecutor db.Executor, cfg *settings.Configuration, logger *text.Logger,
  27. cmdBuilder exe.ICmdBuilder, vcsStore vcs.Store, pkgBuildDirs map[string]string,
  28. ) (*Service, error) {
  29. srcinfos, err := ParseSrcinfoFilesByBase(logger, pkgBuildDirs, true)
  30. if err != nil {
  31. panic(err)
  32. }
  33. return &Service{
  34. dbExecutor: dbExecutor,
  35. cfg: cfg,
  36. cmdBuilder: cmdBuilder,
  37. vcsStore: vcsStore,
  38. pkgBuildDirs: pkgBuildDirs,
  39. srcInfos: srcinfos,
  40. log: logger,
  41. }, nil
  42. }
  43. func (s *Service) IncompatiblePkgs(ctx context.Context) ([]string, error) {
  44. incompatible := []string{}
  45. alpmArch, err := s.dbExecutor.AlpmArchitectures()
  46. if err != nil {
  47. return nil, err
  48. }
  49. nextpkg:
  50. for base, srcinfo := range s.srcInfos {
  51. for _, arch := range srcinfo.Arch {
  52. if db.ArchIsSupported(alpmArch, arch) {
  53. continue nextpkg
  54. }
  55. }
  56. incompatible = append(incompatible, base)
  57. }
  58. return incompatible, nil
  59. }
  60. func (s *Service) CheckPGPKeys(ctx context.Context) error {
  61. _, errCPK := pgp.CheckPgpKeys(ctx, s.log.Child("pgp"), s.pkgBuildDirs, s.srcInfos, s.cmdBuilder, settings.NoConfirm)
  62. return errCPK
  63. }
  64. func (s *Service) UpdateVCSStore(ctx context.Context, targets []map[string]*dep.InstallInfo, ignore map[string]error,
  65. ) error {
  66. for _, srcinfo := range s.srcInfos {
  67. if srcinfo.Source == nil {
  68. continue
  69. }
  70. // TODO: high complexity - refactor
  71. for i := range srcinfo.Packages {
  72. for j := range targets {
  73. if _, ok := targets[j][srcinfo.Packages[i].Pkgname]; !ok {
  74. s.log.Debugln("skipping VCS update for", srcinfo.Packages[i].Pkgname, "not in targets")
  75. continue
  76. }
  77. if _, ok := ignore[srcinfo.Packages[i].Pkgname]; ok {
  78. s.log.Debugln("skipping VCS update for", srcinfo.Packages[i].Pkgname, "due to install error")
  79. continue
  80. }
  81. s.log.Debugln("checking VCS entry for", srcinfo.Packages[i].Pkgname, fmt.Sprintf("source: %v", srcinfo.Source))
  82. s.vcsStore.Update(ctx, srcinfo.Packages[i].Pkgname, srcinfo.Source)
  83. }
  84. }
  85. }
  86. return nil
  87. }
  88. func ParseSrcinfoFilesByBase(logger *text.Logger, pkgBuildDirs map[string]string, errIsFatal bool) (map[string]*gosrc.Srcinfo, error) {
  89. srcinfos := make(map[string]*gosrc.Srcinfo)
  90. k := 0
  91. for base, dir := range pkgBuildDirs {
  92. logger.OperationInfoln(gotext.Get("(%d/%d) Parsing SRCINFO: %s", k+1, len(pkgBuildDirs), text.Cyan(base)))
  93. pkgbuild, err := gosrc.ParseFile(filepath.Join(dir, ".SRCINFO"))
  94. if err != nil {
  95. if !errIsFatal {
  96. logger.Warnln(gotext.Get("failed to parse %s -- skipping: %s", base, err))
  97. continue
  98. }
  99. return nil, errors.New(gotext.Get("failed to parse %s: %s", base, err))
  100. }
  101. srcinfos[base] = pkgbuild
  102. k++
  103. }
  104. return srcinfos, nil
  105. }