dep.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package dep
  2. import (
  3. "strings"
  4. "github.com/Jguer/yay/v12/pkg/db"
  5. aur "github.com/Jguer/yay/v12/pkg/query"
  6. )
  7. func splitDep(dep string) (pkg, mod, ver string) {
  8. split := strings.FieldsFunc(dep, func(c rune) bool {
  9. match := c == '>' || c == '<' || c == '='
  10. if match {
  11. mod += string(c)
  12. }
  13. return match
  14. })
  15. if len(split) == 0 {
  16. return "", "", ""
  17. }
  18. if len(split) == 1 {
  19. return split[0], "", ""
  20. }
  21. return split[0], mod, split[1]
  22. }
  23. func pkgSatisfies(name, version, dep string) bool {
  24. depName, depMod, depVersion := splitDep(dep)
  25. if depName != name {
  26. return false
  27. }
  28. return verSatisfies(version, depMod, depVersion)
  29. }
  30. func provideSatisfies(provide, dep, pkgVersion string) bool {
  31. depName, depMod, depVersion := splitDep(dep)
  32. provideName, provideMod, provideVersion := splitDep(provide)
  33. if provideName != depName {
  34. return false
  35. }
  36. // Unversioned provides can not satisfy a versioned dep
  37. if provideMod == "" && depMod != "" {
  38. provideVersion = pkgVersion // Example package: pagure
  39. }
  40. return verSatisfies(provideVersion, depMod, depVersion)
  41. }
  42. func verSatisfies(ver1, mod, ver2 string) bool {
  43. switch mod {
  44. case "=":
  45. return db.VerCmp(ver1, ver2) == 0
  46. case "<":
  47. return db.VerCmp(ver1, ver2) < 0
  48. case "<=":
  49. return db.VerCmp(ver1, ver2) <= 0
  50. case ">":
  51. return db.VerCmp(ver1, ver2) > 0
  52. case ">=":
  53. return db.VerCmp(ver1, ver2) >= 0
  54. }
  55. return true
  56. }
  57. func satisfiesAur(dep string, pkg *aur.Pkg) bool {
  58. if pkgSatisfies(pkg.Name, pkg.Version, dep) {
  59. return true
  60. }
  61. for _, provide := range pkg.Provides {
  62. if provideSatisfies(provide, dep, pkg.Version) {
  63. return true
  64. }
  65. }
  66. return false
  67. }