depOrder.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package dep
  2. import (
  3. "fmt"
  4. "github.com/Jguer/yay/v11/pkg/db"
  5. aur "github.com/Jguer/yay/v11/pkg/query"
  6. "github.com/Jguer/yay/v11/pkg/stringset"
  7. "github.com/Jguer/yay/v11/pkg/text"
  8. )
  9. type Order struct {
  10. Aur []Base
  11. Repo []db.IPackage
  12. Runtime stringset.StringSet
  13. }
  14. func newOrder() *Order {
  15. return &Order{
  16. make([]Base, 0),
  17. make([]db.IPackage, 0),
  18. make(stringset.StringSet),
  19. }
  20. }
  21. func GetOrder(dp *Pool, noDeps, noCheckDeps bool) *Order {
  22. do := newOrder()
  23. for _, target := range dp.Targets {
  24. dep := target.DepString()
  25. if aurPkg := dp.Aur[dep]; aurPkg != nil && pkgSatisfies(aurPkg.Name, aurPkg.Version, dep) {
  26. do.orderPkgAur(aurPkg, dp, true, noDeps, noCheckDeps)
  27. } else if aurPkg := dp.findSatisfierAur(dep); aurPkg != nil {
  28. do.orderPkgAur(aurPkg, dp, true, noDeps, noCheckDeps)
  29. } else if repoPkg := dp.findSatisfierRepo(dep); repoPkg != nil {
  30. do.orderPkgRepo(repoPkg, dp, true)
  31. }
  32. }
  33. return do
  34. }
  35. func (do *Order) orderPkgAur(pkg *aur.Pkg, dp *Pool, runtime, noDeps, noCheckDeps bool) {
  36. if runtime {
  37. do.Runtime.Set(pkg.Name)
  38. }
  39. delete(dp.Aur, pkg.Name)
  40. for i, deps := range ComputeCombinedDepList(pkg, noDeps, noCheckDeps) {
  41. for _, dep := range deps {
  42. if aurPkg := dp.findSatisfierAur(dep); aurPkg != nil {
  43. do.orderPkgAur(aurPkg, dp, runtime && i == 0, noDeps, noCheckDeps)
  44. }
  45. if repoPkg := dp.findSatisfierRepo(dep); repoPkg != nil {
  46. do.orderPkgRepo(repoPkg, dp, runtime && i == 0)
  47. }
  48. }
  49. }
  50. for i, base := range do.Aur {
  51. if base.Pkgbase() == pkg.PackageBase {
  52. do.Aur[i] = append(base, pkg)
  53. return
  54. }
  55. }
  56. do.Aur = append(do.Aur, Base{pkg})
  57. }
  58. func (do *Order) orderPkgRepo(pkg db.IPackage, dp *Pool, runtime bool) {
  59. if runtime {
  60. do.Runtime.Set(pkg.Name())
  61. }
  62. delete(dp.Repo, pkg.Name())
  63. for _, dep := range dp.AlpmExecutor.PackageDepends(pkg) {
  64. if repoPkg := dp.findSatisfierRepo(dep.String()); repoPkg != nil {
  65. do.orderPkgRepo(repoPkg, dp, runtime)
  66. }
  67. }
  68. do.Repo = append(do.Repo, pkg)
  69. }
  70. func (do *Order) HasMake() bool {
  71. lenAur := 0
  72. for _, base := range do.Aur {
  73. lenAur += len(base)
  74. }
  75. return len(do.Runtime) != lenAur+len(do.Repo)
  76. }
  77. func (do *Order) GetMake() []string {
  78. makeOnly := []string{}
  79. for _, base := range do.Aur {
  80. for _, pkg := range base {
  81. if !do.Runtime.Get(pkg.Name) {
  82. makeOnly = append(makeOnly, pkg.Name)
  83. }
  84. }
  85. }
  86. for _, pkg := range do.Repo {
  87. if !do.Runtime.Get(pkg.Name()) {
  88. makeOnly = append(makeOnly, pkg.Name())
  89. }
  90. }
  91. return makeOnly
  92. }
  93. // Print prints repository packages to be downloaded.
  94. func (do *Order) Print() {
  95. repo := ""
  96. repoMake := ""
  97. aurString := ""
  98. aurMake := ""
  99. repoLen := 0
  100. repoMakeLen := 0
  101. aurLen := 0
  102. aurMakeLen := 0
  103. for _, pkg := range do.Repo {
  104. pkgStr := fmt.Sprintf(" %s-%s", pkg.Name(), pkg.Version())
  105. if do.Runtime.Get(pkg.Name()) {
  106. repo += pkgStr
  107. repoLen++
  108. } else {
  109. repoMake += pkgStr
  110. repoMakeLen++
  111. }
  112. }
  113. for _, base := range do.Aur {
  114. pkg := base.Pkgbase()
  115. pkgStr := " " + pkg + "-" + base[0].Version
  116. pkgStrMake := pkgStr
  117. push := false
  118. pushMake := false
  119. switch {
  120. case len(base) > 1, pkg != base[0].Name:
  121. pkgStr += " ("
  122. pkgStrMake += " ("
  123. for _, split := range base {
  124. if do.Runtime.Get(split.Name) {
  125. pkgStr += split.Name + " "
  126. aurLen++
  127. push = true
  128. } else {
  129. pkgStrMake += split.Name + " "
  130. aurMakeLen++
  131. pushMake = true
  132. }
  133. }
  134. pkgStr = pkgStr[:len(pkgStr)-1] + ")"
  135. pkgStrMake = pkgStrMake[:len(pkgStrMake)-1] + ")"
  136. case do.Runtime.Get(base[0].Name):
  137. aurLen++
  138. push = true
  139. default:
  140. aurMakeLen++
  141. pushMake = true
  142. }
  143. if push {
  144. aurString += pkgStr
  145. }
  146. if pushMake {
  147. aurMake += pkgStrMake
  148. }
  149. }
  150. printDownloads("Repo", repoLen, repo)
  151. printDownloads("Repo Make", repoMakeLen, repoMake)
  152. printDownloads("Aur", aurLen, aurString)
  153. printDownloads("Aur Make", aurMakeLen, aurMake)
  154. }
  155. func printDownloads(repoName string, length int, packages string) {
  156. if length < 1 {
  157. return
  158. }
  159. repoInfo := fmt.Sprintf(text.Bold(text.Blue("[%s:%d]")), repoName, length)
  160. fmt.Println(repoInfo + text.Cyan(packages))
  161. }