Преглед на файлове

Merge pull request #301 from Morganamilo/fix#279

Save provides seperatly from pkgnames
J Guerreiro преди 7 години
родител
ревизия
5bf291b3a3
променени са 1 файла, в които са добавени 76 реда и са изтрити 17 реда
  1. 76 17
      dependencies.go

+ 76 - 17
dependencies.go

@@ -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 {