Skip to content

Commit 0369f5d

Browse files
committed
Fix incorrect package dependencies graph resolution with prereleases - fixes #1359
1 parent ce69154 commit 0369f5d

5 files changed

Lines changed: 35 additions & 9 deletions

File tree

‎RELEASE_NOTES.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#### 2.41.2 - 10.01.2016
2+
* BUGFIX: Incorrect package dependencies graph resolution with prereleases - https://github.com/fsprojects/Paket/pull/1359
3+
14
#### 2.41.1 - 07.01.2016
25
* BUGFIX: NuGetV2: avoid revealing password also if more than one source is defined - https://github.com/fsprojects/Paket/pull/1357
36

‎integrationtests/Paket.IntegrationTests/BasicResolverSpecs.fs‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,10 @@ let ``#1254 should install unlisted transitive dependencies``() =
124124
let lockFile = update "i001254-unlisted"
125125
lockFile.Groups.[Constants.MainDependencyGroup].Resolution.[PackageName "WebActivator"].Version
126126
|> shouldEqual (SemVer.Parse "1.5.3")
127+
128+
[<Test>]
129+
let ``#1359 should resolve sound prerelease``() =
130+
let lockFile = update "i001359-wrong-prerelease"
131+
let v = lockFile.Groups.[Constants.MainDependencyGroup].Resolution.[PackageName "Aether"].Version
132+
v |> shouldBeGreaterThan (SemVer.Parse "7.0.1")
133+
v |> shouldBeSmallerThan (SemVer.Parse "8")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
source https://www.nuget.org/api/v2
2+
3+
nuget Freya.Router
4+
nuget Chiron

‎src/Paket.Core/PackageResolver.fs‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

‎src/Paket/Paket.fsproj‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
<StartArguments>pack output D:\code\paketbug\output</StartArguments>
3939
<StartArguments>install</StartArguments>
4040
<StartArguments>restore</StartArguments>
41-
<StartArguments>pack output "D:\code\paket-issue-repro\B\bin"</StartArguments>
41+
<StartArguments>update</StartArguments>
4242
<StartAction>Project</StartAction>
4343
<StartProgram>paket.exe</StartProgram>
4444
<StartWorkingDirectory>c:\code\Paketkopie</StartWorkingDirectory>
@@ -48,7 +48,7 @@
4848
<StartWorkingDirectory>d:\code\paketrepro</StartWorkingDirectory>
4949
<StartWorkingDirectory>D:\code\Paket\integrationtests\scenarios\i001270-net461\temp</StartWorkingDirectory>
5050
<StartWorkingDirectory>C:\code\restore</StartWorkingDirectory>
51-
<StartWorkingDirectory>D:\code\paket-issue-repro\B</StartWorkingDirectory>
51+
<StartWorkingDirectory>D:\code\Paket\integrationtests\scenarios\i001359-wrong-prerelease\temp</StartWorkingDirectory>
5252
</PropertyGroup>
5353
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
5454
<DebugType>pdbonly</DebugType>

0 commit comments

Comments
 (0)