depOrder.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package main
  2. import (
  3. // "fmt"
  4. "strconv"
  5. // "strings"
  6. // "sync"
  7. alpm "github.com/jguer/go-alpm"
  8. rpc "github.com/mikkeloscar/aur"
  9. //gopkg "github.com/mikkeloscar/gopkgbuild"
  10. )
  11. type depOrder struct {
  12. Aur []*rpc.Pkg
  13. Repo []*alpm.Package
  14. Runtime stringSet
  15. Bases map[string][]*rpc.Pkg
  16. }
  17. func (do *depOrder) String() string {
  18. str := ""
  19. str += "\n" + red("Repo") + " (" + strconv.Itoa(len(do.Repo)) + ") :"
  20. for _, pkg := range do.Repo {
  21. if do.Runtime.get(pkg.Name()) {
  22. str += " " + pkg.Name()
  23. }
  24. }
  25. str += "\n" + red("Aur") + " (" + strconv.Itoa(len(do.Aur)) + ") :"
  26. for _, pkg := range do.Aur {
  27. if do.Runtime.get(pkg.Name) {
  28. str += " " + pkg.Name
  29. }
  30. }
  31. str += "\n" + red("Repo Make") + " (" + strconv.Itoa(len(do.Repo)) + ") :"
  32. for _, pkg := range do.Repo {
  33. if !do.Runtime.get(pkg.Name()) {
  34. str += " " + pkg.Name()
  35. }
  36. }
  37. str += "\n" + red("Aur Make") + " (" + strconv.Itoa(len(do.Aur)) + ") :"
  38. for _, pkg := range do.Aur {
  39. if !do.Runtime.get(pkg.Name) {
  40. str += " " + pkg.Name
  41. }
  42. }
  43. return str
  44. }
  45. func makeDepOrder() *depOrder {
  46. return &depOrder{
  47. make([]*rpc.Pkg, 0),
  48. make([]*alpm.Package, 0),
  49. make(stringSet),
  50. make(map[string][]*rpc.Pkg, 0),
  51. }
  52. }
  53. func getDepOrder(dp *depPool) *depOrder {
  54. do := makeDepOrder()
  55. for _, target := range dp.Targets {
  56. dep := target.DepString()
  57. aurPkg := dp.findSatisfierAur(dep)
  58. if aurPkg != nil {
  59. do.orderPkgAur(aurPkg, dp, true)
  60. }
  61. repoPkg := dp.findSatisfierRepo(dep)
  62. if repoPkg != nil {
  63. do.orderPkgRepo(repoPkg, dp, true)
  64. }
  65. }
  66. //do.getBases()
  67. return do
  68. }
  69. func (do *depOrder) orderPkgAur(pkg *rpc.Pkg, dp *depPool, runtime bool) {
  70. if runtime {
  71. do.Runtime.set(pkg.Name)
  72. }
  73. if _, ok := do.Bases[pkg.PackageBase]; !ok {
  74. do.Aur = append(do.Aur, pkg)
  75. do.Bases[pkg.PackageBase] = make([]*rpc.Pkg, 0)
  76. }
  77. do.Bases[pkg.PackageBase] = append(do.Bases[pkg.PackageBase], pkg)
  78. delete(dp.Aur, pkg.Name)
  79. for i, deps := range [3][]string{pkg.Depends, pkg.MakeDepends, pkg.CheckDepends} {
  80. for _, dep := range deps {
  81. aurPkg := dp.findSatisfierAur(dep)
  82. if aurPkg != nil {
  83. do.orderPkgAur(aurPkg, dp, runtime && i == 0)
  84. }
  85. repoPkg := dp.findSatisfierRepo(dep)
  86. if repoPkg != nil {
  87. do.orderPkgRepo(repoPkg, dp, runtime && i == 0)
  88. }
  89. }
  90. }
  91. }
  92. func (do *depOrder) orderPkgRepo(pkg *alpm.Package, dp *depPool, runtime bool) {
  93. if runtime {
  94. do.Runtime.set(pkg.Name())
  95. }
  96. do.Repo = append(do.Repo, pkg)
  97. delete(dp.Repo, pkg.Name())
  98. pkg.Depends().ForEach(func(dep alpm.Depend) (err error) {
  99. repoPkg := dp.findSatisfierRepo(dep.String())
  100. if repoPkg != nil {
  101. do.orderPkgRepo(repoPkg, dp, runtime)
  102. }
  103. return nil
  104. })
  105. }
  106. func (do *depOrder) getBases() {
  107. for _, pkg := range do.Aur {
  108. if _, ok := do.Bases[pkg.PackageBase]; !ok {
  109. do.Bases[pkg.PackageBase] = make([]*rpc.Pkg, 0)
  110. }
  111. do.Bases[pkg.PackageBase] = append(do.Bases[pkg.PackageBase], pkg)
  112. }
  113. }
  114. func (do *depOrder) HasMake() bool {
  115. lenAur := 0
  116. for _, base := range do.Bases {
  117. lenAur += len(base)
  118. }
  119. return len(do.Runtime) != lenAur+len(do.Repo)
  120. }
  121. func (do *depOrder) getMake() []string {
  122. makeOnly := make([]string, 0, len(do.Aur)+len(do.Repo)-len(do.Runtime))
  123. for _, base := range do.Bases {
  124. for _, pkg := range base {
  125. if !do.Runtime.get(pkg.Name) {
  126. makeOnly = append(makeOnly, pkg.Name)
  127. }
  128. }
  129. }
  130. for _, pkg := range do.Repo {
  131. if !do.Runtime.get(pkg.Name()) {
  132. makeOnly = append(makeOnly, pkg.Name())
  133. }
  134. }
  135. return makeOnly
  136. }