Save provides separately from pkgnames

Now if `foo` wants to install `bar`

if you do `yay -S foo bar-git` Yay will detect bar is satisfied and not
try to install `bar` as well as `bar-git`.
This commit is contained in:
morganamilo 2018-03-29 06:01:02 +01:00
parent bb9f7a6205
commit 2e7bb5e7a3
No known key found for this signature in database
GPG key ID: 6FE9E7996B0B082E

View file

@ -15,6 +15,7 @@ type depTree struct {
Aur map[string]*rpc.Pkg
Missing stringSet
Groups stringSet
Provides map[string]string
}
type depCatagories struct {
@ -31,6 +32,7 @@ func makeDepTree() *depTree {
make(map[string]*rpc.Pkg),
make(stringSet),
make(stringSet),
make(map[string]string),
}
return &dt
@ -83,7 +85,14 @@ func isDevelName(name string) bool {
func getBases(pkgs map[string]*rpc.Pkg) map[string][]*rpc.Pkg {
bases := make(map[string][]*rpc.Pkg)
nextpkg:
for _, pkg := range pkgs {
for _, base := range bases[pkg.PackageBase] {
if base == pkg {
continue nextpkg
}
}
_, ok := bases[pkg.PackageBase]
if !ok {
bases[pkg.PackageBase] = make([]*rpc.Pkg, 0)
@ -94,6 +103,46 @@ func getBases(pkgs map[string]*rpc.Pkg) map[string][]*rpc.Pkg {
return bases
}
func aurFindProvider(name string, dt *depTree) (string, *rpc.Pkg) {
dep, _ := splitNameFromDep(name)
aurpkg, exists := dt.Aur[dep]
if exists {
return dep, aurpkg
}
dep, exists = dt.Provides[dep]
if exists {
aurpkg, exists = dt.Aur[dep]
if exists {
return dep, aurpkg
}
}
return "", nil
}
func repoFindProvider(name string, dt *depTree) (string, *alpm.Package) {
dep, _ := splitNameFromDep(name)
alpmpkg, exists := dt.Repo[dep]
if exists {
return dep, alpmpkg
}
dep, exists = dt.Provides[dep]
if exists {
alpmpkg, exists = dt.Repo[dep]
if exists {
return dep, alpmpkg
}
}
return "", nil
}
// Step two of dependency resolving. We already have all the information on the
// packages we need, now it's just about ordering them correctly.
// pkgs is a list of targets, the packages we want to install. Dependencies are
@ -132,17 +181,15 @@ func getDepCatagories(pkgs []string, dt *depTree) (*depCatagories, error) {
dc.Bases = getBases(dt.Aur)
for _, pkg := range pkgs {
_, name := splitDbFromName(pkg)
dep, _ := splitNameFromDep(name)
alpmpkg, exists := dt.Repo[dep]
if exists {
dep, alpmpkg := repoFindProvider(pkg, dt)
if alpmpkg != nil {
repoDepCatagoriesRecursive(alpmpkg, dc, dt, false)
dc.Repo = append(dc.Repo, alpmpkg)
delete(dt.Repo, dep)
}
aurpkg, exists := dt.Aur[dep]
if exists {
dep, aurpkg := aurFindProvider(pkg, dt)
if aurpkg != nil {
depCatagoriesRecursive(aurpkg, dc, dt, false, seen)
if !seen.get(aurpkg.PackageBase) {
dc.Aur = append(dc.Aur, aurpkg)
@ -193,9 +240,8 @@ func getDepCatagories(pkgs []string, dt *depTree) (*depCatagories, error) {
func repoDepCatagoriesRecursive(pkg *alpm.Package, dc *depCatagories, dt *depTree, isMake bool) {
pkg.Depends().ForEach(func(_dep alpm.Depend) error {
dep := _dep.Name
alpmpkg, exists := dt.Repo[dep]
if exists {
dep, alpmpkg := repoFindProvider(_dep.Name, dt)
if alpmpkg != nil {
delete(dt.Repo, dep)
repoDepCatagoriesRecursive(alpmpkg, dc, dt, isMake)
@ -213,11 +259,9 @@ func repoDepCatagoriesRecursive(pkg *alpm.Package, dc *depCatagories, dt *depTre
func depCatagoriesRecursive(_pkg *rpc.Pkg, dc *depCatagories, dt *depTree, isMake bool, seen stringSet) {
for _, pkg := range dc.Bases[_pkg.PackageBase] {
for _, deps := range [3][]string{pkg.Depends, pkg.MakeDepends, pkg.CheckDepends} {
for _, _dep := range deps {
dep, _ := splitNameFromDep(_dep)
aurpkg, exists := dt.Aur[dep]
if exists {
for _, pkg := range deps {
dep, aurpkg := aurFindProvider(pkg, dt)
if aurpkg != nil {
delete(dt.Aur, dep)
depCatagoriesRecursive(aurpkg, dc, dt, isMake, seen)
@ -231,8 +275,8 @@ func depCatagoriesRecursive(_pkg *rpc.Pkg, dc *depCatagories, dt *depTree, isMak
}
}
alpmpkg, exists := dt.Repo[dep]
if exists {
dep, alpmpkg := repoFindProvider(pkg, dt)
if alpmpkg != nil {
delete(dt.Repo, dep)
repoDepCatagoriesRecursive(alpmpkg, dc, dt, isMake)
@ -362,9 +406,14 @@ func repoTreeRecursive(pkg *alpm.Package, dt *depTree, localDb *alpm.Db, syncDb
return
}
_, exists = dt.Provides[pkg.Name()]
if exists {
return
}
dt.Repo[pkg.Name()] = pkg
(*pkg).Provides().ForEach(func(dep alpm.Depend) (err error) {
dt.Repo[dep.Name] = pkg
dt.Provides[dep.Name] = pkg.Name()
return nil
})
@ -417,6 +466,10 @@ func depTreeRecursive(dt *depTree, localDb *alpm.Db, syncDb alpm.DbList, isMake
for _, pkg := range info {
dt.Aur[pkg.Name] = pkg
for _, provide := range pkg.Provides {
name, _ := splitNameFromDep(provide)
dt.Provides[name] = pkg.Name
}
}
// Loop through to process and check if we now have
@ -442,6 +495,12 @@ func depTreeRecursive(dt *depTree, localDb *alpm.Db, syncDb alpm.DbList, isMake
continue
}
_, exists = dt.Provides[dep]
// We have it cached so skip.
if exists {
continue
}
_, exists = dt.Repo[dep]
// We have it cached so skip.
if exists {