depOrder.go 3.9 KB

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