diff --git a/src/bpmlib/dependencies.go b/src/bpmlib/dependencies.go index 26c6a2c..21b22e4 100644 --- a/src/bpmlib/dependencies.go +++ b/src/bpmlib/dependencies.go @@ -113,13 +113,16 @@ func (pkgInfo *PackageInfo) getDependenciesRecursive(resolved *[]string, unresol *unresolved = stringSliceRemove(*unresolved, pkgInfo.Name) } -func ResolveAllPackageDependenciesFromDatabases(pkgInfo *PackageInfo, checkMake, checkRuntime, checkOptional, ignoreInstalled, verbose bool, rootDir string) (resolved []pkgInstallationReason, unresolved []string) { - // Initialize slices +func ResolveAllPackageDependenciesFromDatabases(pkgInfo *PackageInfo, resolvedVirtualPkgs map[string]string, checkMake, checkRuntime, checkOptional, ignoreInstalled, verbose bool, rootDir string) (resolved []pkgInstallationReason, unresolved []string) { + // Initialize slices and maps resolved = make([]pkgInstallationReason, 0) unresolved = make([]string, 0) + if resolvedVirtualPkgs == nil { + resolvedVirtualPkgs = make(map[string]string) + } // Call unexported function - resolvePackageDependenciesFromDatabase(&resolved, &unresolved, pkgInfo, checkMake, checkRuntime, checkOptional, ignoreInstalled, verbose, rootDir) + resolvePackageDependenciesFromDatabase(&resolved, &unresolved, resolvedVirtualPkgs, pkgInfo, checkMake, checkRuntime, checkOptional, ignoreInstalled, verbose, rootDir) // Remove main package from unresolved slice unresolved = stringSliceRemove(unresolved, pkgInfo.Name) @@ -127,10 +130,16 @@ func ResolveAllPackageDependenciesFromDatabases(pkgInfo *PackageInfo, checkMake, return resolved, unresolved } -func resolvePackageDependenciesFromDatabase(resolved *[]pkgInstallationReason, unresolved *[]string, pkgInfo *PackageInfo, checkMake, checkRuntime, checkOptional, ignoreInstalled, verbose bool, rootDir string) { +func resolvePackageDependenciesFromDatabase(resolved *[]pkgInstallationReason, unresolved *[]string, resolvedVirtualPkgs map[string]string, pkgInfo *PackageInfo, checkMake, checkRuntime, checkOptional, ignoreInstalled, verbose bool, rootDir string) { // Add current package name to unresolved slice *unresolved = append(*unresolved, pkgInfo.Name) + for _, vpkg := range pkgInfo.Provides { + if _, ok := resolvedVirtualPkgs[vpkg]; !ok { + resolvedVirtualPkgs[vpkg] = pkgInfo.Name + } + } + // Loop through all dependencies for _, pkgIR := range pkgInfo.GetDependencies(pkgInfo.Type == "source", checkRuntime, checkOptional) { // Skip dependency if it has already been resolved @@ -163,7 +172,25 @@ func resolvePackageDependenciesFromDatabase(resolved *[]pkgInstallationReason, u var entry *BPMDatabaseEntry entry, _, err = GetDatabaseEntry(pkgIR.PkgName) if err != nil { - if entry = ResolveVirtualPackage(pkgIR.PkgName); entry == nil { + if resolvedVirtualPkg, ok := resolvedVirtualPkgs[pkgIR.PkgName]; ok { + // Virtual package already resolved + + // Move dependency from the unresolved slice to the resolved slice + if !slices.ContainsFunc(*resolved, func(p pkgInstallationReason) bool { + return p.PkgName == resolvedVirtualPkg + }) { + *resolved = append(*resolved, pkgInstallationReason{ + PkgName: resolvedVirtualPkg, + InstallationReason: pkgIR.InstallationReason, + }) + } + *unresolved = stringSliceRemove(*unresolved, resolvedVirtualPkg) + + continue + } else if entry = ResolveVirtualPackage(pkgIR.PkgName); entry != nil { + // Virtual package found in database + } else { + // Virtual package not found if !slices.Contains(*unresolved, pkgIR.PkgName) { *unresolved = append(*unresolved, pkgIR.PkgName) } @@ -172,7 +199,7 @@ func resolvePackageDependenciesFromDatabase(resolved *[]pkgInstallationReason, u } // Resolve the dependencies of this dependency - resolvePackageDependenciesFromDatabase(resolved, unresolved, entry.Info, checkMake, checkRuntime, false, ignoreInstalled, verbose, rootDir) + resolvePackageDependenciesFromDatabase(resolved, unresolved, resolvedVirtualPkgs, entry.Info, checkMake, checkRuntime, false, ignoreInstalled, verbose, rootDir) // Move dependency from the unresolved slice to the resolved slice if !slices.ContainsFunc(*resolved, func(p pkgInstallationReason) bool { diff --git a/src/bpmlib/operations.go b/src/bpmlib/operations.go index 6ed2372..401295a 100644 --- a/src/bpmlib/operations.go +++ b/src/bpmlib/operations.go @@ -132,6 +132,7 @@ func (operation *BPMOperation) GetFinalActionSize(rootDir string) int64 { func (operation *BPMOperation) ResolveDependencies(reinstallDependencies, installRuntimeDependencies, installOptionalDependencies, verbose bool) error { pos := 0 + resolvedVirtualPkgs := make(map[string]string, 0) for _, value := range slices.Clone(operation.Actions) { var pkgInfo *PackageInfo if value.GetActionType() == "install" { @@ -145,7 +146,7 @@ func (operation *BPMOperation) ResolveDependencies(reinstallDependencies, instal continue } - resolved, unresolved := ResolveAllPackageDependenciesFromDatabases(pkgInfo, pkgInfo.Type == "source", installRuntimeDependencies, installOptionalDependencies, !reinstallDependencies, verbose, operation.RootDir) + resolved, unresolved := ResolveAllPackageDependenciesFromDatabases(pkgInfo, resolvedVirtualPkgs, pkgInfo.Type == "source", installRuntimeDependencies, installOptionalDependencies, !reinstallDependencies, verbose, operation.RootDir) operation.UnresolvedDepends = append(operation.UnresolvedDepends, unresolved...)