depOrder.go 2.6 KB

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