depOrder.go 2.3 KB

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