@@ -598,33 +598,37 @@ proc fillPackageTableFromPreferred*(packages: var Table[string, PackageVersions]
598598proc getInstalledMinimalPackages * (options: Options ): seq [PackageMinimalInfo ] =
599599 getInstalledPkgsMin (options.getPkgsDir (), options).mapIt (it.getMinimalInfo (options))
600600
601+ proc getMinimalFromPreferred (pv: PkgTuple , getMinimalPackage: GetPackageMinimal , preferredPackages: seq [PackageMinimalInfo ], options: Options ): seq [PackageMinimalInfo ] =
602+ for pp in preferredPackages:
603+ if pp.name == pv.name and pp.version.withinRange (pv.ver):
604+ return @ [pp]
605+ getMinimalPackage (pv, options)
606+
607+ proc processRequirements (versions: var Table [string , PackageVersions ], pv: PkgTuple , visited: var HashSet [PkgTuple ], getMinimalPackage: GetPackageMinimal , preferredPackages: seq [PackageMinimalInfo ] = newSeq [PackageMinimalInfo ](), options: Options ) =
608+ if pv in visited:
609+ return
610+
611+ visited.incl pv
612+
613+ if not hasVersion (versions, pv):
614+ var pkgMins = getMinimalFromPreferred (pv, getMinimalPackage, preferredPackages, options)
615+ for pkgMin in pkgMins.mitems:
616+ if pv.ver.kind == verSpecial:
617+ pkgMin.version = newVersion $ pv.ver
618+ if not versions.hasKey (pv.name):
619+ versions[pv.name] = PackageVersions (pkgName: pv.name, versions: @ [pkgMin])
620+ else :
621+ versions[pv.name].versions.addUnique pkgMin
622+
623+ # Process requirements
624+ for req in pkgMin.requires:
625+ processRequirements (versions, req, visited, getMinimalPackage, preferredPackages, options)
601626
602627proc collectAllVersions * (versions: var Table [string , PackageVersions ], package: PackageMinimalInfo , options: Options , getMinimalPackage: GetPackageMinimal , preferredPackages: seq [PackageMinimalInfo ] = newSeq [PackageMinimalInfo ]()) =
603- proc getMinimalFromPreferred (pv: PkgTuple ): seq [PackageMinimalInfo ] =
604- for pp in preferredPackages:
605- if pp.name == pv.name and pp.version.withinRange (pv.ver):
606- return @ [pp]
607- # echo "Getting minimal from getMinimalPackage for ", pv.name, " ", $pv.ver
608- getMinimalPackage (pv, options)
609-
610- proc processRequirements (versions: var Table [string , PackageVersions ], pv: PkgTuple ) =
611- if not hasVersion (versions, pv):
612- var pkgMins = getMinimalFromPreferred (pv)
613- for pkgMin in pkgMins.mitems:
614- if pv.ver.kind == verSpecial:
615- pkgMin.version = newVersion $ pv.ver
616- if not versions.hasKey (pv.name):
617- versions[pv.name] = PackageVersions (pkgName: pv.name, versions: @ [pkgMin])
618- else :
619- versions[pv.name].versions.addUnique pkgMin
620-
621- # Process requirements from both the package and GetMinimalPackage results
622- for req in pkgMin.requires:
623- # echo "Processing requirement: ", req.name, " ", $req.ver
624- processRequirements (versions, req)
625628
629+ var visited = initHashSet [PkgTuple ]()
626630 for pv in package.requires:
627- processRequirements (versions, pv)
631+ processRequirements (versions, pv, visited, getMinimalPackage, preferredPackages, options )
628632
629633proc topologicalSort * (solvedPkgs: seq [SolvedPackage ]): seq [SolvedPackage ] =
630634 var inDegree = initTable [string , int ]()
0 commit comments