depOrder.go 4.0 KB

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