@@ -125,8 +125,13 @@ proc getMinimalInfo*(nimbleFile: string, pkgName: string, options: Options): Pac
125125
126126proc hasVersion * (packageVersions: PackageVersions , pv: PkgTuple ): bool =
127127 for pkg in packageVersions.versions:
128- if pkg.name == pv.name and pkg.version.withinRange (pv.ver):
129- return true
128+ if pkg.name == pv.name:
129+ # Special versions must match exactly for collection purposes
130+ if pv.ver.kind == verSpecial:
131+ return $ pkg.version == $ pv.ver
132+ # Regular version ranges
133+ elif pkg.version.withinRange (pv.ver):
134+ return true
130135 false
131136
132137proc hasVersion * (packagesVersions: Table [string , PackageVersions ], pv: PkgTuple ): bool =
@@ -657,21 +662,31 @@ proc getMinimalFromPreferred(pv: PkgTuple, getMinimalPackage: GetPackageMinimal
657662 return @ [pp]
658663 getMinimalPackage (pv, options)
659664
660- proc processRequirements (versions: var Table [string , PackageVersions ], pv: PkgTuple , visited: var HashSet [PkgTuple ], getMinimalPackage: GetPackageMinimal , preferredPackages: seq [PackageMinimalInfo ] = newSeq [PackageMinimalInfo ](), options: Options ) =
665+ proc processRequirements (versions: var Table [string , PackageVersions ], pv: PkgTuple , visited: var HashSet [PkgTuple ], getMinimalPackage: GetPackageMinimal , preferredPackages: seq [PackageMinimalInfo ] = newSeq [PackageMinimalInfo ](), options: Options ) =
661666 if pv in visited:
662667 return
663668
664669 visited.incl pv
665670
666- if not hasVersion (versions, pv):
671+ # For special versions, always process them even if we think we have the package
672+ # This ensures the special version gets downloaded and added to the version table
673+ if pv.ver.kind == verSpecial or not hasVersion (versions, pv):
667674 var pkgMins = getMinimalFromPreferred (pv, getMinimalPackage, preferredPackages, options)
668675 for pkgMin in pkgMins.mitems:
669676 if pv.ver.kind == verSpecial:
670677 pkgMin.version = newVersion $ pv.ver
671- if not versions.hasKey (pv.name):
672- versions[pv.name] = PackageVersions (pkgName: pv.name, versions: @ [pkgMin])
678+
679+ # If this is a special version, clear any existing regular versions
680+ # to force the SAT solver to use this specific version
681+ if versions.hasKey (pv.name):
682+ versions[pv.name].versions = @ [pkgMin]
683+ else :
684+ versions[pv.name] = PackageVersions (pkgName: pv.name, versions: @ [pkgMin])
673685 else :
674- versions[pv.name].versions.addUnique pkgMin
686+ if not versions.hasKey (pv.name):
687+ versions[pv.name] = PackageVersions (pkgName: pv.name, versions: @ [pkgMin])
688+ else :
689+ versions[pv.name].versions.addUnique pkgMin
675690
676691 for req in pkgMin.requires:
677692 processRequirements (versions, req, visited, getMinimalPackage, preferredPackages, options)
0 commit comments