depOrder.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 []*rpc.Pkg
  8. Repo []*alpm.Package
  9. Runtime stringSet
  10. Bases map[string][]*rpc.Pkg
  11. }
  12. func makeDepOrder() *depOrder {
  13. return &depOrder{
  14. make([]*rpc.Pkg, 0),
  15. make([]*alpm.Package, 0),
  16. make(stringSet),
  17. make(map[string][]*rpc.Pkg),
  18. }
  19. }
  20. func getDepOrder(dp *depPool) *depOrder {
  21. do := makeDepOrder()
  22. for _, target := range dp.Targets {
  23. dep := target.DepString()
  24. aurPkg := dp.findSatisfierAur(dep)
  25. if aurPkg != nil {
  26. do.orderPkgAur(aurPkg, dp, true)
  27. }
  28. repoPkg := dp.findSatisfierRepo(dep)
  29. if repoPkg != nil {
  30. do.orderPkgRepo(repoPkg, dp, true)
  31. }
  32. }
  33. return do
  34. }
  35. func (do *depOrder) orderPkgAur(pkg *rpc.Pkg, dp *depPool, runtime bool) {
  36. if runtime {
  37. do.Runtime.set(pkg.Name)
  38. }
  39. if _, ok := do.Bases[pkg.PackageBase]; !ok {
  40. do.Aur = append(do.Aur, pkg)
  41. do.Bases[pkg.PackageBase] = make([]*rpc.Pkg, 0)
  42. }
  43. do.Bases[pkg.PackageBase] = append(do.Bases[pkg.PackageBase], pkg)
  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. }
  58. func (do *depOrder) orderPkgRepo(pkg *alpm.Package, dp *depPool, runtime bool) {
  59. if runtime {
  60. do.Runtime.set(pkg.Name())
  61. }
  62. do.Repo = append(do.Repo, pkg)
  63. delete(dp.Repo, pkg.Name())
  64. pkg.Depends().ForEach(func(dep alpm.Depend) (err error) {
  65. repoPkg := dp.findSatisfierRepo(dep.String())
  66. if repoPkg != nil {
  67. do.orderPkgRepo(repoPkg, dp, runtime)
  68. }
  69. return nil
  70. })
  71. }
  72. func (do *depOrder) HasMake() bool {
  73. lenAur := 0
  74. for _, base := range do.Bases {
  75. lenAur += len(base)
  76. }
  77. return len(do.Runtime) != lenAur+len(do.Repo)
  78. }
  79. func (do *depOrder) getMake() []string {
  80. makeOnly := make([]string, 0, len(do.Aur)+len(do.Repo)-len(do.Runtime))
  81. for _, base := range do.Bases {
  82. for _, pkg := range base {
  83. if !do.Runtime.get(pkg.Name) {
  84. makeOnly = append(makeOnly, pkg.Name)
  85. }
  86. }
  87. }
  88. for _, pkg := range do.Repo {
  89. if !do.Runtime.get(pkg.Name()) {
  90. makeOnly = append(makeOnly, pkg.Name())
  91. }
  92. }
  93. return makeOnly
  94. }