service.go 3.2 KB

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