depOrder.go 4.0 KB

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