depOrder.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package main
  2. import (
  3. alpm "github.com/Jguer/go-alpm"
  4. rpc "github.com/mikkeloscar/aur"
  5. "github.com/Jguer/yay/v9/pkg/stringset"
  6. )
  7. // Base is an AUR base package
  8. type Base []*rpc.Pkg
  9. // Pkgbase returns the first base package.
  10. func (b Base) Pkgbase() string {
  11. return b[0].PackageBase
  12. }
  13. // Version returns the first base package version.
  14. func (b Base) Version() string {
  15. return b[0].Version
  16. }
  17. // URLPath returns the first base package URL.
  18. func (b Base) URLPath() string {
  19. return b[0].URLPath
  20. }
  21. type depOrder struct {
  22. Aur []Base
  23. Repo []*alpm.Package
  24. Runtime stringset.StringSet
  25. }
  26. func makeDepOrder() *depOrder {
  27. return &depOrder{
  28. make([]Base, 0),
  29. make([]*alpm.Package, 0),
  30. make(stringset.StringSet),
  31. }
  32. }
  33. func getDepOrder(dp *depPool) *depOrder {
  34. do := makeDepOrder()
  35. for _, target := range dp.Targets {
  36. dep := target.DepString()
  37. aurPkg := dp.Aur[dep]
  38. if aurPkg != nil && pkgSatisfies(aurPkg.Name, aurPkg.Version, dep) {
  39. do.orderPkgAur(aurPkg, dp, true)
  40. }
  41. aurPkg = dp.findSatisfierAur(dep)
  42. if aurPkg != nil {
  43. do.orderPkgAur(aurPkg, dp, true)
  44. }
  45. repoPkg := dp.findSatisfierRepo(dep)
  46. if repoPkg != nil {
  47. do.orderPkgRepo(repoPkg, dp, true)
  48. }
  49. }
  50. return do
  51. }
  52. func (do *depOrder) orderPkgAur(pkg *rpc.Pkg, dp *depPool, runtime bool) {
  53. if runtime {
  54. do.Runtime.Set(pkg.Name)
  55. }
  56. delete(dp.Aur, pkg.Name)
  57. for i, deps := range [3][]string{pkg.Depends, pkg.MakeDepends, pkg.CheckDepends} {
  58. for _, dep := range deps {
  59. aurPkg := dp.findSatisfierAur(dep)
  60. if aurPkg != nil {
  61. do.orderPkgAur(aurPkg, dp, runtime && i == 0)
  62. }
  63. repoPkg := dp.findSatisfierRepo(dep)
  64. if repoPkg != nil {
  65. do.orderPkgRepo(repoPkg, dp, runtime && i == 0)
  66. }
  67. }
  68. }
  69. for i, base := range do.Aur {
  70. if base.Pkgbase() == pkg.PackageBase {
  71. do.Aur[i] = append(base, pkg)
  72. return
  73. }
  74. }
  75. do.Aur = append(do.Aur, Base{pkg})
  76. }
  77. func (do *depOrder) orderPkgRepo(pkg *alpm.Package, dp *depPool, runtime bool) {
  78. if runtime {
  79. do.Runtime.Set(pkg.Name())
  80. }
  81. delete(dp.Repo, pkg.Name())
  82. _ = pkg.Depends().ForEach(func(dep alpm.Depend) (err error) {
  83. repoPkg := dp.findSatisfierRepo(dep.String())
  84. if repoPkg != nil {
  85. do.orderPkgRepo(repoPkg, dp, runtime)
  86. }
  87. return nil
  88. })
  89. do.Repo = append(do.Repo, pkg)
  90. }
  91. func (do *depOrder) HasMake() bool {
  92. lenAur := 0
  93. for _, base := range do.Aur {
  94. lenAur += len(base)
  95. }
  96. return len(do.Runtime) != lenAur+len(do.Repo)
  97. }
  98. func (do *depOrder) getMake() []string {
  99. makeOnly := []string{}
  100. for _, base := range do.Aur {
  101. for _, pkg := range base {
  102. if !do.Runtime.Get(pkg.Name) {
  103. makeOnly = append(makeOnly, pkg.Name)
  104. }
  105. }
  106. }
  107. for _, pkg := range do.Repo {
  108. if !do.Runtime.Get(pkg.Name()) {
  109. makeOnly = append(makeOnly, pkg.Name())
  110. }
  111. }
  112. return makeOnly
  113. }