sync.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package dep
  2. import (
  3. "context"
  4. "github.com/Jguer/go-alpm/v2"
  5. "github.com/Jguer/yay/v12/pkg/db"
  6. "github.com/Jguer/yay/v12/pkg/dep/topo"
  7. "github.com/Jguer/yay/v12/pkg/text"
  8. )
  9. var (
  10. _ SourceHandler = &AllSyncHandler{}
  11. _ SourceHandler = &AllSyncGroupHandler{}
  12. )
  13. type AllSyncHandler struct {
  14. log *text.Logger
  15. db db.Executor
  16. foundTargets []alpm.IPackage
  17. }
  18. func (h *AllSyncHandler) Test(target Target) bool {
  19. if pkg := h.db.SyncSatisfier(target.Name); pkg != nil {
  20. h.foundTargets = append(h.foundTargets, pkg)
  21. return true
  22. }
  23. return false
  24. }
  25. func (h *AllSyncHandler) Graph(ctx context.Context, graph *topo.Graph[string, *InstallInfo]) error {
  26. for _, pkg := range h.foundTargets {
  27. GraphSyncPkg(ctx, h.db, graph, h.log, pkg, nil)
  28. }
  29. return nil
  30. }
  31. type SyncHandler struct {
  32. log *text.Logger
  33. db db.Executor
  34. foundPkgs []alpm.IPackage
  35. foundGroups []Target
  36. }
  37. func (h *SyncHandler) Test(target Target) bool {
  38. pkg, err := h.db.SatisfierFromDB(target.Name, target.DB)
  39. if err != nil {
  40. h.log.Warnln("Unable to search DB", err)
  41. return false
  42. }
  43. if pkg != nil {
  44. h.foundPkgs = append(h.foundPkgs, pkg)
  45. return true
  46. }
  47. groupPackages, err := h.db.PackagesFromGroupAndDB(target.Name, target.DB)
  48. if err != nil {
  49. h.log.Warnln("Unable to search DB", err)
  50. return false
  51. }
  52. if len(groupPackages) > 0 {
  53. h.foundGroups = append(h.foundGroups, Target{DB: target.DB, Name: target.Name})
  54. return true
  55. }
  56. return false
  57. }
  58. func (h *SyncHandler) Graph(ctx context.Context, graph *topo.Graph[string, *InstallInfo]) error {
  59. for _, pkg := range h.foundPkgs {
  60. GraphSyncPkg(ctx, h.db, graph, h.log, pkg, nil)
  61. }
  62. for _, target := range h.foundGroups {
  63. GraphSyncGroup(ctx, graph, target.Name, target.DB)
  64. }
  65. return nil
  66. }
  67. type AllSyncGroupHandler struct {
  68. db db.Executor
  69. foundTargets []Target
  70. }
  71. func (h *AllSyncGroupHandler) Test(target Target) bool {
  72. groupPackages := h.db.PackagesFromGroup(target.Name)
  73. if len(groupPackages) > 0 {
  74. dbName := groupPackages[0].DB().Name()
  75. h.foundTargets = append(h.foundTargets, Target{DB: dbName, Name: target.Name})
  76. return true
  77. }
  78. return false
  79. }
  80. func (h *AllSyncGroupHandler) Graph(ctx context.Context, graph *topo.Graph[string, *InstallInfo]) error {
  81. for _, target := range h.foundTargets {
  82. GraphSyncGroup(ctx, graph, target.Name, target.DB)
  83. }
  84. return nil
  85. }
  86. func GraphSyncPkg(ctx context.Context, dbExecutor db.Executor,
  87. graph *topo.Graph[string, *InstallInfo], logger *text.Logger,
  88. pkg alpm.IPackage, upgradeInfo *db.SyncUpgrade,
  89. ) *topo.Graph[string, *InstallInfo] {
  90. if graph == nil {
  91. graph = NewGraph()
  92. }
  93. graph.AddNode(pkg.Name())
  94. _ = pkg.Provides().ForEach(func(p *alpm.Depend) error {
  95. logger.Debugln(pkg.Name() + " provides: " + p.String())
  96. graph.Provides(p.Name, p, pkg.Name())
  97. return nil
  98. })
  99. dbName := pkg.DB().Name()
  100. info := &InstallInfo{
  101. Source: Sync,
  102. Reason: Explicit,
  103. Version: pkg.Version(),
  104. SyncDBName: &dbName,
  105. }
  106. if upgradeInfo == nil {
  107. if localPkg := dbExecutor.LocalPackage(pkg.Name()); localPkg != nil {
  108. info.Reason = Reason(localPkg.Reason())
  109. }
  110. } else {
  111. info.Upgrade = true
  112. info.Reason = Reason(upgradeInfo.Reason)
  113. info.LocalVersion = upgradeInfo.LocalVersion
  114. }
  115. validateAndSetNodeInfo(graph, pkg.Name(), &topo.NodeInfo[*InstallInfo]{
  116. Color: colorMap[info.Reason],
  117. Background: bgColorMap[info.Source],
  118. Value: info,
  119. })
  120. return graph
  121. }
  122. func GraphSyncGroup(ctx context.Context,
  123. graph *topo.Graph[string, *InstallInfo],
  124. groupName, dbName string,
  125. ) *topo.Graph[string, *InstallInfo] {
  126. if graph == nil {
  127. graph = NewGraph()
  128. }
  129. graph.AddNode(groupName)
  130. validateAndSetNodeInfo(graph, groupName, &topo.NodeInfo[*InstallInfo]{
  131. Color: colorMap[Explicit],
  132. Background: bgColorMap[Sync],
  133. Value: &InstallInfo{
  134. Source: Sync,
  135. Reason: Explicit,
  136. Version: "",
  137. SyncDBName: &dbName,
  138. IsGroup: true,
  139. },
  140. })
  141. return graph
  142. }