2018-05-08 06:06:25 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
|
2019-04-23 17:53:20 +02:00
|
|
|
alpm "github.com/Jguer/go-alpm"
|
2018-05-08 06:06:25 +02:00
|
|
|
rpc "github.com/mikkeloscar/aur"
|
|
|
|
)
|
|
|
|
|
2018-05-10 03:22:21 +02:00
|
|
|
type providers struct {
|
|
|
|
lookfor string
|
|
|
|
Pkgs []*rpc.Pkg
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeProviders(name string) providers {
|
|
|
|
return providers{
|
|
|
|
name,
|
|
|
|
make([]*rpc.Pkg, 0),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (q providers) Len() int {
|
|
|
|
return len(q.Pkgs)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (q providers) Less(i, j int) bool {
|
|
|
|
if q.lookfor == q.Pkgs[i].Name {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
if q.lookfor == q.Pkgs[j].Name {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-10-16 23:02:50 +02:00
|
|
|
return LessRunes([]rune(q.Pkgs[i].Name), []rune(q.Pkgs[j].Name))
|
2018-05-10 03:22:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (q providers) Swap(i, j int) {
|
|
|
|
q.Pkgs[i], q.Pkgs[j] = q.Pkgs[j], q.Pkgs[i]
|
|
|
|
}
|
|
|
|
|
2020-05-02 16:17:20 +02:00
|
|
|
func splitDep(dep string) (pkg, mod, ver string) {
|
2018-05-08 06:06:25 +02:00
|
|
|
split := strings.FieldsFunc(dep, func(c rune) bool {
|
|
|
|
match := c == '>' || c == '<' || c == '='
|
|
|
|
|
|
|
|
if match {
|
|
|
|
mod += string(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
return match
|
|
|
|
})
|
|
|
|
|
2018-08-05 01:25:27 +02:00
|
|
|
if len(split) == 0 {
|
|
|
|
return "", "", ""
|
|
|
|
}
|
|
|
|
|
2018-05-08 06:06:25 +02:00
|
|
|
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
|
|
|
|
}
|
2018-05-08 06:50:52 +02:00
|
|
|
|
2020-05-02 16:17:20 +02:00
|
|
|
// split apart db/package to db and package
|
|
|
|
func splitDBFromName(pkg string) (db, name string) {
|
2018-05-08 06:50:52 +02:00
|
|
|
split := strings.SplitN(pkg, "/", 2)
|
|
|
|
|
|
|
|
if len(split) == 2 {
|
|
|
|
return split[0], split[1]
|
|
|
|
}
|
|
|
|
return "", split[0]
|
|
|
|
}
|
|
|
|
|
2018-08-11 06:46:20 +02:00
|
|
|
func getBases(pkgs []*rpc.Pkg) []Base {
|
2018-08-10 05:40:27 +02:00
|
|
|
basesMap := make(map[string]Base)
|
2018-05-08 06:50:52 +02:00
|
|
|
for _, pkg := range pkgs {
|
2018-08-10 05:40:27 +02:00
|
|
|
basesMap[pkg.PackageBase] = append(basesMap[pkg.PackageBase], pkg)
|
|
|
|
}
|
|
|
|
|
|
|
|
bases := make([]Base, 0, len(basesMap))
|
|
|
|
for _, base := range basesMap {
|
|
|
|
bases = append(bases, base)
|
2018-05-08 06:50:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return bases
|
|
|
|
}
|
2018-05-19 07:07:58 +02:00
|
|
|
|
|
|
|
func isDevelName(name string) bool {
|
|
|
|
for _, suffix := range []string{"git", "svn", "hg", "bzr", "nightly"} {
|
2018-05-29 23:35:58 +02:00
|
|
|
if strings.HasSuffix(name, "-"+suffix) {
|
2018-05-19 07:07:58 +02:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return strings.Contains(name, "-always-")
|
|
|
|
}
|
2020-03-14 21:30:27 +01:00
|
|
|
|
|
|
|
func isDevelPackage(pkg alpm.Package) bool {
|
|
|
|
return isDevelName(pkg.Name()) || isDevelName(pkg.Base())
|
|
|
|
}
|