@@ -216,6 +216,7 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
216216 let exploredPackages = Dictionary< PackageName* SemVerInfo, ResolvedPackage>()
217217 let conflictHistory = Dictionary< PackageName, int>()
218218 let knownConflicts = HashSet<_>()
219+ let tryRelaxed = ref false
219220
220221 let getExploredPackage ( dependency : PackageRequirement ,( version , preferredSource , packageSources )) =
221222 let key = dependency.Name, version
@@ -268,7 +269,7 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
268269 exploredPackages.Add( key, explored)
269270 explored
270271
271- let rec step ( filteredVersions : Map < PackageName , (( SemVerInfo * PackageSource option * PackageSource list ) list * bool )>, currentResolution : Map < PackageName , ResolvedPackage >, closedRequirements : Set < PackageRequirement >, openRequirements : Set < PackageRequirement >) =
272+ let rec step ( relax , filteredVersions : Map < PackageName , (( SemVerInfo * PackageSource option * PackageSource list ) list * bool )>, currentResolution : Map < PackageName , ResolvedPackage >, closedRequirements : Set < PackageRequirement >, openRequirements : Set < PackageRequirement >) =
272273 if Set.isEmpty openRequirements then Resolution.Ok( cleanupNames currentResolution) else
273274 verbosefn " %d packages in resolution. %d requirements left" currentResolution.Count openRequirements.Count
274275
@@ -391,8 +392,11 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
391392 Seq.filter ( fun ( v , _ , _ ) -> currentRequirement.VersionRequirement.IsInRange( v, currentRequirement.Parent.IsRootRequirement() |> not )) versions
392393
393394 if Seq.isEmpty ! compatibleVersions then
394- compatibleVersions :=
395- Seq.filter ( fun ( v , _ , _ ) -> currentRequirement.IncludingPrereleases() .VersionRequirement.IsInRange( v, currentRequirement.Parent.IsRootRequirement() |> not )) versions
395+ if relax then
396+ compatibleVersions :=
397+ Seq.filter ( fun ( v , _ , _ ) -> currentRequirement.IncludingPrereleases() .VersionRequirement.IsInRange( v, currentRequirement.Parent.IsRootRequirement() |> not )) versions
398+ else
399+ tryRelaxed := true
396400
397401 if Seq.isEmpty ! compatibleVersions then
398402 // boost the conflicting package, in order to solve conflicts faster
@@ -454,7 +458,7 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
454458 let newOpen = calcOpenRequirements( exploredPackage, globalFrameworkRestrictions, versionToExplore, currentRequirement, closedRequirements, openRequirements)
455459 let newResolution = Map.add exploredPackage.Name exploredPackage currentResolution
456460
457- state := step ( newFilteredVersions, newResolution, Set.add currentRequirement closedRequirements, newOpen)
461+ state := step ( relax , newFilteredVersions, newResolution, Set.add currentRequirement closedRequirements, newOpen)
458462 match ! state with
459463 | Resolution.Conflict (_,_, stillOpen,_,_)
460464 when stillOpen |> Set.exists ( fun r -> r = currentRequirement || r.Graph |> List.contains currentRequirement) |> not ->
@@ -467,6 +471,14 @@ let Resolve(groupName:GroupName, sources, getVersionsF, getPackageDetailsF, stra
467471
468472 match tryToImprove false with
469473 | true , Resolution.Conflict(_) -> tryToImprove true |> snd
470- | _, x-> x
471-
472- step ( Map.empty, Map.empty, Set.empty, rootDependencies)
474+ | _, x -> x
475+
476+ match step ( false , Map.empty, Map.empty, Set.empty, rootDependencies) with
477+ | Resolution.Conflict(_) as conflict ->
478+ if ! tryRelaxed then
479+ conflictHistory.Clear()
480+ knownConflicts.Clear() |> ignore
481+ step ( true , Map.empty, Map.empty, Set.empty, rootDependencies)
482+ else
483+ conflict
484+ | x -> x
0 commit comments