mirror of
https://github.com/Jguer/yay.git
synced 2025-10-08 00:04:37 -04:00
MakeOnly would be set to true when moving from normal deps to make deps But would incorrectly stay set to true when moving to the deps of the following packages. depOrder.Aur now only holds one package from each base like depCatagories does.
129 lines
2.3 KiB
Go
129 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
alpm "github.com/jguer/go-alpm"
|
|
rpc "github.com/mikkeloscar/aur"
|
|
)
|
|
|
|
func splitDep(dep string) (string, string, string) {
|
|
mod := ""
|
|
|
|
split := strings.FieldsFunc(dep, func(c rune) bool {
|
|
match := c == '>' || c == '<' || c == '='
|
|
|
|
if match {
|
|
mod += string(c)
|
|
}
|
|
|
|
return match
|
|
})
|
|
|
|
if len(split) == 1 {
|
|
return split[0], "", ""
|
|
}
|
|
|
|
return split[0], mod, split[1]
|
|
}
|
|
|
|
func pkgSatisfies(name, version, dep string) bool {
|
|
depName, depMod, depVersion := splitDep(dep)
|
|
|
|
if depName != name {
|
|
return false
|
|
}
|
|
|
|
return verSatisfies(version, depMod, depVersion)
|
|
}
|
|
|
|
func provideSatisfies(provide, dep string) bool {
|
|
depName, depMod, depVersion := splitDep(dep)
|
|
provideName, provideMod, provideVersion := splitDep(provide)
|
|
|
|
if provideName != depName {
|
|
return false
|
|
}
|
|
|
|
// Unversioned provieds can not satisfy a versioned dep
|
|
if provideMod == "" && depMod != "" {
|
|
return false
|
|
}
|
|
|
|
return verSatisfies(provideVersion, depMod, depVersion)
|
|
}
|
|
|
|
func verSatisfies(ver1, mod, ver2 string) bool {
|
|
switch mod {
|
|
case "=":
|
|
return alpm.VerCmp(ver1, ver2) == 0
|
|
case "<":
|
|
return alpm.VerCmp(ver1, ver2) < 0
|
|
case "<=":
|
|
return alpm.VerCmp(ver1, ver2) <= 0
|
|
case ">":
|
|
return alpm.VerCmp(ver1, ver2) > 0
|
|
case ">=":
|
|
return alpm.VerCmp(ver1, ver2) >= 0
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func satisfiesAur(dep string, pkg *rpc.Pkg) bool {
|
|
if pkgSatisfies(pkg.Name, pkg.Version, dep) {
|
|
return true
|
|
}
|
|
|
|
for _, provide := range pkg.Provides {
|
|
if provideSatisfies(provide, dep) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
func satisfiesRepo(dep string, pkg *alpm.Package) bool {
|
|
if pkgSatisfies(pkg.Name(), pkg.Version(), dep) {
|
|
return true
|
|
}
|
|
|
|
if pkg.Provides().ForEach(func(provide alpm.Depend) error {
|
|
if provideSatisfies(provide.String(), dep) {
|
|
return fmt.Errorf("")
|
|
}
|
|
|
|
return nil
|
|
}) != nil {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
//split apart db/package to db and package
|
|
func splitDbFromName(pkg string) (string, string) {
|
|
split := strings.SplitN(pkg, "/", 2)
|
|
|
|
if len(split) == 2 {
|
|
return split[0], split[1]
|
|
}
|
|
return "", split[0]
|
|
}
|
|
|
|
func getBases(pkgs map[string]*rpc.Pkg) map[string][]*rpc.Pkg {
|
|
bases := make(map[string][]*rpc.Pkg)
|
|
|
|
for _, pkg := range pkgs {
|
|
_, ok := bases[pkg.PackageBase]
|
|
if !ok {
|
|
bases[pkg.PackageBase] = make([]*rpc.Pkg, 0)
|
|
}
|
|
bases[pkg.PackageBase] = append(bases[pkg.PackageBase], pkg)
|
|
}
|
|
|
|
return bases
|
|
}
|